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 767981 766554 2026-06-18T11:48:46Z PandaMystique 119061 767981 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 constitue l'ouverture du chef-d'œuvre métaphysique de Descartes et pose les fondations de tout l'édifice philosophique qui suivra. Son titre, « Des choses que l'on peut révoquer en doute », annonce d'emblée le projet : il ne s'agit pas d'établir des vérités, mais de mettre à l'épreuve tout ce que l'on tient pour vrai. Cette méditation inaugure ce qu'on appellera le « doute méthodique » ou « doute hyperbolique », une démarche philosophique novatrice dont l'influence sur l'ensemble de la philosophie moderne est considérable. Le projet cartésien doit être situé dans son contexte intellectuel. Au {{sc|xvii}}<sup>e</sup> siècle, la science nouvelle (celle de Galilée et de Kepler) ébranle les certitudes héritées de la scolastique médiévale. Face à ce bouleversement des savoirs traditionnels, Descartes entreprend de refonder l'ensemble des connaissances humaines sur des fondements absolument certains. La Première Méditation en représente le moment négatif, destructeur : avant de reconstruire, il faut d'abord faire table rase. La structure argumentative de cette méditation est remarquablement rigoureuse. Elle procède par étapes successives, chaque niveau de doute englobant et dépassant le précédent. On peut distinguer cinq moments principaux : l'exposition du projet (§ 1-2), le doute portant sur les sens (§ 3-4), l'argument du rêve (§ 5-7), la distinction entre sciences composées et sciences simples (§ 8-9), et enfin l'hypothèse du Dieu trompeur puis du malin génie (§ 10-14). Cette progression conduit à une suspension totale du jugement, préparant ainsi le terrain pour la découverte du ''cogito'' dans la Seconde Méditation. == I. Le projet de refondation du savoir (§ 1-2) == === A. La genèse autobiographique du doute === ==== 1. L'incipit des ''Méditations'' : une ouverture singulière ==== <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> La Première Méditation s’ouvre sur cet aveu : un sujet découvre rétrospectivement que son éducation et ses premières habitudes de pensée ont mêlé le vrai et le faux, et que tout ce qui a été construit sur cette base chancelle. Hegel a fait de cet incipit un jalon majeur de la philosophie moderne. Commentant ce passage, il écrit que, lorsqu’on remonte l’histoire de la philosophie ancienne et médiévale jusqu’à Descartes, on se sent « comme un marin sur une mer agitée qui peut enfin crier “Terre !” »<ref>G. W. F. Hegel, ''Vorlesungen über die Geschichte der Philosophie'', vol. 3, Francfort, Suhrkamp, 1971 ; trad. anglaise : ''Lectures on the History of Philosophy'', vol. 3, trad. Haldane et Simson, Londres, Kegan Paul, 1896. Cité 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>. Il faut toutefois éviter de prêter à Descartes, dès cette première page, une thèse déjà fixée sur la fausseté de toutes ses opinions : ce qu’il inaugure, c’est une discipline du jugement. Le doute cartésien ne consiste pas à remplacer des croyances par leur contraire, mais à suspendre l’assentiment partout où une raison de douter est disponible, afin de ne conserver, à terme, que ce qui résiste. Dans cette perspective, Descartes met provisoirement entre parenthèses ce qui vient des sens, puis étend l’épreuve jusqu’aux certitudes les plus générales en envisageant, à titre d’hypothèse, un Dieu trompeur ou un malin génie : non pour « rejeter » Dieu, mais pour tester si la garantie divine est déjà requise, ou si la pensée peut d’abord trouver en elle-même un point d’appui qui ne présuppose rien. Cette ouverture frappe aussi par sa singularité de ton. Là où beaucoup de traités commencent par des définitions ou des principes, Descartes part d’un constat à la première personne : « je me suis aperçu ». Le philosophe ne parle ni de l’homme en général ni d’une condition humaine abstraite ; il évoque une histoire intellectuelle située, une prise de conscience datable, et il invite le lecteur à entrer dans le mouvement même de cette conversion. Cette dimension autobiographique n’a donc rien d’un simple ornement : elle fait partie de la méthode. Le savoir à fonder doit être mien au sens le plus strict, c’est-à-dire assumé dans l’acte même où je juge, plutôt que reçu par imitation, par tradition ou par déférence. Pourquoi ce choix ? Comme l’observe Charles Larmore dans son analyse de la Première Méditation, le « je » des ''Méditations'' n’est pas seulement René Descartes ; c’est un méditant exemplaire, une figure que chaque lecteur est invité à endosser<ref>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-68. Voir également du même auteur : « Descartes and skepticism », dans Stephen Gaukroger (dir.), ''The Blackwell Guide to Descartes' Meditations'', Oxford, Blackwell, 2006, p. 17-29.</ref>. L’autobiographie devient alors une mise en situation : ce que Descartes raconte de lui-même, chacun peut être amené à le reconnaître en soi. La découverte de l’erreur n’apparaît plus comme une mésaventure individuelle ; elle prend la forme d’une expérience typique, attachée à notre manière ordinaire d’apprendre, de croire et de nous fier aux apparences. En ce sens, l’ouverture des ''Méditations'' ne propose pas une confession intime : elle institue une position de lecture, et fait de la vigilance envers ses propres raisons de croire la condition d’un commencement véritable. ==== 2. Le diagnostic : l'erreur comme condition structurelle de l'enfance ==== L’expression « dès mes premières années » (''ineunte ætate'' en latin) est déterminante. Elle situe l’origine de l’erreur non dans un accident isolé, mais dans l’économie même de notre développement intellectuel. L’enfance n’est pas seulement une période de la vie ; c’est le moment où se forment des habitudes de jugement qui, une fois installées, deviennent difficiles à déraciner. Descartes explicite 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, ''Routledge Philosophy GuideBook to Descartes and the Meditations'', Londres, Routledge, 2003 (désigné ci-après ''Descartes and the Meditations''), p. 89-90.</ref>. L’idée directrice n’est pas que l’enfant serait “moins intelligent”, mais que son esprit est d’abord étroitement lié au corps et aux sens : il vit dans l’urgence des besoins, il se règle sur ce qui affecte, attire, repousse, fait plaisir ou fait mal. Or cette situation produit des erreurs typiques, non parce que l’enfant ment ou raisonne mal, mais parce qu’il juge trop vite, avec des instruments encore mal réglés. En premier lieu, l’enfant forme des jugements spontanés à partir de ses sensations. Il croit naturellement que les qualités qu’il éprouve (couleurs, sons, saveurs, chaleur, froid) existent dans les choses telles qu’il les ressent. Descartes vise ici ce qu’on peut appeler une thèse de la ressemblance : nous prêtons aux objets extérieurs des propriétés qui “correspondraient” à nos sensations, comme si l’expérience sensible était une copie fidèle des choses<ref>Descartes, ''Meditationes'', VI, AT VII, p. 82 ; ''Principia philosophiae'', I, art. 71, AT VIII-A, p. 35. Cf. Gary Hatfield, ''Descartes and the Meditations'', op. cit., p. 269-270.</ref>. Or, pour Descartes, cette projection est trompeuse : ce que nous appelons couleur ou saveur n’est pas une qualité “dans” la chose au même sens que l’étendue ou la figure, mais un effet produit en nous par l’action des corps sur nos organes et, par leur intermédiaire, sur l’esprit. Autrement dit, l’erreur ne vient pas du fait que nous sentons, mais du fait que nous transformons sans examen ce sentir en jugement sur la constitution des choses. En second lieu, l’enfant tend à croire que seul est réel ce qui est sensible. Comme il se rapporte principalement à ce qui peut nourrir, blesser, protéger ou menacer, il ne donne de consistance qu’aux objets qui tombent sous les sens. Ce qui n’est pas perceptible lui paraît vide, et cette habitude peut persister à l’âge adulte : on finit alors par tenir pour “réel” seulement ce qui est corporel et mesurable, ce qui rend plus difficile la pensée d’êtres immatériels, comme l’âme ou Dieu<ref>Descartes, ''Principia philosophiae'', I, art. 71, AT VIII-A, p. 35-36 : l'esprit, jugeant qu'il n'y a rien dans les lieux où il ne sent rien, en vient à nier l'existence de ce qui ne tombe pas sous les sens.</ref>. En troisième lieu, et c’est un mécanisme crucial, l’enfant devenu adulte oublie la genèse de ses opinions. Les croyances prises autrefois “sur parole” ou “par entraînement” se présentent ensuite comme des évidences naturelles. Descartes formule explicitement ce phénomène dans les ''Principes'' : dès l’enfance, l’esprit s’est trouvé envahi par des opinions préconçues, puis, en oubliant qu’elles avaient été adoptées sans examen suffisant, il les a tenues pour vraies et manifestes (AT VIII-A, 36)<ref>Descartes, ''Principia philosophiae'', I, art. 71, AT VIII-A, p. 36. Trad. adaptée.</ref>. L’oubli n’est donc pas un détail psychologique : il explique pourquoi l’erreur résiste, pourquoi les préjugés se déguisent en certitudes. C’est ici qu’il faut être attentif au niveau d’interprétation. On peut être tenté de rapprocher cette analyse des réflexions ultérieures sur les conditionnements sociaux et les mécanismes de croyance collectifs. La comparaison est éclairante si on la formule prudemment : chez Descartes, l’éducation, le langage, l’autorité des maîtres, les usages partagés fournissent effectivement une grande partie du matériau des opinions, et l’enfance est le moment où ces contenus s’enracinent sans contrôle. Mais il ne faut pas faire comme si Descartes proposait déjà une théorie sociale complète des croyances : son objectif, ici, est d’expliquer pourquoi des erreurs “ordinaires” prennent l’allure d’évidences, afin de justifier la nécessité d’un doute méthodique qui ne s’attaque pas seulement à des fautes individuelles, mais aux opinions reçues et stabilisées par l’habitude. ==== 3. Les quatre causes de l'erreur selon Descartes ==== Dans les ''Principes de la philosophie'' (I, 71-74), Descartes systématise son analyse en identifiant quatre causes principales de nos erreurs<ref>Descartes, ''Principia philosophiae'', I, art. 71-74, AT VIII-A, p. 35-37. Voir l'analyse de Gary Hatfield, ''Descartes and the Meditations'', op. cit., p. 89-90.</ref>. Cette classification éclaire rétrospectivement le diagnostic posé dans l'incipit des ''Méditations''. La première cause est précisément celle que nous venons d'examiner : « les opinions préconçues de l'enfance » (''præjudicia pueritiae''). C'est la cause fondamentale, celle dont découlent les autres. Parce que nous avons formé des jugements irréfléchis dans l'enfance, nous partons avec un fonds de croyances fausses qui orientent toute notre pensée ultérieure. La deuxième cause est « l'impossibilité d'oublier ces opinions préconçues ». Même si nous reconnaissons intellectuellement que ces croyances sont douteuses, elles continuent à exercer leur emprise sur notre esprit. Elles reviennent spontanément, occupent notre pensée, résistent à nos efforts pour les écarter. Descartes reviendra sur ce point à la fin de la Première Méditation, quand il décrira la difficulté de maintenir le doute face à la force des anciennes opinions. La troisième cause est « la fatigue que nous éprouvons quand nous devons nous appliquer à des choses qui ne sont pas présentes aux sens ». La pensée purement intellectuelle, détachée de toute image sensible, est difficile et épuisante. Nous avons une tendance naturelle à nous appuyer sur des représentations sensibles, à chercher des « béquilles » imaginatives. Cette tendance nous détourne de la connaissance des vérités métaphysiques, qui ne peuvent être saisies que par l'intellect pur. La quatrième cause est « l'attachement de nos concepts à des mots qui ne correspondent pas exactement aux choses ». Le langage ordinaire véhicule les préjugés de l'enfance et de la tradition. Quand nous utilisons des mots comme « voir », « sentir », « percevoir », nous présupposons des théories implicites sur le fonctionnement de nos facultés. Ces théories sont souvent fausses, mais le langage les rend invisibles. La Seconde Méditation s'attaquera notamment à cette cause d'erreur en montrant que ce que nous appelons « voir » la cire est en réalité un acte de l'intellect<ref>Descartes, ''Meditationes'', II, AT VII, p. 31-32 ; AT IX-1, p. 25. Cf. Martial Gueroult, ''Descartes selon l'ordre des raisons'', Paris, Aubier, 1953, t. I, p. 131-136.</ref>. Ces quatre causes forment un système : les préjugés de l'enfance (1) persistent parce que nous ne pouvons pas les oublier (2), parce que la pensée intellectuelle nous fatigue (3), et parce que le langage les entretient (4). Pour s'en libérer, il ne suffit pas de les critiquer une par une ; il faut une refonte intellectuelle qui transforme notre rapport aux sens, à l'imagination et au langage. ==== 4. La métaphore architecturale : fondements et édifice ==== <blockquote> « [...] et que 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 qui traverse tout ce passage est l'une des plus célèbres de l'histoire de la philosophie. Les opinions sont des « fondements » (''fundamenta'') ; le savoir est un « édifice » (''ædificium'') construit sur ces fondements. Si les fondements sont « mal assurés » (''male firmata''), tout l'édifice est « douteux et incertain ». Cette métaphore a une longue histoire. On la trouve déjà chez les Anciens, et elle est particulièrement développée dans le ''Discours de la méthode'' (AT VI, 13-14), où Descartes compare le travail du philosophe à celui d'un architecte qui doit d'abord démolir un bâtiment mal construit avant d'en rebâtir un nouveau sur des fondations solides. Comme le souligne Edwin Curley dans son analyse du ''cogito'' et des fondements de la connaissance, cette métaphore implique une conception fondationnaliste du savoir<ref>Edwin Curley, ''Descartes Against the Skeptics'', Cambridge (Mass.), Harvard University Press, 1978, p. 31-35. Voir également du même auteur « The cogito and the foundations of knowledge », dans Stephen Gaukroger (dir.), ''The Blackwell Guide to Descartes' Meditations'', op. cit., p. 30-47.</ref>. Selon cette conception, certaines de nos croyances reposent sur d'autres, et celles-ci sur d'autres encore, jusqu'à des croyances « de base » (''basic beliefs'') qui ne reposent sur rien d'autre. Ces croyances de base sont les « fondements » ; les croyances qui en dérivent forment la « superstructure ». L'ensemble n'est solide que si les fondements le sont. Cette conception fondationnaliste a été vigoureusement critiquée dans la philosophie contemporaine. Des penseurs comme Quine ont soutenu que nos croyances forment un « réseau » ou une « toile » (''web'') plutôt qu'un édifice : chaque croyance est soutenue par d'autres, mais aucune n'est absolument « fondamentale ». D'autres, comme Wittgenstein, ont contesté l'idée même qu'il faille « justifier » nos croyances de base. Cependant, comme le note Charles Larmore, il serait injuste de critiquer Descartes sans tenir compte du contexte intellectuel de son époque<ref>Charles Larmore, « The First Meditation », dans David Cunning (dir.), ''The Cambridge Companion to Descartes' Meditations'', op. cit., p. 50-51 : « The complaint fails to do justice to the intellectual context. Foundationalist notions were already well ensconced. The idea that all knowledge rests upon the senses pervaded the thinking of the time, most notably in the Scholastic establishment. Descartes was not injecting a foundationalist view of knowledge where none had been before, but rather seeking to replace the reigning form with another. »</ref>. L'idée que toute connaissance repose sur les sens était profondément ancrée dans la pensée scolastique. 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 l'enseignement philosophique du temps<ref>La formule elle-même 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 (''phantasme''). Elle est discutée par Thomas d'Aquin, ''De veritate'', q. 2, a. 3, arg. 19, et sera reprise par les empiristes (Locke, puis Leibniz qui lui ajoute sa fameuse réserve : ''nisi ipse intellectus''). Voir Charles Larmore, « The First Meditation », op. cit., p. 51.</ref>. En attaquant les « fondements » sensibles de la connaissance, Descartes s'attaque à cette tradition et prépare une nouvelle conception du savoir fondée sur l'intellect pur. ==== 5. Le constat d'erreur et ses implications ==== Le constat formulé par Descartes, « j'avais reçu quantité de fausses opinions pour véritables », mérite une analyse attentive. Plusieurs éléments sont remarquables. Premièrement, les opinions sont « reçues » (''admisi''), non découvertes ou inventées. Le vocabulaire de la réception souligne la passivité de l'enfant face aux croyances qui lui sont transmises. Nous n'avons pas choisi nos premières opinions ; elles nous ont été imposées par notre éducation, notre milieu, notre culture. Cette passivité initiale est précisément ce que le doute méthodique doit renverser : il s'agit de passer d'une relation passive aux croyances (les recevoir) à une relation active (les examiner, les accepter ou les rejeter). Deuxièmement, ces opinions sont « fausses » (''falsa''), mais elles ont été tenues pour « véritables » (''pro veris''). L'erreur n'est pas simplement d'avoir des croyances fausses ; c'est de les tenir pour vraies, de leur accorder notre assentiment. La confusion entre le faux et le vrai est le mal épistémique par excellence. Elle ne se réduit pas à l'ignorance (ne pas savoir) ; elle implique une erreur positive (croire savoir ce qu'on ne sait pas). Troisièmement, l'erreur est massive : il s'agit d'une « quantité » (''quam multa'') de fausses opinions, non de quelques erreurs isolées. Descartes ne suggère pas que nous nous sommes trompés sur un ou deux points ; il suggère que l'ensemble de notre système de croyances est contaminé. C'est pourquoi une révision partielle ne suffira pas : il faut une révision d'ensemble, un doute « général ». Quatrièmement, ces opinions fausses ont servi de « principes » (''principia'') pour des constructions ultérieures. L'erreur s'est propagée : sur la base de croyances fausses, nous avons élaboré des théories, tiré des conséquences, construit un « édifice » de savoir. Cet édifice peut sembler impressionnant, mais il est bâti sur du sable. La métaphore architecturale prend ici tout son sens : un gratte-ciel aux fondations fragiles s'effondrera tôt ou tard. ==== 6. Le statut du « je » dans les ''Méditations'' ==== Une question importante se pose : qui est le « je » qui médite ? Cette question, apparemment simple, a fait l'objet de nombreuses discussions dans la littérature secondaire. Une première lecture identifie le « je » à Descartes lui-même. Les ''Méditations'' seraient alors une autobiographie intellectuelle, le récit d'une expérience personnelle que le philosophe partagerait avec ses lecteurs. Cette lecture s'appuie sur le style personnel du texte et sur certaines indications biographiques (l'âge mûr, la retraite en Hollande, etc.). Une deuxième lecture, défendue notamment par Gary Hatfield, distingue le « je » du texte de la personne historique de Descartes. Le méditant est un personnage, un « débutant en philosophie » (''qui modo primum philosophari incipit'', comme l'écrit Descartes dans l'Entretien avec Burman) dont les opinions ne sont pas nécessairement celles de l'auteur<ref>Gary Hatfield, ''Descartes and the Meditations'', op. cit., p. 40 et 89 : « Descartes described the meditator as a beginner who must overcome the prejudices of childhood. » Cf. Descartes, ''Entretien avec Burman'', AT V, p. 146.</ref>. Descartes, au moment où il écrit les ''Méditations'', possède déjà sa métaphysique ; le méditant, lui, doit la découvrir. Les doutes de la Première Méditation ne sont pas les doutes de Descartes, mais les doutes que doit traverser quiconque veut atteindre la vérité métaphysique. Une troisième lecture, proposée par Jorge Secada, va plus loin encore. Le « je » des ''Méditations'' n'est ni Descartes ni un personnage fictif ; c'est le lecteur lui-même. Le texte est conçu pour que le lecteur s'y reconnaisse, endosse le rôle du méditant, et effectue pour son propre compte le parcours décrit<ref>Jorge Secada, « God and meditation in Descartes' ''Meditations on First Philosophy'' », dans Karen Detlefsen (dir.), ''Descartes' Meditations: A Critical Guide'', Cambridge University Press, 2012, p. 201-202 : « Descartes hoped that readers of his meditations would actually be meditators living through the meditative process, a transformative process (7: 34, and 162–63). The ''Meditations'' does not describe this undertaking; rather, it aims to become the expression of the reader's own transformation. »</ref>. Comme le note Secada, Descartes espérait que les lecteurs de ses méditations seraient véritablement des « méditants » vivant le processus de transformation, non des spectateurs passifs. Les ''Méditations'' ne décrivent pas une expérience ; elles cherchent à devenir l'expression de la transformation du lecteur lui-même. Cette ambiguïté du « je » est philosophiquement féconde. Elle permet à Descartes d'écrire un texte à la fois personnel et universel, autobiographique et exemplaire. Chaque lecteur peut reconnaître en lui-même les « préjugés de l'enfance » et la nécessité de s'en défaire. L'autobiographie devient ainsi le modèle d'une expérience que chacun doit vivre pour son propre compte. ==== 7. Le « je » face à la tradition : préjugés individuels et préjugés collectifs ==== Les « fausses opinions » dont parle Descartes ne sont pas seulement des erreurs personnelles ; ce sont aussi, et peut-être surtout, des erreurs culturellement transmises. En ce sens, le doute cartésien a une portée qui dépasse l'individu. Comme le souligne Hatfield, les « préjugés de l'enfance » décrits par Descartes correspondent en grande partie aux thèses de la philosophie aristotélicienne dominante à son époque<ref>Gary Hatfield, ''Descartes and the Meditations'', op. cit., p. 89-90 : « Although Descartes described the meditator as a beginner who must overcome the prejudices of childhood, he knew full well that such "prejudices" included many tenets of Aristotelian metaphysics and epistemology. »</ref>. L'idée que toute connaissance vient des sens, la thèse de la ressemblance entre nos sensations et les qualités des objets, la conception de l'intellect comme une faculté qui « abstrait » des formes à partir des images sensibles : toutes ces doctrines scolastiques sont, pour Descartes, des « préjugés » qui se sont enracinés dans l'enfance de l'humanité comme dans celle de chaque individu. Le doute méthodique a donc une double cible : les préjugés individuels (ceux que chacun a formés dans sa propre enfance) et les préjugés collectifs (ceux que la tradition philosophique a accumulés au cours des siècles). C'est pourquoi Descartes, dans ''La Recherche de la vérité'' (ouvrage rédigé à la même époque que les ''Méditations''), met en scène un dialogue entre Eudoxe (son porte-parole), Épistémon (un philosophe aristotélicien) et Polyandre (un homme de bon sens sans formation philosophique)<ref>Descartes, ''La Recherche de la vérité par la lumière naturelle'', AT X, p. 495-527. Cf. Gary Hatfield, ''Descartes and the Meditations'', op. cit., p. 89.</ref>. Le doute doit convaincre à la fois le savant et l'ignorant, le philosophe et le profane. Cette dimension polémique du doute cartésien a parfois été sous-estimée. Les ''Méditations'' ne sont pas seulement un exercice de purification intellectuelle ; elles sont aussi une machine de guerre contre la tradition scolastique. Dans une lettre à Mersenne du 28 janvier 1641, Descartes révèle ses intentions : « 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 » (AT III, 298)<ref>Descartes à Mersenne, 28 janvier 1641, AT III, p. 298 ; CSMK, p. 173. Cité par Charles Larmore, « The First Meditation », op. cit., p. 51.</ref>. En invitant chacun à refaire pour son compte l'examen de ses croyances, Descartes sape l'autorité de la tradition et instaure un nouveau critère de vérité : non plus l'accord avec les Anciens, mais l'évidence à l'esprit individuel. ==== 8. La résolution et ses enjeux ==== <blockquote> « [...] de façon qu'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 passage du constat à la résolution marque un tournant. Descartes ne se contente pas de déplorer la situation ; il annonce un projet : « me défaire de toutes les opinions » et « commencer tout de nouveau dès les fondements ». Le vocabulaire de la rupture est frappant. « Me défaire » (''everti'') suggère un arrachement, une séparation violente. « Toutes les opinions » (''omnia'') indique l'universalité du projet : rien ne sera épargné. « Commencer tout de nouveau » (''denuo inchoandum'') évoque une table rase, un recommencement absolu. « Dès les fondements » (''a primis fundamentis'') précise le lieu de ce recommencement : il faut descendre jusqu'aux principes premiers. Cette résolution soulève une objection évidente : est-il possible de « se défaire » de toutes ses opinions ? Un être pensant peut-il se vider entièrement de ses croyances et repartir de zéro ? Certains critiques ont vu là une impossibilité de principe : on ne peut pas douter de tout, car le doute lui-même présuppose certaines croyances (par exemple, la croyance qu'on peut distinguer le vrai du faux). Descartes anticipe partiellement cette objection dans la suite du texte. Il ne s'agit pas de « prouver » que toutes les opinions sont fausses (ce serait impossible), mais de les traiter comme si elles étaient fausses, de leur retirer provisoirement notre assentiment. Le doute n'est pas un état cognitif (ne plus croire à rien), mais une décision méthodologique (traiter comme faux ce qui n'est pas absolument certain)<ref>Martial Gueroult, ''Descartes selon l'ordre des raisons'', op. cit., t. I, p. 33-34 : « il faut frapper de doute tout ce qui n'est pas certain d'une certitude absolue, et, d'autre part, il faut absolument exclure de nous tout ce qui est frappé de ce doute ».</ref>. La finalité de cette entreprise est explicitement énoncée : « établir quelque chose de ferme et de constant dans les sciences ». Le but n'est pas le scepticisme, mais la certitude. Le doute est un moyen, non une fin. Il sert à identifier ce qui résiste au doute et peut donc servir de fondement solide. Comme l'a souvent répété Descartes, il utilise les armes des sceptiques, mais contre le scepticisme lui-même. Cette finalité positive sépare nettement Descartes des sceptiques pyrrhoniens. Pour Pyrrhon et ses disciples, la suspension du jugement (''epochè'') était une fin en soi, censée procurer la tranquillité de l'âme (''ataraxia''). Pour Descartes, la suspension du jugement est provisoire ; elle doit déboucher sur des certitudes nouvelles, plus solides que les anciennes. Le doute cartésien est constructif ; il prépare une reconstruction. ==== 9. L'analogie des pommes gâtées ==== Dans les ''Septièmes Réponses'' (AT VII, 481), Descartes propose une analogie éclairante pour justifier son projet de doute universel. Supposons, dit-il, qu'on ait un panier plein de pommes et qu'on craigne que certaines soient gâtées. Comment procéder ? La méthode prudente consiste à vider entièrement le panier, à examiner chaque pomme une par une, et à ne remettre dans le panier que celles qui sont saines<ref>Descartes, ''Responsiones VII'', AT VII, p. 481 (réponse à Bourdin). Cf. Martial Gueroult, ''Descartes selon l'ordre des raisons'', op. cit., t. I, p. 33.</ref>. Cette analogie répond à une objection naturelle : pourquoi douter de tout, plutôt que d'examiner ses croyances une par une et de corriger seulement celles qui s'avèrent fausses ? Descartes répond que les croyances fausses peuvent être « cachées » parmi les vraies, comme les pommes gâtées parmi les saines. Si on laisse une pomme gâtée dans le panier, elle risque de contaminer les autres. De même, si on laisse une croyance fausse parmi nos opinions, elle risque de corrompre l'ensemble de notre système de pensée. L'analogie suggère aussi que le tri ne peut se faire qu'après le renversement. Tant que les pommes sont dans le panier, empilées les unes sur les autres, on ne peut pas les examiner correctement. Il faut d'abord les sortir toutes, les étaler devant soi, puis les réintroduire une par une après examen. De même, tant que nos croyances forment un système cohérent (en apparence), il est difficile d'identifier les erreurs. Il faut d'abord suspendre l'adhésion à toutes, puis réexaminer chacune à la lumière de critères rigoureux. ==== 10. Le fondationnalisme cartésien en question ==== L'incipit des ''Méditations'' engage Descartes dans une conception fondationnaliste de la connaissance. Selon cette conception, certaines croyances sont « de base » (elles ne dépendent d'aucune autre) et d'autres sont « dérivées » (elles dépendent des croyances de base). Le système des connaissances est hiérarchique : il y a des « fondements » et une « superstructure », des « principes » et des « conséquences ». Cette conception a été vigoureusement débattue dans la philosophie contemporaine. Plusieurs objections ont été formulées : L'objection de la régression infinie : si toute croyance doit être justifiée par une autre, on entre dans une régression à l'infini. Pour l'éviter, il faut admettre des croyances « auto-justifiées » qui n'ont pas besoin d'être fondées sur d'autres. Mais existe-t-il de telles croyances ? L'objection du critère : comment identifier les croyances « de base » ? Par quel critère distinguer un fondement d'une superstructure ? Ce critère ne doit-il pas lui-même être fondé ? L'objection de la circularité : si les croyances de base sont celles qui sont « évidentes », et si l'évidence est ce qui caractérise les croyances de base, on tourne en rond. L'objection holiste : peut-être nos croyances ne forment-elles pas une hiérarchie, mais un réseau où chaque croyance est soutenue par d'autres et en soutient d'autres à son tour. Dans ce cas, il n'y aurait pas de « fondements » absolus<ref>Sur ces objections, voir Bernard Williams, ''Descartes: The Project of Pure Enquiry'', Harmondsworth, Penguin, 1978, p. 46-49 ; Charles Larmore, « The First Meditation », op. cit., p. 50-51.</ref>. Descartes, cependant, avait une réponse à ces objections, réponse qui ne sera pleinement développée que dans les Méditations suivantes. Le ''cogito'' (« je pense, donc je suis ») sera présenté comme une vérité absolument première, qui ne dépend d'aucune autre et qui peut servir de fondement à toutes les autres. Cette vérité est « auto-justifiée » en un sens très particulier : elle est connue par une intuition immédiate de l'esprit, non par une inférence à partir de prémisses antérieures<ref>Voir Edwin Curley, ''Descartes Against the Skeptics'', op. cit., ch. 3 ; Charles Larmore, « The First Meditation », op. cit., p. 59-61.</ref>. ==== 11. Portée philosophique de l'incipit ==== L'incipit des ''Méditations'' a exercé une influence considérable sur toute la philosophie moderne. En posant la question « Comment puis-je savoir que ce que je crois est vrai ? », Descartes inaugure ce que l'on a appelé la « primauté de l'épistémologie ». Avant de s'interroger sur ce qui existe (ontologie) ou sur ce que nous devons faire (éthique), il faut d'abord s'interroger sur ce que nous pouvons connaître et comment nous pouvons le connaître. Cette primauté de l'épistémologie a été contestée au XXe siècle. Des philosophes comme Heidegger ont soutenu que la question de l'être est plus fondamentale que la question de la connaissance. D'autres, comme les pragmatistes, ont refusé de séparer la théorie de la pratique et ont soutenu que la connaissance est toujours déjà engagée dans l'action. Mais ces critiques elles-mêmes se situent dans l'horizon ouvert par Descartes : elles répondent à la question cartésienne, même si c'est pour la récuser. L'incipit des ''Méditations'' inaugure aussi ce que l'on pourrait appeler la « philosophie du sujet ». Le point de départ n'est pas le monde, mais le moi qui s'interroge sur le monde. La vérité n'est pas d'abord dans les choses ; elle est d'abord dans l'esprit qui examine les choses. Ce déplacement, que Kant rapprochera plus tard de l'hypothèse de Copernic pour caractériser sa propre philosophie critique, place le sujet connaissant au centre de la réflexion. Enfin, l'incipit des ''Méditations'' pose la question de la libération intellectuelle. Comment se défaire des préjugés de l'enfance, des conditionnements de l'éducation, des contraintes de la tradition ? Cette question, posée par Descartes dans un contexte épistémologique, sera reprise dans des contextes politiques (les Lumières, la critique de l'idéologie) et psychologiques (la psychanalyse). L'idée que nous sommes prisonniers de croyances dont nous n'avons pas conscience, et que nous devons nous en libérer par un effort de réflexion critique, est une idée fondamentalement cartésienne. === B. Les conditions de possibilité de l'entreprise === ==== 1. L'exigence de maturité intellectuelle ==== <blockquote> « Mais cette entreprise me semblant être fort grande, j'ai attendu que j'eusse atteint un âge qui fût si mûr, que je n'en pusse espérer d'autre après lui, auquel je fusse plus propre à l'exécuter ; ce qui m'a fait différer si longtemps, que désormais je croirais commettre une faute, si j'employais encore à délibérer le temps qui me reste pour agir. » </blockquote> Ce passage, en apparence simple remarque autobiographique, soulève des questions philosophiques profondes sur les conditions subjectives de l'exercice métaphysique. Descartes ne conçoit pas la méditation philosophique comme une activité accessible à n'importe quel moment de l'existence : elle requiert une préparation, un mûrissement, une disposition particulière de l'esprit. L'âge requis n'est pas simplement biologique ; il désigne un état de développement intellectuel. Descartes avait environ quarante-quatre ans lors de la rédaction des ''Méditations'' (publiées en 1641), et il avait déjà derrière lui une longue formation scientifique et philosophique, des voyages, des expériences du monde. Comme l'observe Daniel Garber dans son article fondamental « ''Semel in vita'' : The Scientific Background to Descartes' ''Meditations'' », cette exigence de maturité répond à une double nécessité<ref>Daniel Garber, « ''Semel in vita'': The Scientific Background to Descartes' ''Meditations'' », dans Amélie Oksenberg Rorty (dir.), ''Essays on Descartes' Meditations'', Berkeley, University of California Press, 1986, p. 81-116.</ref> : Premièrement, il faut avoir suffisamment vécu pour avoir fait l'expérience de l'erreur. Celui qui n'a pas encore eu l'occasion de se tromper, ou qui n'a pas pris conscience de ses erreurs, ne peut pas mesurer l'urgence de la révision fondamentale. L'adolescent confiant dans ses premières certitudes n'a pas les motifs existentiels de douter. C'est l'accumulation des mécomptes, des révisions, des désillusions qui crée la disposition au doute méthodique. Deuxièmement, il faut posséder la force intellectuelle nécessaire pour soutenir l'effort de la méditation. Le doute hyperbolique n'est pas une simple velléité sceptique ; c'est un exercice exigeant qui demande une attention soutenue, une capacité à résister aux tendances spontanées de l'esprit, une discipline mentale comparable à celle de l'ascèse religieuse. Descartes sait que cette force, une fois atteinte, ne fera que décliner : il faut agir au moment où l'on est « le plus propre à l'exécuter ». La formule « je croirais commettre une faute » (''essem in culpa'') introduit une dimension morale inattendue. Différer davantage l'entreprise serait une négligence coupable, un manquement à un devoir envers soi-même et envers la vérité. Le philosophe qui possède les moyens de refonder le savoir et qui ne le fait pas se rend coupable par omission. Cette responsabilité épistémique anticipe ce que la Quatrième Méditation développera concernant l'erreur comme faute de la volonté. ==== 2. Le ''semel in vita'' : l'unicité de l'expérience métaphysique ==== L'expression latine « ''semel in vita'' » (« une fois dans la vie »), présente dans le texte latin original, mérite une attention particulière. Elle apparaît dès l'ouverture des ''Méditations'' : « ''Animadverti jam ante aliquot annos... ac proinde funditus omnia semel in vita esse evertenda'' » (« J'ai remarqué il y a déjà quelques années... et par conséquent qu'une fois dans ma vie il fallait tout renverser de fond en comble »). Cette formule a fait l'objet d'analyses approfondies dans la littérature secondaire. Comme le souligne Gary Hatfield dans « The Senses and the Fleshless Eye », le ''semel in vita'' caractérise le doute cartésien comme une expérience unique et non répétable<ref>Gary Hatfield, « The Senses and the Fleshless Eye: The ''Meditations'' as Cognitive Exercises », dans Amélie Oksenberg Rorty (dir.), ''Essays on Descartes' Meditations'', op. cit., p. 45-79. Voir également Gary Hatfield, ''Descartes and the Meditations'', op. cit., p. 40-43.</ref>. Ce n'est pas une attitude permanente de suspension du jugement (comme chez les sceptiques pyrrhoniens), mais un moment méthodologique destiné à produire des résultats définitifs. Cette unicité s'explique de plusieurs façons : a) Économie de l'effort métaphysique : La méditation métaphysique est épuisante. Elle exige une tension intellectuelle maximale qui ne peut être maintenue indéfiniment. Descartes conseillera à Élisabeth de Bohême de ne consacrer que « quelques heures par an » aux spéculations métaphysiques (lettre du 28 juin 1643, AT III, 692-693)<ref>Descartes à Élisabeth, 28 juin 1643, AT III, p. 692-693. Cf. Martial Gueroult, ''Descartes selon l'ordre des raisons'', op. cit., t. I, p. 29.</ref>. La métaphysique n'est pas une activité quotidienne ; elle est un passage obligé, une ''purgatio'' intellectuelle, après laquelle on peut se consacrer aux sciences particulières avec les fondements assurés qu'elle fournit. b) Caractère fondationnel de l'entreprise : Si le doute méthodique atteint son but (découvrir un fondement absolument certain), il n'a pas besoin d'être répété. Une fois le ''cogito'' découvert, une fois l'existence de Dieu prouvée et sa véracité établie, l'édifice du savoir est reconstruit sur des bases solides. Recommencer le doute serait inutile, voire nuisible : ce serait défaire ce qui a été solidement établi. c) Transformation irréversible du sujet : Comme le suggère Jorge Secada dans son analyse des ''Méditations'' comme exercice thérapeutique, le parcours méditatif opère une transformation du méditant<ref>Jorge Secada, « God and meditation », dans Karen Detlefsen (dir.), ''Descartes' Meditations: A Critical Guide'', op. cit., p. 200-201 : « The ''Meditations'' is instead a therapeutic manual. It offers a course of treatment for a cognitive illness inherent to human beings, resulting from the embodiment of the human mind. »</ref>. Celui qui a traversé le doute et atteint la certitude n'est plus le même ; il a acquis une disposition intellectuelle nouvelle, une habitude de clarté et de distinction qui oriente désormais toutes ses pensées. Cette métamorphose ne peut se produire qu'une fois. ==== 3. La mise en scène de la méditation : les trois conditions ==== <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> Ce passage constitue ce que l'on pourrait appeler la mise en scène de la méditation philosophique. Descartes ne se contente pas d'énoncer des arguments ; il décrit avec soin le cadre dans lequel ces arguments peuvent être produits et reçus. Cette attention au contexte n'est pas ornementale : elle définit les conditions de possibilité de l'exercice métaphysique. Trois conditions sont explicitement requises : ===== a) « Mon esprit est libre de tous soins » (''mentem curis omnibus exsolvi'') ===== La première condition est la liberté intérieure, l'affranchissement des préoccupations pratiques. Le terme latin ''curae'' désigne les soucis, les affaires, les occupations qui accaparent l'attention et fragmentent l'esprit. La méditation métaphysique exige une attention unifiée, entièrement tournée vers son objet. Tant que l'esprit est partagé entre différentes préoccupations, il ne peut atteindre le degré de concentration requis. Cette exigence traduit l'opposition classique entre la vie active (''vita activa'', ''negotium'') et la vie contemplative (''vita contemplativa'', ''otium''). Cette distinction, héritée de l'Antiquité (Aristote, Cicéron, Sénèque) et transmise par la tradition médiévale, est ici réinvestie dans un contexte épistémologique. L'''otium'' philosophique n'est pas l'oisiveté ; c'est le loisir studieux, la disponibilité de l'esprit pour la recherche de la vérité, par opposition au ''negotium'' des affaires mondaines. Descartes retrouve ainsi, peut-être sans le savoir explicitement, la tradition aristotélicienne selon laquelle la ''theoria'' (contemplation) représente l'activité la plus haute de l'homme, celle qui requiert le plus de loisir et qui est le moins asservie aux nécessités de la vie. Mais il donne à cette tradition une inflexion nouvelle : l'''otium'' cartésien n'est pas permanent ; il est provisoire, méthodique, ordonné à la refondation d'un savoir qui servira ensuite à la vie pratique. ===== b) « Je me suis procuré un repos assuré » (''securum mihi otium procuravi'') ===== La deuxième condition est la sécurité, l'absence de trouble ou de menace. Le terme latin ''securus'' (de ''se-cura'', sans souci) insiste sur l'absence d'inquiétude. Le méditant doit être assuré que rien ne viendra interrompre sa réflexion, que son existence matérielle est pourvue, qu'aucun danger ne le guette. Cette condition peut sembler triviale, mais elle a une portée philosophique importante. L'inquiétude, l'insécurité, la peur dispersent l'attention et orientent l'esprit vers les choses pratiques, vers les moyens de survie et de protection. Un homme menacé ne peut pas méditer ; il doit agir, fuir, se défendre. La métaphysique suppose une forme de paix qui n'est pas seulement intérieure mais aussi extérieure. Historiquement, Descartes bénéficiait en 1640-1641 d'une situation relativement stable aux Pays-Bas, où il s'était retiré pour fuir les agitations de la vie parisienne et jouir de la tranquillité nécessaire à ses travaux. Cette retraite hollandaise, avec son mélange de solitude et de correspondance intellectuelle intense, constitue le cadre biographique concret des ''Méditations''. ===== c) « Dans une paisible solitude » (''solus secedo'') ===== La troisième condition est la solitude. Le verbe latin ''secedere'' signifie se retirer, s'éloigner, faire sécession. Le philosophe se soustrait à la société des hommes pour se retrouver seul avec ses pensées. Cette solitude n'est pas misanthropie ; elle est exigence méthodologique. Pourquoi la solitude est-elle nécessaire ? Plusieurs raisons peuvent être avancées : Premièrement, la présence d'autrui introduit des perturbations. Les autres parlent, questionnent, objectent, distraient. La méditation exige un dialogue avec soi-même, non avec les autres. C'est une activité essentiellement monologique, au moins dans sa phase initiale. Deuxièmement, les autres incarnent des opinions, des traditions, des autorités. La pression sociale tend à maintenir les croyances établies. Pour douter de tout, y compris des opinions reçues de l'éducation et de la société, il faut s'abstraire du milieu qui les entretient. La solitude permet de se défaire de l'emprise des préjugés collectifs. Troisièmement, la solitude manifeste que le fondement recherché doit être trouvé en soi-même, non dans un accord avec autrui. La vérité cartésienne n'est pas consensuelle ; elle est évidente à l'esprit individuel qui l'examine attentivement. Le ''cogito'' lui-même sera une vérité solitaire, accessible à chaque esprit pour son propre compte. Cette valorisation de la solitude philosophique rattache Descartes à une longue tradition d'anachorèse intellectuelle, des philosophes antiques aux ermites chrétiens. Mais elle annonce aussi l'une des critiques majeures que lui adresseront les penseurs ultérieurs : l'oubli de la dimension sociale et intersubjective de la connaissance. ==== 4. Le genre méditatif et ses sources ==== Le choix du terme « méditation » n'est pas anodin. Il rattache l'œuvre de Descartes à une tradition littéraire et spirituelle bien établie, celle des exercices spirituels, dont les ''Exercices spirituels'' d'Ignace de Loyola (1548) constituent le modèle le plus influent à l'époque<ref>Ignace de Loyola, ''Exercitia spiritualia'', Rome, 1548. Voir Gary Hatfield, « The Senses and the Fleshless Eye », op. cit., p. 47-54, et ''Descartes and the Meditations'', op. cit., p. 40-42 : « In Descartes' day, the meditative method was well developed in religious writings known as spiritual exercises. Ignatius, founder of the Jesuits, had composed a set of exercises, and Descartes participated in meditations or spiritual exercises at La Flèche. »</ref>. Comme l'a montré Gary Hatfield dans son étude « The Senses and the Fleshless Eye: The ''Meditations'' as Cognitive Exercises », les ''Méditations'' cartésiennes partagent plusieurs caractéristiques avec les méditations religieuses : a) Structure journalière : Les ''Méditations'' sont divisées en six journées, comme les exercices spirituels ignaciens se distribuent sur plusieurs semaines. Chaque méditation correspond à une étape du parcours, à un progrès dans la purification de l'esprit. b) Engagement personnel : La méditation n'est pas une lecture passive ; elle exige une participation active du lecteur. Descartes insiste sur ce point dans la préface : il faut « plusieurs mois, ou du moins plusieurs semaines » pour « considérer les choses dont elle [la Première Méditation] traite » (AT VII, 9)<ref>Descartes, ''Meditationes'', Préface, AT VII, p. 9. Cf. Gary Hatfield, ''Descartes and the Meditations'', op. cit., p. 41.</ref>. Le lecteur doit refaire pour son compte le parcours du méditant. c) Visée transformative : Le but n'est pas seulement d'acquérir des connaissances, mais de se transformer soi-même. Comme l'écrit Jorge Secada, les ''Méditations'' constituent un « manuel thérapeutique » visant à guérir l'esprit de sa dépendance excessive aux sens et à l'imagination<ref>Jorge Secada, « God and meditation », op. cit., p. 201 : « The ''Meditations'' is instead a therapeutic manual. It offers a course of treatment for a cognitive illness inherent to human beings. »</ref>. Le méditant qui a parcouru les six méditations n'est plus le même ; il a acquis une nouvelle disposition intellectuelle. d) Progression ordonnée : La méditation procède par étapes, chacune préparant la suivante. On ne peut pas sauter les premières étapes pour accéder directement aux conclusions. L'ordre est essentiel : « j'ai suivi... l'ordre de méditer que je me suis proposé, qui est de passer par degrés des notions que je trouverai les premières en mon esprit à celles que j'y pourrai trouver par après » (AT IX, 27). Cependant, comme le note Secada, les ''Méditations'' ne sont pas simplement la transposition philosophique des exercices religieux. Elles en diffèrent sur des points essentiels : l'objet de la méditation n'est pas Dieu en tant que tel, mais les fondements de la connaissance ; la méthode n'est pas l'imagination des scènes bibliques, mais l'analyse rationnelle ; le but n'est pas le salut de l'âme, mais la certitude scientifique. ==== 5. Le destinataire de la méditation et la question du lecteur ==== La question du destinataire des ''Méditations'' mérite réflexion. Qui est le « je » qui médite ? Qui est le « nous » parfois employé ? Qui est le lecteur visé ? Selon la lecture proposée par Lisa Shapiro et développée dans le ''Cambridge Companion to Descartes' Meditations'' (2014), le « je » des ''Méditations'' n'est pas simplement René Descartes ; c'est un méditant exemplaire, une figure que le lecteur est invité à endosser<ref>Lisa Shapiro, « The self in the Meditations », dans Karen Detlefsen (dir.), ''Descartes' Meditations: A Critical Guide'', op. cit., p. 230 : « Within the meditational tradition that Descartes is drawing upon, the process of meditating is supposed to effect in the meditator some sort of progress. »</ref>. Descartes ne raconte pas son histoire personnelle ; il propose un parcours que chacun peut et doit refaire pour son compte. Cette dimension performative des ''Méditations'' explique certaines de leurs caractéristiques stylistiques. Le texte ne dit pas : « Voici les vérités que j'ai découvertes » ; il dit : « Voici comment je procède, suivez-moi ». Le lecteur n'est pas spectateur ; il est co-méditant. S'il se contente de lire passivement, il passera à côté de l'essentiel. Cependant, comme le remarque Jorge Secada, cette identité entre le méditant textuel et le lecteur réel pose problème pour nous, lecteurs contemporains<ref>Jorge Secada, « God and meditation », op. cit., p. 202 : « Yet, we, contemporary readers, can no longer oblige its author. We cannot wholeheartedly take on the meditator's garb because we can no longer believe Descartes' promise of scientific advance, nor his diagnosis. »</ref>. Nous ne pouvons plus « revêtir le vêtement du méditant » de façon aussi directe que Descartes l'espérait, parce que nous savons trop de choses que Descartes ne savait pas. Nous ne pouvons plus accepter naïvement sa promesse d'avancée scientifique, ni son diagnostic sur les causes de l'erreur. Une distance historique s'est creusée qui nous oblige à distinguer entre l'auteur, le narrateur méditant, et le lecteur. ==== 6. L'opposition entre ''agir'' et ''connaître'' ==== <blockquote> « [...] puisqu'il n'est pas maintenant question d'agir, mais seulement de méditer et de connaître. » </blockquote> Cette formule, qui apparaît plus loin dans la Première Méditation (§13), éclaire rétrospectivement les conditions énoncées ici. La méditation suppose une suspension de l'action. Tant que je suis engagé dans la vie pratique, je dois me fier à des opinions probables ; je ne peux pas attendre d'avoir des certitudes absolues pour agir, car l'action n'attend pas. Cette distinction entre le théorique et le pratique est fondamentale pour comprendre le statut du doute cartésien. Le doute hyperbolique est purement spéculatif ; il ne concerne que la recherche de la vérité, non la conduite de la vie. Descartes avait déjà établi cette distinction dans le ''Discours de la méthode'' (1637), où il exposait une « morale par provision » permettant de vivre pendant que les fondements du savoir restaient incertains<ref>Descartes, ''Discours de la méthode'', IIIe partie, AT VI, p. 22-28.</ref>. Comme le note l'article « Doute » du ''Historical Dictionary of Descartes and Cartesian Philosophy'', Descartes « fait clairement comprendre que dans les affaires pratiques, nous ne devons pas attendre la certitude à laquelle nous avons droit dans le domaine de la science théorique »<ref>Roger Ariew, Dennis Des Chene et al. (dir.), ''Historical Dictionary of Descartes and Cartesian Philosophy'', 2e éd., Lanham, Rowman & Littlefield, 2015, art. « Doubt », p. 120-121.</ref>. Le domaine pratique « relève de la volonté et est gouverné par l'autorité et l'obéissance, les sens, les sensations corporelles (faim, soif) et les passions ». Cette suspension explique pourquoi le doute peut être poussé aussi loin. Dans la vie pratique, il serait absurde et dangereux de douter que j'aie des mains ou que le monde extérieur existe. Mais dans l'espace protégé de la méditation théorique, ces doutes sont légitimes, voire nécessaires. Ils ne servent pas à orienter l'action ; ils servent à identifier ce qui résiste absolument au doute. ==== 7. La destruction comme préalable à la reconstruction ==== <blockquote> « Je m'appliquerai sérieusement et avec liberté à détruire généralement toutes mes anciennes opinions. » </blockquote> Les conditions de possibilité ainsi définies (maturité, unicité, liberté, repos, solitude, suspension de l'action) convergent vers un unique objectif : rendre possible la destruction générale des anciennes opinions. Le vocabulaire de la destruction (''eversio'', ''destruere'') est remarquablement violent. Descartes ne parle pas de corriger, d'amender, de réviser ; il parle de détruire, de renverser, de faire table rase. Cette fermeté a souvent été mal comprise. Elle ne signifie pas que toutes les anciennes opinions sont fausses et seront abandonnées définitivement. Elle signifie que, méthodologiquement, elles doivent être traitées comme si elles étaient fausses, jusqu'à ce qu'elles soient éventuellement réintroduites sur des bases certaines. Comme l'explique Martial Gueroult dans ''Descartes selon l'ordre des raisons'', le doute cartésien procède par exclusion provisoire. Les opinions sont écartées du champ de la certitude, non parce qu'elles sont reconnues fausses, mais parce qu'elles n'ont pas été validées par la méthode. Ce qui a été exclu pourra être réintroduit plus tard, à sa place dans l'ordre des raisons, une fois que les conditions de la certitude auront été établies<ref>Martial Gueroult, ''Descartes selon l'ordre des raisons'', op. cit., t. I, p. 33 : « Nécessité de traiter provisoirement comme fausses les choses ainsi frappées de doute; ce qui entraîne la nécessité de les rejeter entièrement. »</ref>. Les conditions de possibilité énoncées dans ce passage sont donc les conditions d'une catharsis intellectuelle, d'une purification de l'entendement qui le prépare à recevoir la lumière de l'évidence. Sans la liberté, le repos et la solitude, cette purification serait impossible ; l'esprit resterait encombré de ses préjugés, de ses soucis, de ses influences sociales. La méditation métaphysique exige que l'esprit se retrouve seul avec lui-même, dans un face-à-face avec ses propres pensées. ==== 8. Portée et limites des conditions cartésiennes ==== L'analyse des conditions de possibilité de l'entreprise métaphysique révèle à la fois la profondeur et les limites du projet cartésien. Du côté de la profondeur : Descartes a compris que la philosophie n'est pas une activité « hors sol », praticable n'importe où, n'importe quand, par n'importe qui. Elle requiert des conditions subjectives et objectives qui ne sont pas toujours réunies. Cette attention aux présupposés de l'exercice philosophique annonce les réflexions ultérieures sur les conditions sociales, économiques, psychologiques de la pensée. Du côté des limites : L'idéal cartésien du philosophe solitaire, retiré du monde, libéré de tout souci pratique, a été vigoureusement critiqué. Des penseurs comme Hegel, Marx, Wittgenstein ont souligné que la pensée est toujours déjà sociale, qu'elle s'inscrit dans des formes de vie collectives, qu'elle utilise un langage qui est un produit historique. Le « je » cartésien, prétendument isolé, est en réalité traversé par des déterminations qu'il ne maîtrise pas. De même, la distinction tranchée entre théorie et pratique, entre méditer et agir, a été contestée. Pour les pragmatistes, la pensée est elle-même une forme d'action ; pour les marxistes, les idées sont des reflets des conditions matérielles d'existence ; pour les phénoménologues, la conscience est toujours « conscience de quelque chose », engagée dans un monde qu'elle ne peut pas mettre entre parenthèses. Ces critiques, cependant, ne diminuent pas l'importance historique du geste cartésien. En thématisant les conditions de la méditation philosophique, Descartes a ouvert un espace de réflexion qui reste fécond. La question « quelles conditions faut-il réunir pour penser vraiment ? » demeure pertinente, même si les réponses qu'on lui apporte diffèrent de celle de Descartes. === C. Le principe méthodologique fondamental === ==== 1. Énoncé du principe ==== <blockquote> « Et pour cela 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> <blockquote> « [...] la raison me persuade dès maintenant que je ne dois pas moins soigneusement m'empêcher de leur donner créance, qu'à celles qui sont manifestement fausses, si je veux trouver quelque chose de constant et d'assuré dans les sciences. » </blockquote> Ces deux passages, tirés du second paragraphe de la Première Méditation, énoncent le principe méthodologique fondamental qui va gouverner toute l'entreprise du doute cartésien. Ce principe peut se formuler ainsi : tout ce qui donne la moindre raison de douter doit être traité comme s'il était faux. Cette formulation, apparemment simple, contient une exigence d'une rigueur extraordinaire qui mérite un examen attentif. Le texte latin est encore plus explicite : « ''ratio jam me persuadet, non minus accurate ab iis quae non plane certa sunt atque indubitata, quam ab aperte falsis assensionem esse cohibendam'' » (AT VII, 18). L'expression ''non minus accurate'' (« pas moins soigneusement ») indique une équivalence méthodologique entre le douteux et le faux. 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 ». ==== 2. L'économie de la méthode : attaquer les principes ==== Le premier aspect du principe méthodologique concerne l'économie de l'entreprise. Descartes refuse d'examiner ses opinions « chacune en particulier », ce qui constituerait « un travail infini ». Au lieu de procéder à un examen exhaustif de toutes ses croyances, il adopte une stratégie plus efficace : attaquer directement les « principes » ou « fondements » sur lesquels reposent toutes les autres opinions. Cette stratégie s'appuie sur la métaphore architecturale déjà introduite : si l'on veut démolir un édifice, il est plus efficace de saper les fondations que d'abattre les murs un par un. « La ruine des fondements entraîne nécessairement avec soi tout le reste de l'édifice. » En détruisant les principes, on détruit d'un seul coup tout ce qui en dépend. Cette stratégie présuppose une structure hiérarchique du savoir. Nos croyances ne sont pas toutes au même niveau ; certaines sont « fondamentales », d'autres sont « dérivées ». Les croyances fondamentales soutiennent les croyances dérivées, comme les fondations soutiennent l'édifice. Cette conception « fondationnaliste » de la connaissance est caractéristique de l'épistémologie cartésienne. Comme le souligne Martial Gueroult dans son analyse magistrale des ''Méditations'', cette stratégie implique une triple nécessité : « nécessité du doute préalable ; nécessité de ne rien excepter du doute tant que le doute n'est pas radicalement impossible ; nécessité de traiter provisoirement comme fausses les choses ainsi frappées de doute, ce qui entraîne la nécessité de les rejeter entièrement »<ref>Martial Gueroult, ''Descartes selon l'ordre des raisons'', op. cit., t. I, p. 33.</ref>. ==== 3. L'identification du fondement : les 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 [...]. » </blockquote> Le « fondement » que Descartes identifie, et qu'il va s'employer à ébranler, ce sont les sens. Cette identification n'est pas arbitraire ; elle correspond à la conception épistémologique dominante de l'époque. L'adage aristotélicien « 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 la position de la philosophie scolastique<ref>Thomas d'Aquin, ''De veritate'', q. 2, a. 3, arg. 19. Cf. Charles Larmore, « The First Meditation », op. cit., p. 51.</ref>. Comme le note Gary Hatfield, Descartes lui-même, au moment où il écrit les ''Méditations'', ne partage plus cette position<ref>Gary Hatfield, ''Descartes and the Meditations'', op. cit., p. 89 : « Although Descartes described the meditator as a beginner who must overcome the prejudices of childhood, he knew full well that such "prejudices" included many tenets of Aristotelian metaphysics and epistemology. »</ref>. Il a déjà développé sa théorie des idées innées et sa conception de l'intellect pur comme source autonome de connaissance. Mais il fait parler ici un « débutant en philosophie » (''qui modo primum philosophari incipit''), quelqu'un qui adhère encore spontanément à l'empirisme du sens commun. C'est ce débutant que les ''Méditations'' vont conduire vers une nouvelle conception du savoir. En attaquant les sens comme « fondement », Descartes s'attaque donc à l'empirisme sous toutes ses formes : l'empirisme du sens commun, l'empirisme aristotélicien, et même le nouvel empirisme qui commençait à se développer en Angleterre. Si les sens ne fournissent pas de fondement certain, c'est toute une tradition épistémologique qui s'effondre. ==== 4. Le standard de certitude : l'indubitabilité absolue ==== Le cœur du principe méthodologique réside dans le standard de certitude que Descartes adopte. Ce standard est extraordinairement élevé : il exige l'indubitabilité absolue. Une croyance n'est « certaine » que si elle résiste à tout doute possible, même le plus improbable. <blockquote> « [...] parce que la raison me persuade dès maintenant que je ne dois pas moins soigneusement m'empêcher de donner créance aux choses qui ne sont pas entièrement certaines et indubitables, qu'à celles qui nous paraissent manifestement fausses [...]. » </blockquote> L'expression « entièrement certaines et indubitables » (''plane certa atque indubitata'') est essentielle. Le terme ''plane'' (« entièrement », « absolument ») indique qu'il ne s'agit pas d'une certitude relative ou graduée, mais d'une certitude absolue. Et le terme ''indubitata'' (« indubitable ») précise la nature de cette certitude : est certain ce dont on ne peut pas douter. Ce standard a été vigoureusement critiqué par de nombreux commentateurs. Comme le souligne Charles Larmore dans son analyse de la Première Méditation, l'indubitabilité « n'est pas un principe qu'un empiriste serait nécessairement enclin à endosser »<ref>Charles Larmore, « The First Meditation », op. cit., p. 62-63 : « For consider: though indubitability is presented as a dictate of reason, it is not a requirement an empiricist must be inclined to endorse. On the contrary, I have already noted that for Aristotle sense perception serves as the basis of knowledge because of its reliability, not under all possible, but under normal, conditions. »</ref>. Pour Aristote, la perception sensible sert de base à la connaissance en raison de sa fiabilité dans des conditions normales, non de son infaillibilité dans toutes les conditions possibles. Dans la vie ordinaire, nous considérons une croyance comme « certaine » si nous avons écarté les possibilités d'erreur que nous avons des raisons positives de craindre. Nous ne pensons pas devoir éliminer toute possibilité d'erreur concevable, aussi improbable soit-elle. Descartes connaissait parfaitement cette conception ordinaire de la certitude. Pourquoi l'a-t-il rejetée au profit d'une exigence d'indubitabilité absolue ? ==== 5. La justification du principe : l'enquête pure ==== La réponse de Descartes se trouve dans les phrases qui précèdent immédiatement l'énoncé du principe : <blockquote> « [...] j'ai attendu que j'eusse atteint un âge qui fût si mûr, que je n'en pusse espérer d'autre après lui, auquel je fusse plus propre à l'exécuter ; ce qui m'a fait différer si longtemps, que désormais je croirais commettre une faute, si j'employais encore à délibérer le temps qu'il me reste pour agir. » </blockquote> <blockquote> « Maintenant donc que mon esprit est libre de tous soins, et que je me suis procuré un repos assuré dans une paisible solitude [...]. » </blockquote> Ces phrases établissent le contexte dans lequel l'enquête va se dérouler : un contexte de « repos assuré », de « paisible solitude », où l'esprit est « libre de tous soins ». Ce contexte est celui que Bernard Williams a appelé l'« enquête pure » (''pure inquiry'')<ref>Bernard Williams, ''Descartes: The Project of Pure Enquiry'', Harmondsworth, Penguin, 1978, p. 46-49. Voir Charles Larmore, « The First Meditation », op. cit., p. 63-65.</ref>. Dans la vie ordinaire, quand le temps est court et les ressources limitées, quand des préoccupations pratiques sont en jeu et que l'action est nécessaire, nous ne pouvons pas nous permettre le luxe de rejeter toute croyance pour laquelle nous pouvons imaginer le moindre doute. Nous devons nous en tenir aux croyances pour lesquelles il semble y avoir des preuves suffisantes. Mais, suppose Descartes, poursuivre la connaissance pour elle-même est une affaire différente. Si nous ne regardons que les raisons de croire qui ont trait à la vérité et à la fausseté des opinions (par opposition à l'utilité de les adopter), si notre affaire n'est pas l'action mais uniquement la connaissance, alors l'indubitabilité devient un objectif approprié. Comme Descartes l'écrit dans le ''Discours de la méthode'' : « Puisque je désirais maintenant me consacrer uniquement à la recherche de la vérité, j'ai pensé qu'il était nécessaire de [...] rejeter comme absolument faux tout ce en quoi je pouvais imaginer le moindre doute, afin de voir s'il me resterait quelque chose à croire qui fût entièrement indubitable » (AT VI, 31)<ref>Descartes, ''Discours de la méthode'', IVe partie, AT VI, p. 31-32.</ref>. ==== 6. Les deux objectifs de l'enquête et leur hiérarchie ==== Larmore propose une analyse éclairante de la logique sous-jacente au principe cartésien<ref>Charles Larmore, « The First Meditation », op. cit., p. 64 : « In reality, we would have at least two distinct goals: acquiring truths, but also avoiding falsehoods. The two are not the same, since if we were interested only in the former, we would believe everything, not worrying about how many false beliefs we thereby obtained, whereas if we cared only about the latter, we would believe nothing, for that would mean immediate success. »</ref>. Quand on poursuit la connaissance pour elle-même, on a en réalité deux objectifs distincts : acquérir des vérités et éviter les erreurs. Ces deux objectifs ne sont pas identiques. Si nous n'étions intéressés que par le premier, nous croirions tout, sans nous soucier des erreurs que nous accumulerions. Si nous ne nous soucions que du second, nous ne croirions rien, car ce serait le moyen le plus sûr d'éviter toute erreur. Ces deux options sont irrationnelles. Nous devons poursuivre les deux objectifs conjointement. Mais comme ils peuvent entrer en conflit (les méthodes pour acquérir des vérités produisent souvent des erreurs ; éviter les sources d'erreur peut signifier manquer certaines vérités), nous devons déterminer lequel doit avoir la priorité dans diverses circonstances. Différentes hiérarchisations, différentes « politiques cognitives », sont possibles. La hiérarchisation que Descartes adopte est évidente : si le moindre doute, le plus improbable, suffit à empêcher l'assentiment à une proposition, alors éviter l'erreur est toujours considéré comme prioritaire sur l'acquisition de vérités. Nous ne devons jamais chercher à satisfaire le second objectif sans nous être d'abord assurés d'avoir pleinement satisfait le premier. « La recherche de la vérité » est donc une expression trompeuse pour ce que Descartes avait en tête, puisque c'est éviter l'erreur qui était sa préoccupation première. ==== 7. Le caractère provisoire du traitement comme faux ==== Un aspect essentiel du principe méthodologique est son caractère provisoire. Descartes ne prétend pas que les opinions douteuses sont réellement fausses ; il décide de les ''traiter comme si'' elles étaient fausses, ''tant que'' leur certitude n'aura pas été établie. Cette distinction est essentielle. Le doute cartésien n'est pas un jugement sur la fausseté des opinions ; c'est une décision méthodologique de suspendre l'assentiment. En termes techniques, Descartes ne ''nie'' pas ses anciennes opinions ; il s'abstient de les ''affirmer''. La différence importe : nier, c'est affirmer le contraire ; s'abstenir, c'est ne rien affirmer du tout. Gueroult insiste sur ce point : le doute cartésien implique une « exclusion provisoire » (''exclusio provisoria'') des opinions du champ de la certitude, non leur rejet définitif<ref>Martial Gueroult, ''Descartes selon l'ordre des raisons'', op. cit., t. I, p. 33-34.</ref>. Les opinions ainsi exclues pourront être « réintroduites » plus tard, à leur rang, dans la « chaîne des raisons », une fois que les fondements auront été établis. C'est ce que Descartes appelle l'« ordre des raisons » : chaque vérité doit être établie à sa place, en s'appuyant sur les vérités précédemment démontrées. Ce caractère provisoire distingue nettement le doute cartésien du scepticisme pyrrhonien. Pour les pyrrhoniens, la suspension du jugement (''epochè'') était une fin en soi, censée procurer la tranquillité de l'âme (''ataraxia''). Pour Descartes, la suspension est un moyen en vue d'une fin : l'établissement de certitudes nouvelles. Le doute cartésien est « méthodique » au sens où il est un instrument, une méthode, au service d'un projet dogmatique. ==== 8. Les quatre caractères du doute cartésien selon Gueroult ==== Dans son analyse classique, Martial Gueroult identifie quatre caractères du doute cartésien, qui découlent tous du principe méthodologique fondamental<ref>Martial Gueroult, ''Descartes selon l'ordre des raisons'', op. cit., t. I, p. 33 : « A 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> : Premièrement, le doute est méthodique. Il n'est pas un état psychologique (le sentiment d'incertitude), mais une décision volontaire (traiter comme faux ce qui n'est pas absolument certain). C'est un instrument au service d'un objectif : fonder la certitude du savoir. Deuxièmement, le doute est universel. Rien n'est exempté du doute tant que le doute n'est pas « radicalement impossible ». Cette universalité ne signifie pas que toutes les opinions sont effectivement fausses, mais que toutes doivent être soumises à l'épreuve du doute avant d'être admises. Troisièmement, le doute est radical. Les opinions douteuses ne sont pas simplement mises entre parenthèses ; elles sont « rejetées entièrement », traitées comme si elles étaient fausses. Cette exigence est nécessaire pour atteindre une certitude « entière » : « Si l'on veut aboutir à une certitude entière, il ne faut rien admettre en nous qui ne soit absolument certain. » Quatrièmement, le doute est provisoire. Son caractère méthodique fait de lui un simple instrument en vue de fonder le « dogmatisme de la science ». Une fois les fondements établis, les opinions provisoirement exclues pourront être réintroduites à leur rang dans l'ordre des raisons. ==== 9. La distinction théorie/pratique ==== Le principe méthodologique s'applique au domaine théorique, non au domaine pratique. Descartes le précise explicitement dans la suite de la Méditation : <blockquote> « [...] ce que je fais aujourd'hui [...] ne regarde que la connaissance, et non point l'action [...]. » (AT VII, 22) </blockquote> Cette distinction est essentielle. Dans le domaine pratique, où l'action est nécessaire et où l'on ne peut pas toujours attendre d'avoir une certitude absolue, Descartes admet qu'il faut se contenter de probabilités. C'est le sens de la « morale par provision » développée dans le ''Discours de la méthode'' : en attendant d'avoir établi des certitudes définitives, on peut et on doit agir selon des règles provisoires. Comme le note l'article « Doute » du ''Historical Dictionary of Descartes and Cartesian Philosophy'', Descartes « fait clairement comprendre que dans les affaires pratiques, nous ne devons pas attendre la certitude à laquelle nous avons droit dans le domaine de la science théorique »<ref>Roger Ariew, Dennis Des Chene et al. (dir.), ''Historical Dictionary of Descartes and Cartesian Philosophy'', op. cit., art. « Doubt », p. 120 : « Descartes makes it clear that in practical matters, we should not expect the certainty we are entitled to ask for in the domain of theoretical science. »</ref>. Le domaine pratique « relève de la volonté et est gouverné par l'autorité et l'obéissance, les sens, les sensations corporelles (faim, soif) et les passions ». Cette distinction permet à Descartes d'éviter l'objection d'« apraxie » qui avait embarrassé les sceptiques anciens. Si le doute s'étendait au domaine pratique, comment pourrait-on agir ? Descartes répond : le doute méthodique ne concerne que la théorie ; pour l'action, nous suivons les règles de la morale par provision. ==== 10. Le principe et la tradition sceptique ==== Le principe méthodologique cartésien s'inscrit dans la tradition sceptique, tout en s'en séparant nettement par sa finalité. Comme le souligne Deborah Brown dans son étude sur Descartes et le scepticisme, « une vue dominante est que, bien qu'il n'y ait pas de nouveaux arguments sceptiques dans le corpus cartésien, son intérêt purement "méthodologique" pour le scepticisme est nouveau »<ref>Deborah Brown, « Descartes and content skepticism », dans Karen Detlefsen (dir.), ''Descartes' Meditations: A Critical Guide'', op. cit., p. 25-26.</ref>. Les sceptiques anciens utilisaient des arguments similaires (la faillibilité des sens, l'argument du rêve, etc.) pour produire la suspension du jugement. Mais leur objectif était différent : ils cherchaient la « tranquillité de l'âme » (''ataraxia'') qui, selon eux, résultait de l'abandon de toute prétention au savoir. Descartes, au contraire, utilise les arguments sceptiques comme des instruments au service d'un projet anti-sceptique : trouver des certitudes qui résistent à tous les doutes. Cette différence de finalité a des conséquences importantes. Pour les sceptiques, le doute est une fin ; pour Descartes, il est un moyen. Pour les sceptiques, la suspension du jugement est définitive ; pour Descartes, elle est provisoire. Pour les sceptiques, l'absence de certitude est une libération ; pour Descartes, elle est un problème à résoudre. ==== 11. Le « comme faux » : fiction méthodologique ou jugement ? ==== L'expression « traiter comme faux » (''tanquam falsa rejicere'') a fait l'objet de discussions. Que signifie exactement traiter une opinion « comme » fausse ? Est-ce la juger fausse ? Ou est-ce adopter une attitude différente ? Certains critiques, comme Gassendi et plus tard Huet, ont objecté que traiter une opinion comme fausse, ce n'est plus douter mais « acquérir une nouvelle croyance ». Si parmi mes anciennes opinions il y en a de vraies (ce qui est probable), les traiter toutes comme fausses, c'est commettre une erreur, non l'éviter<ref>Pierre Gassendi, ''Disquisitio metaphysica'', dans ''Objectiones V'', AT VII, p. 257-258. Cf. Charles Larmore, « Descartes and skepticism », dans ''The Blackwell Guide'', op. cit., p. 24-25.</ref>. Descartes répond à cette objection en distinguant le jugement de la fiction méthodologique. Traiter une opinion comme fausse, ce n'est pas juger qu'elle est fausse ; c'est ''faire comme si'' elle était fausse, dans le cadre d'une expérience de pensée. De même qu'un géomètre peut supposer, pour les besoins d'une démonstration, qu'un triangle a certaines propriétés, sans affirmer que ces propriétés existent réellement, le méditant peut supposer que ses opinions sont fausses, sans affirmer qu'elles le sont. Gueroult compare cette fiction méthodologique aux « constructions fictives de la géométrie ou de l'astronomie qui permettent d'effectuer les calculs et les démonstrations »<ref>Martial Gueroult, ''Descartes selon l'ordre des raisons'', op. cit., t. I, p. 39.</ref>. Le malin génie lui-même, introduit à la fin de la Première Méditation, est une telle fiction : non pas une thèse sur l'existence d'un être trompeur, mais un « artifice » méthodologique permettant de maintenir le doute. ==== 12. L'assentiment et la volonté ==== Le principe méthodologique présuppose une certaine conception de l'assentiment (''assensio'') et de son rapport à la volonté. Pour Descartes, donner son assentiment à une proposition, c'est-à-dire la tenir pour vraie, est un acte de la volonté, non une réponse passive de l'intellect. Cette conception sera développée dans la Quatrième Méditation, mais elle est déjà à l'œuvre ici. Si l'assentiment était une réponse automatique de l'intellect aux preuves, nous ne pourrions pas décider de le suspendre. Mais parce que l'assentiment dépend de la volonté, nous pouvons choisir de le retenir, même face à des opinions qui semblent très probables. Comme le note Gueroult, c'est la volonté infinie de l'homme qui rend possible le doute hyperbolique<ref>Martial Gueroult, ''Descartes selon l'ordre des raisons'', op. cit., t. I, p. 39 : « la fiction volontaire, installant provisoirement, mais péremptoirement, la fausseté au cœur même de l'infini divin, donne au doute une portée absolument universelle. »</ref>. L'entendement humain, limité, est naturellement porté à affirmer ce qui lui paraît clair et distinct. Mais la volonté, qui est « infinie » en son genre (nous pouvons vouloir n'importe quoi), peut s'opposer à cette inclination naturelle et décider de suspendre l'assentiment. Le doute méthodique est ainsi un « effort contre nature » : il va à l'encontre de nos inclinations naturelles, grâce au pouvoir de la volonté. ==== 13. Le principe et l'ordre des raisons ==== Le principe méthodologique fondamental s'inscrit dans ce que Descartes appelle l'« ordre des raisons » (''ordo rationum''). Gueroult a montré que cet ordre est la clé de l'interprétation des ''Méditations'' : chaque thèse n'a de sens et de validité qu'à sa place dans la chaîne des raisons<ref>Martial Gueroult, ''Descartes selon l'ordre des raisons'', op. cit., t. I, p. 19-22.</ref>. Le principe méthodologique occupe une place précise dans cet ordre : il vient avant tout examen particulier des opinions. Il établit la règle selon laquelle cet examen va être conduit. Il est donc, en un sens, le « principe des principes » : la règle qui gouverne la recherche des principes. Mais ce principe lui-même, est-il certain ? Ne peut-on pas le mettre en doute ? Descartes semble le présupposer sans le démontrer. C'est une des raisons pour lesquelles il le présente comme un « dictamen de la raison » : « la raison me persuade » (''ratio me persuadet''). Il fait appel à une évidence rationnelle que le lecteur est invité à reconnaître. Cette circularité apparente a été critiquée. Si le principe doit être évident pour être accepté, et si l'évidence est précisément ce que le doute met en question, comment le principe peut-il échapper au doute qu'il prescrit ? Descartes répondrait sans doute que le principe n'est pas une « opinion » parmi d'autres, mais une règle de méthode ; il ne prétend pas décrire le monde, mais prescrire une procédure. À ce titre, il échappe au doute qui porte sur les opinions. ==== 14. Objections et défenses ==== Le principe méthodologique a fait l'objet de nombreuses objections au cours de l'histoire de la philosophie. L'objection du standard excessif : Pourquoi exiger l'indubitabilité absolue ? N'est-ce pas un standard impossible à atteindre, qui condamne toute connaissance empirique ? Hume et les empiristes ultérieurs ont soutenu qu'aucune croyance sur le monde extérieur ne peut atteindre ce standard, et qu'il faut donc le réviser à la baisse. L'objection de la régression : Si le principe lui-même doit être certain pour être appliqué, comment établir sa certitude ? Par un autre principe ? Mais alors, comment établir la certitude de ce second principe ? On entre dans une régression à l'infini. L'objection pragmatiste : Le standard d'indubitabilité est peut-être approprié pour la « pure enquête », mais existe-t-il vraiment une « pure enquête », séparée de toute préoccupation pratique ? Les pragmatistes, de Peirce à Dewey, ont soutenu que toute enquête est motivée par des problèmes pratiques et doit être évaluée en fonction de ses résultats pratiques. L'objection holiste : Le principe présuppose que nous pouvons examiner nos croyances une par une (ou par groupes, selon leurs « principes »). Mais nos croyances forment-elles vraiment une structure hiérarchique, avec des « fondements » et une « superstructure » ? Les holistes, de Quine à Davidson, ont soutenu que nos croyances forment un réseau où tout se tient, sans fondement absolu<ref>Sur ces objections, voir Bernard Williams, ''Descartes: The Project of Pure Enquiry'', op. cit., chap. 2 ; Charles Larmore, « The First Meditation », op. cit., p. 64-65.</ref>. Descartes aurait des réponses à chacune de ces objections, mais leur examen dépasserait le cadre de ce commentaire. Notons simplement que le principe méthodologique, malgré ces critiques, a exercé une influence considérable sur toute la philosophie moderne, définissant les termes dans lesquels le problème de la connaissance allait être posé pendant des siècles. ==== 15. Portée philosophique du principe ==== Le principe méthodologique fondamental a une portée philosophique qui dépasse le cadre des ''Méditations''. Il inaugure ce que l'on peut appeler l'« épistémologie moderne », caractérisée par les traits suivants : La primauté de la question de la certitude : Avant de se demander ce que nous connaissons, il faut se demander ce que nous pouvons connaître avec certitude. La question « Qu'est-ce qui est certain ? » précède la question « Qu'est-ce qui est vrai ? ». Le doute comme méthode : Le doute n'est pas un obstacle à la connaissance, mais un instrument pour y parvenir. En éliminant ce qui peut être mis en doute, on isole ce qui résiste au doute et peut servir de fondement. L'individualisme épistémique : C'est le sujet individuel qui doit examiner ses croyances et décider de ce qui est certain. La tradition, l'autorité, le consensus social ne sont pas des garanties de vérité. Chacun doit refaire pour son compte le travail de fondation. Le fondationnalisme : La connaissance a une structure hiérarchique, avec des croyances « de base » qui fondent toutes les autres. L'objectif de l'enquête est d'identifier ces croyances de base et de reconstruire l'édifice du savoir à partir d'elles. Ces traits ont dominé la philosophie moderne de Descartes à Kant, et même au-delà. Même les philosophes qui ont contesté tel ou tel aspect du cartésianisme ont souvent accepté le cadre général défini par le principe méthodologique. C'est pourquoi ce principe peut être considéré comme l'un des textes fondateurs de la modernité philosophique. == II. Le doute portant sur les sens (§ 3-4) == === A. Le premier argument : l'erreur des sens === ==== 1. L'identification des sens comme fondement du savoir ==== <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 [...]. » </blockquote> Avant d'attaquer les sens, Descartes établit leur statut épistémologique fondamental. Cette phrase, apparemment anodine, contient une thèse lourde de conséquences : les sens sont le « fondement » (''fundamentum'') sur lequel repose tout notre savoir. La formulation est soigneusement construite. « Ce que j'ai reçu pour le plus vrai et assuré » désigne les croyances qui jouissent du plus haut degré de certitude subjective, celles auxquelles nous adhérons avec le plus de confiance. Or ces croyances, affirme le méditant, ont toutes été acquises « des sens, ou par les sens » (''a sensibus, vel per sensus''). La distinction est importante : certaines croyances viennent directement des sens (la perception immédiate des qualités sensibles des objets) ; d'autres viennent indirectement par les sens (le témoignage d'autrui, les livres, l'enseignement, qui passent tous par l'audition ou la vision). Cette thèse n'est pas inventée par Descartes ; elle représente la position dominante de son époque. L'adage scolastique ''nihil est in intellectu quod non prius fuerit in sensu'' (« il n'y a rien dans l'intellect qui n'ait d'abord été dans les sens ») résumait l'épistémologie aristotélicienne enseignée dans les universités. Selon cette conception, l'intellect humain est initialement une « table rase » ; il ne peut opérer qu'à partir de matériaux fournis par les sens. Même pour penser Dieu ou les êtres immatériels, l'intellect doit s'appuyer sur des images sensibles (''phantasmata''). Comme le souligne Gary Hatfield dans son commentaire des ''Méditations'', Descartes lui-même, au moment où il écrit ce texte, ne partage plus cette position. Il a déjà élaboré sa théorie des idées innées et sa conception de l'intellect pur. Mais il fait parler ici un « débutant en philosophie » (''qui modo primum philosophari incipit''), quelqu'un qui n'a pas encore découvert les ressources de l'entendement et qui adhère spontanément à l'empirisme du sens commun. C'est ce « débutant » que les ''Méditations'' vont conduire, pas à pas, vers une nouvelle conception du savoir. Le projet d'attaquer les sens est donc, dès le départ, anti-aristotélicien. Si l'on peut montrer que les sens ne fournissent pas de fondement certain, c'est toute l'épistémologie scolastique qui s'effondre. Descartes ne l'annonce pas explicitement (les ''Méditations'' sont dédiées à la Faculté de théologie de Paris, bastion de l'aristotélisme), mais c'est bien de cela qu'il s'agit. Le « retrait de l'esprit hors des sens » (''mentem a sensibus abducere'') que Descartes annonce dans le Synopsis constitue une rupture de grande portée avec la philosophie de l'École. ==== 2. La structure de l'argument et la critique de la prudence épistémique ==== <blockquote> « [...] 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> L'argument peut être reconstruit sous forme syllogistique : # Prémisse majeure (principe de prudence) : Il est prudent de ne jamais se fier entièrement à ceux qui nous ont trompés, même une seule fois. # Prémisse mineure (fait d'expérience) : Les sens m'ont quelquefois trompé. # Conclusion : Il n'est pas prudent de se fier entièrement aux sens. Cette structure apparemment simple mérite un examen attentif. La prémisse majeure énonce un principe de prudence (''prudentia'') emprunté au domaine moral et transposé au domaine épistémique. Dans la vie courante, nous appliquons ce principe aux témoins : si quelqu'un nous a menti une fois, nous hésitons à le croire à l'avenir. Descartes étend ce principe aux facultés cognitives : si les sens nous ont trompés une fois, nous devons nous méfier d'eux en général. Mais ce principe est-il raisonnable ? Ordinairement, nous ne l'appliquons pas de manière aussi stricte. Un ami qui nous a menti une fois par politesse ne perd pas toute crédibilité. Nous distinguons les contextes : on peut faire confiance à quelqu'un pour les choses importantes tout en sachant qu'il enjolive parfois la vérité dans les détails. De même, pourquoi ne pas distinguer les contextes où les sens sont fiables de ceux où ils ne le sont pas ? La réponse de Descartes tient au niveau d'exigence qu'il s'est fixé. Il ne cherche pas des croyances « probables » ou « raisonnables », mais des croyances « absolument certaines et indubitables ». Dans cette perspective, le moindre risque d'erreur suffit à disqualifier une source. Le principe de prudence, appliqué avec cette rigueur, conduit à rejeter tout ce qui n'est pas infaillible. Ce standard extraordinairement élevé, qui exige l'indubitabilité absolue, révèle le degré de certitude que Descartes s'est fixé. Il reflète son ambition fondationnaliste : construire les sciences sur des bases inébranlables, où toute certitude repose sur des fondements que nul doute ultérieur ne pourrait ébranler. La prémisse mineure fait appel à l'expérience. Descartes affirme avoir « quelquefois » (''interdum'') constaté que les sens le trompaient. Le terme ''interdum'' est significatif : il ne s'agit pas d'une erreur isolée, mais d'un fait récurrent. Les sens nous trompent « de temps en temps », avec une certaine régularité. ==== 3. Les exemples d'illusions sensibles et le contexte sceptique ==== Descartes ne donne pas d'exemples dans la Première Méditation elle-même, mais il en fournit dans d'autres textes. La Sixième Méditation mentionne le cas classique de la tour carrée qui paraît ronde vue de loin. D'autres exemples peuvent être tirés de la ''Dioptrique'' et des ''Principes'' : Les illusions de distance et de taille : Un objet éloigné paraît plus petit qu'un objet proche de même taille réelle. Le soleil et la lune semblent avoir la taille d'une assiette, alors qu'ils sont immensément plus grands que la terre. Les étoiles paraissent minuscules alors qu'elles sont gigantesques. Les illusions de forme : Un bâton plongé dans l'eau paraît brisé. Un cercle vu de biais paraît elliptique. Les illusions de couleur : Un objet change de couleur apparente selon l'éclairage. Les illusions tactiles : Une même eau peut paraître chaude à une main froide et froide à une main chaude. Ces exemples relèvent de ce que les sceptiques anciens appelaient les « tropes » ou « modes » de la suspension du jugement. Sextus Empiricus, dans ses ''Esquisses pyrrhoniennes'', avait systématiquement catalogué les variations de la perception selon les conditions (distance, position, état du sujet, mélange avec d'autres objets, etc.). C'est principalement le cinquième trope, celui « des positions, des distances et des lieux », que Descartes mobilise ici, même s'il ne le nomme pas explicitement. La tour carrée qui paraît ronde de loin, les étoiles qui semblent petites, le bâton qui paraît brisé dans l'eau : tous ces exemples illustrent la relativité de la perception aux conditions d'observation, ce qui « manque donc de l'objectivité qui caractérise la connaissance vraie », comme le notent Thomas Lennon et Michael Hickson. Cependant, Descartes ne tire pas les mêmes conclusions que les pyrrhoniens. Pour les sceptiques, la relativité de la perception conduit à la suspension définitive du jugement. Pour Descartes, la mise en évidence de la faillibilité des sens est une étape ''provisoire'' dans la recherche d'un fondement ''plus solide''. Cette différence de finalité explique pourquoi Descartes ne s'attarde pas sur les tropes pyrrhoniens. Il les mentionne de manière « allusive », non pour développer un scepticisme systématique, mais pour préparer le passage à un niveau de doute supérieur. ==== 4. La portée limitée du premier argument et l'introduction de l'objection ==== L'argument de l'erreur des sens a une portée limitée, que Descartes reconnaît immédiatement. Les cas d'illusion concernent principalement des « choses peu sensibles et fort éloignées » (''de iis, quae exigua sunt, vel remote''). La tour paraît ronde parce qu'elle est ''loin'' ; le bâton paraît brisé parce que la réfraction dans l'eau ''déforme'' l'image. Cette observation suggère une stratégie de défense pour l'empiriste : peut-être les sens ne sont-ils pas fiables pour les objets petits ou éloignés, mais ils le sont pour les objets proches et de taille moyenne, perçus dans des conditions normales. C'est pourquoi Descartes formule lui-même l'objection la plus naturelle à son premier argument : <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> Certes, les sens nous trompent parfois dans des conditions défavorables (objets petits, éloignés, mal éclairés), mais qu'en est-il des perceptions immédiates, dans des conditions optimales ? Peut-on raisonnablement douter que je sois « ici, assis auprès du feu, vêtu d'une robe de chambre, ayant ce papier entre les mains » ? L'adverbe « raisonnablement » est essentiel : le doute doit être raisonnable ; un doute qui s'étendrait à toutes les perceptions, même les plus évidentes, serait déraisonnable, voire pathologique. === B. La scène paradigmatique du doute sur l'évidence sensible === ==== 1. Le philosophe auprès du feu : construction d'une certitude apparemment inébranlable ==== <blockquote> « [...] que je sois ici, assis auprès du feu, vêtu d'une robe de chambre, ayant ce papier entre les mains [...]. » </blockquote> Cette description est l'une des plus célèbres de l'histoire de la philosophie. Elle constitue une scène paradigmatique de certitude sensible, un tableau qui rassemble tous les éléments censés garantir la fiabilité maximale de la perception. La scène est remarquablement concrète et quotidienne : ce n'est pas une expérience de laboratoire, ni une situation exceptionnelle ; c'est la situation ordinaire d'un homme cultivé du XVIIe siècle, dans son cabinet de travail. Tous les éléments sont choisis pour maximiser la fiabilité de la perception : la proximité spatiale (les objets sont à portée immédiate), la taille moyenne (il ne s'agit pas d'objets minuscules), les conditions d'observation normales (le méditant est éveillé, attentif, dans un environnement familier et bien éclairé par le feu), la familiarité des objets (ce sont des objets quotidiens, bien connus, sans ambiguïté), la convergence des sens (le méditant voit le feu, sent sa chaleur, touche le papier), et enfin l'implication corporelle (le méditant perçoit non seulement des objets extérieurs, mais aussi son propre corps en situation). Comme le souligne Gary Hatfield, cette accumulation d'éléments favorables semble rendre le doute impossible. Si l'on ne peut pas faire confiance aux sens dans ces conditions, peut-on jamais leur faire confiance ? La scène a une dimension autobiographique évidente (on imagine Descartes lui-même dans sa retraite hollandaise), mais aussi une dimension exemplaire : chaque lecteur peut se reconnaître dans cette situation ou dans une situation analogue, rendant la question « puis-je douter de cela ? » personnelle. La scène fonctionne ainsi comme un cas limite : si ce cas résiste au doute, l'empirisme est sauvé ; s'il cède, l'empirisme s'effondre. ==== 2. L'hypothèse de la folie : impossibilité et rejet méthodologique ==== <blockquote> « Et comment est-ce que je pourrais nier que ces mains et ce corps-ci soient à moi ? si ce n'est peut-être que je me compare à ces insensés, de qui le cerveau est tellement troublé et offusqué par les noires vapeurs de la bile, qu'ils assurent constamment qu'ils sont des rois, lorsqu'ils sont très pauvres ; qu'ils sont vêtus d'or et de pourpre, lorsqu'ils sont tout nus ; ou s'imaginent être des cruches, ou avoir un corps de verre. » </blockquote> Pour douter de perceptions aussi évidentes, il faudrait être fou. Descartes introduit alors l'hypothèse de la folie (''amentia'', ''dementia'') comme seule possibilité apparente de douter de ces évidences. Il décrit les fous selon la conception médicale de son époque : leur cerveau est « troublé et offusqué par les noires vapeurs de la bile », explication humorale héritée de la médecine antique, où la bile noire (l'atrabile) est la cause de la mélancolie. Les exemples illustrent deux types de délire : le délire sur les circonstances (se croire roi quand on est pauvre, vêtu d'or quand on est nu) et le délire sur le corps propre (s'imaginer être une cruche ou avoir un corps de verre). Le délire du « corps de verre » était un trouble bien repéré à la Renaissance et à l'âge classique ; le cas le plus fameux est celui du roi Charles VI de France, mais Descartes reprend ici un exemple devenu courant dans la littérature médicale, sans le rattacher à un cas particulier. Mais Descartes rejette immédiatement cette hypothèse : <blockquote> « Mais quoi ? ce sont des fous ; et je ne serais pas moins extravagant, si je me réglais sur leurs exemples. » </blockquote> Ce rejet a suscité des débats philosophiques importants. Pourquoi Descartes écarte-t-il si rapidement l'hypothèse de la folie, alors qu'il prendra au sérieux l'hypothèse du rêve et même celle du malin génie ? Plusieurs interprétations complémentaires l'expliquent : L'interprétation méthodologique (Frankfurt, Ablondi) : L'hypothèse de la folie détruirait la rationalité elle-même. Si je suis fou, je ne peux pas raisonner correctement, et donc je ne peux pas conduire une méditation philosophique. L'entreprise des ''Méditations'' présuppose un lecteur sain d'esprit, capable de suivre des arguments. Prendre au sérieux l'hypothèse de la folie, ce serait « mettre fin à l'ouvrage avant même qu'il ait commencé ». Le doute cartésien est un doute ''raisonnable'' : il procède par arguments, examine des hypothèses, tire des conclusions. Or, le fou ne raisonne pas ; il délire. L'interprétation de l'universalité (Lennon et Hickson) : L'argument de la folie manque d'universalité. L'argument de l'erreur des sens nous fait réaliser que « nous tous, parfois, sommes trompés par les sens ». L'argument de la folie ne fait réaliser que « certains d'entre nous, parfois, sont trompés par les sens ». Les fous sont une exception, non la norme. Supposer que « les vapeurs persistantes ont atteint la tête de tout le monde, ou de quelqu'un en particulier » est « peut-être, comme le dit Descartes, lui-même un signe de folie ». La folie est une condition pathologique qui affecte certains individus, non une possibilité ''universelle''. L'interprétation dialogique (Larmore) : Celui qui rejette l'hypothèse de la folie n'est pas Descartes lui-même, mais le « méditant empiriste » qui, à ce stade du texte, croit encore que les sens sont la base de toute connaissance. Pour cet empiriste, il est rationnel de rejeter l'hypothèse de la folie : la perception normale des objets proches fait partie de son cadre de référence, et il serait absurde de le remettre en question sur la base d'un cas pathologique. Enfin, Michel Foucault et Jacques Derrida ont mené un célèbre débat sur ce passage. Pour Foucault (''Histoire de la folie'', 1961), le rejet cartésien de la folie inaugure l'« âge classique » qui exclut la déraison du champ de la pensée légitime. Pour Derrida (« Cogito et histoire de la folie », 1963), au contraire, le ''cogito'' cartésien résiste même à l'hypothèse de la folie : même si je suis fou, je pense, donc je suis. La folie n'est pas exclue ; elle est intégrée et dépassée par le ''cogito''. Le doute hyperbolique va même plus loin, en envisageant une tromperie universelle qui rendrait fou même les sains d'esprit. ==== 3. La transition vers l'argument du rêve : le passage du pathologique au naturel ==== <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> La transition de la folie au rêve est remarquable par sa fluidité et son ingéniosité. Descartes refuse de « se régler sur l'exemple des fous », mais il reconnaît immédiatement qu'en tant qu'« homme », il a « coutume de dormir » et de vivre en rêve des expériences comparables à celles des fous, « ou quelquefois de moins vraisemblables ». Ce que le fou vit à l'état de veille (des perceptions fausses qu'il croit vraies), l'homme normal le vit en rêve. La distinction entre folie et rêve est centrale pour comprendre la logique du doute cartésien. Ces deux hypothèses semblent similaires (toutes deux impliquent des perceptions fausses que le sujet croit vraies), mais elles diffèrent profondément. La folie est pathologique (affecte certains individus, résulte d'un dérangement cérébral, détruit la rationalité) ; le rêve est naturel et universel (tout le monde rêve, fait partie de la condition humaine normale, préserve la rationalité puisqu'on peut raisonner sur les rêves). De même, la folie est un doute gratuit (supposer qu'on est fou sans raison est arbitraire), tandis que le rêve est un doute raisonnable (supposer qu'on rêve, alors qu'on rêve régulièrement et que nos rêves sont parfois très vivaces, a des fondements dans l'expérience). L'expression « les mêmes choses, ou quelquefois de moins vraisemblables » est significative : les rêves peuvent être encore plus extravagants que les délires des fous. On peut rêver qu'on vole, qu'on traverse des murs, qu'on parle avec des morts. L'imagination onirique n'a pas de limites. Comme le concluent Lennon et Hickson : « L'argument du rêve fournit un argument de relativité qui montre à tous les lecteurs des ''Méditations'' que nous tous, au moins parfois, sommes trompés par les sens à propos de nous-mêmes. C'est un doute raisonnable parce que dormir et rêver font partie de la vie de chacun. » Cette transition accomplit ce que l'argument de la folie ne pouvait pas faire : elle permet de douter des perceptions les plus évidentes (être assis auprès du feu, avoir des mains, un corps) sans sortir du cadre de la raison. Car le rêve est une expérience universelle et normale ; reconnaître qu'on rêve, ce n'est pas s'avouer fou. ==== 4. La structure dialectique du premier argument ==== La progression de la Première Méditation illustre une structure dialectique caractéristique de la méthode cartésienne. Chaque niveau de certitude est testé, objecté, puis dépassé par un niveau de doute supérieur : # Premier niveau (erreur des sens) : Les sens nous trompent ''parfois'', sur les objets petits ou éloignés. → Le doute est partiel. # Deuxième niveau (l'évidence sensible immédiate) : Mais qu'en est-il des perceptions des objets proches et de taille moyenne ? → L'objection défend ces perceptions. # Troisième niveau (argument du rêve) : L'expérience entière pourrait être un rêve. → Le doute s'étend à toutes les perceptions sensibles. # Quatrième niveau (hypothèse du Dieu trompeur / malin génie) : Même les vérités mathématiques pourraient être fausses. → Le doute devient universel. L'argument de l'erreur des sens est ainsi la première étape d'une escalade du doute qui ne s'arrêtera qu'avec l'hypothèse du malin génie. Chaque étape englobe et dépasse la précédente, jusqu'à ce que rien ne soit épargné. ==== 5. Portée pédagogique et philosophique ==== L'objection de l'évidence sensible immédiate a une fonction pédagogique essentielle : elle permet au lecteur de formuler sa propre résistance au doute, avant de voir cette résistance surmontée. Un lecteur qui lirait l'argument de l'erreur des sens pourrait se dire : « Certes, les sens me trompent parfois sur les objets éloignés, mais pas sur ce que je perçois ici et maintenant. » En formulant explicitement cette objection, Descartes montre qu'il l'a anticipée. Le lecteur se sent compris ; sa résistance est prise au sérieux. Puis, en surmontant l'objection par l'argument du rêve, Descartes conduit le lecteur à abandonner sa résistance. Sur le plan philosophique, l'argument de l'erreur des sens pose plusieurs questions fondamentales : qu'est-ce qui rend une perception « certaine » ? qu'est-ce que la « normalité » cognitive ? comment se fonde la confiance épistémique ? Ces questions traversent toute la philosophie moderne, de Locke à Kant. L'argument accomplit plusieurs fonctions dans l'économie des ''Méditations'' : il identifie les sens comme le « fondement » apparent du savoir et amorce la critique de ce fondement ; il introduit la logique du doute méthodique ; il établit une hiérarchie des certitudes ; il introduit la distinction entre le doute raisonnable et le doute déraisonnable ; il pose la question de la confiance épistémique. L'argument de l'erreur des sens est donc bien plus qu'un préliminaire rhétorique : il établit les coordonnées du problème épistémologique que les ''Méditations'' vont traiter. == III. L'argument du rêve (§ 5-7) == === A. 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> Descartes introduit ici l'argument du rêve, l'un des plus célèbres de l'histoire de la philosophie. La transition est subtile : ce que le philosophe refuse d'envisager comme folie, il l'accepte comme rêve. Le rêve est une expérience universelle (« je suis homme »), contrairement à la folie qui affecte certains individus seulement. Chaque nuit, nous vivons des expériences comparables à celles des fous : nous croyons percevoir des choses qui n'existent pas. <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> L'exemple est frappant par son parallélisme avec la situation décrite précédemment. Les mêmes détails (le lieu, les vêtements, le feu) qui semblaient garantir la réalité de l'expérience actuelle peuvent être présents dans un rêve. Le rêve reproduit les conditions mêmes de l'évidence sensible : dans le rêve, je crois aussi être éveillé. <blockquote> « Il me semble bien à présent que ce n'est point avec des yeux endormis que je regarde ce papier ; que cette tête que je remue n'est point assoupie ; que c'est avec dessein et de propos délibéré que j'étends cette main, et que je la sens : ce qui arrive dans le sommeil ne semble point si clair ni si distinct que tout ceci. » </blockquote> Descartes tente une contre-objection : l'expérience actuelle possède une clarté et une distinction que le rêve n'a pas. Les mouvements sont volontaires (« avec dessein et de propos délibéré »), les perceptions sont nettes. Mais cette distinction ne tient pas, comme la suite le montre. <blockquote> « Mais, en y pensant soigneusement, je me ressouviens d'avoir été souvent trompé, lorsque je dormais, par de semblables illusions. Et m'arrêtant sur cette pensée, 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 vertigineuse : il n'existe aucun critère permettant de distinguer avec certitude la veille du sommeil. L'argument ne prétend pas que nous rêvons actuellement, mais qu'il n'y a pas de « marques certaines » pour l'exclure. L'étonnement (le texte latin dit ''obstupescam'', « je reste frappé de stupeur ») n'est pas ici l'émerveillement serein qui, chez Aristote, donne naissance à la recherche philosophique. C'est plutôt un trouble, un vertige : celui d'un esprit qui ne trouve plus aucun appui pour départager le rêve et la veille. Loin d'ouvrir la pensée, cette stupeur la déséquilibre, et c'est ce déséquilibre même qui fait avancer le doute. La formule finale est paradoxale : l'étonnement est « presque capable de me persuader que je dors ». Ce « presque » est important. Descartes ne conclut pas qu'il dort, mais que la possibilité du rêve suffit à rendre douteuses toutes les perceptions sensibles. Le doute est hyperbolique : il va au-delà de ce que la raison commune accepterait. === B. Ce qui résiste au doute du rêve : l'analogie du peintre === <blockquote> « Supposons donc maintenant que nous sommes endormis, et que toutes ces particularités-ci, à savoir, que nous ouvrons les yeux, que nous remuons la tête, que nous étendons les mains, et choses semblables, ne sont que de fausses illusions [...]. 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> Descartes accepte de supposer qu'il rêve. Même les éléments les plus évidents (ouvrir les yeux, remuer la tête, étendre les mains) pourraient être des illusions. Mais cette concession n'est pas totale. Les images du rêve, comme les tableaux des peintres, doivent « ressembler » à quelque chose de réel. Le rêve ne crée pas ''ex nihilo'' ; il recompose des éléments qui ont une origine dans le réel. <blockquote> « Car de vrai les peintres, lors même qu'ils s'étudient avec le plus d'artifice à représenter des sirènes et des satyres par des formes bizarres et extraordinaires, ne leur peuvent pas toutefois attribuer des formes et des natures entièrement nouvelles, mais font seulement un certain mélange et composition des membres de divers animaux. » </blockquote> L'analogie du peintre est cruciale. Même les représentations les plus fantastiques (sirènes, satyres) résultent d'une combinaison d'éléments empruntés à la réalité. Le peintre ne peut « attribuer des formes et des natures entièrement nouvelles » ; il recompose ce qui existe déjà. Ainsi, le rêve le plus extravagant présuppose des éléments simples qui, eux, doivent être réels. <blockquote> « Ou bien, si peut-être leur imagination est assez extravagante pour inventer quelque chose de si nouveau, que jamais nous n'ayons rien vu de semblable [...], certes à tout le moins les couleurs dont ils le composent doivent-elles être véritables. » </blockquote> Descartes envisage même le cas limite où l'invention serait totalement nouvelle. Même alors, les « couleurs » (c'est-à-dire les éléments les plus simples et les plus généraux de la composition) doivent être véritables. On atteint ici une limite du doute du rêve : il ne peut pas affecter les « natures simples ». == IV. La distinction entre sciences composées et sciences simples (§ 8-9) == === A. Les natures simples et universelles === <blockquote> « Et par la même raison, encore que ces choses générales, à savoir, des yeux, une tête, des mains, et autres semblables, pussent être imaginaires, il faut toutefois avouer qu'il y a des choses encore plus simples et plus universelles, qui sont vraies et existantes [...]. 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> Descartes dresse ici la liste des « natures simples et universelles » qui résistent au doute du rêve. Ces notions sont : * la nature corporelle (l'étendue) * la figure * la quantité * le nombre * le lieu * le temps Ces concepts sont communs à tout ce qui peut être représenté, réel ou imaginaire. Ils constituent le matériau élémentaire de toute représentation possible. Le concept d'« étendue » (''extensio'') est particulièrement important dans la philosophie cartésienne. Il deviendra l'attribut principal de la substance matérielle, définissant l'essence des corps. Ici, Descartes note simplement que l'étendue est présupposée par toute représentation spatiale, qu'elle soit vraie ou fausse. === B. La hiérarchie des sciences === <blockquote> « C'est pourquoi peut-être que de là nous ne conclurons pas mal, si nous disons que 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 que 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> Ce passage établit une distinction épistémologique fondamentale. Les sciences « composées » (physique, astronomie, médecine) dépendent de l'existence réelle de leurs objets ; elles sont donc affectées par le doute du rêve. Les sciences « simples » (arithmétique, géométrie) ne traitent que de relations entre concepts, indépendamment de leur réalisation dans la nature. La formule « sans se mettre beaucoup en peine si elles sont dans la nature, ou si elles n'y sont pas » est remarquable. Elle caractérise les mathématiques comme des sciences purement formelles, dont la validité ne dépend pas de l'existence des objets étudiés. Que je rêve ou non, les propriétés du triangle restent les mêmes. <blockquote> « Car, 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 ; et il ne semble pas possible que des vérités si apparentes puissent être soupçonnées d'aucune fausseté ou d'incertitude. » </blockquote> Les exemples sont élémentaires : 2 + 3 = 5, le carré a quatre côtés. Ces vérités mathématiques semblent immunisées contre le doute. Leur évidence est telle qu'elle paraît inattaquable. Descartes a atteint ce qui semble être un roc de certitude, un point fixe sur lequel reconstruire le savoir. Mais le « il ne semble pas possible » (''nec fieri posse videtur'' en latin) laisse entrevoir que cette impossibilité n'est qu'apparente. Le doute n'est pas encore à son terme. Descartes va maintenant forger une hypothèse qui mettra en cause les vérités mathématiques elles-mêmes. == V. L'hypothèse du Dieu trompeur (§ 10-11) == === A. La toute-puissance divine et la possibilité de l'erreur universelle === <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, aucune figure, aucune grandeur, aucun lieu, et que néanmoins j'aie les sentiments de toutes ces choses, et que tout cela ne me semble point exister autrement que je le vois ? » </blockquote> Descartes introduit ici l'hypothèse du Dieu trompeur, l'argument le plus extrême de la Première Méditation. L'argument repose sur l'idée traditionnelle d'un Dieu tout-puissant. Si Dieu peut tout, rien ne l'empêche en principe de me faire percevoir un monde qui n'existe pas, de me faire croire que j'ai un corps alors que je n'en ai point. La liste des choses qui pourraient ne pas exister reprend les « natures simples » identifiées précédemment : terre, ciel, corps étendu, figure, grandeur, lieu. Même ces éléments fondamentaux de toute représentation spatiale pourraient être des illusions. Le doute atteint ici une profondeur vertigineuse : ce n'est plus seulement la réalité du monde extérieur qui est en question, mais la structure même de notre représentation. <blockquote> « Et même, comme je juge quelquefois que les autres se méprennent, même dans les choses qu'ils pensent savoir avec le plus de certitude, 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é, ou que je juge de quelque chose encore plus facile, si l'on se peut imaginer rien de plus facile que cela. » </blockquote> L'argument s'étend désormais aux vérités mathématiques. Descartes constate d'abord que les hommes se trompent parfois sur ce qu'ils croient savoir le plus certainement. Cette observation empirique ouvre une possibilité : peut-être que je me trompe moi-même sur les vérités les plus évidentes. Un Dieu tout-puissant pourrait faire en sorte que je me trompe à chaque calcul, même le plus simple. C'est le point culminant du doute : non seulement le monde extérieur, mais les vérités mathématiques elles-mêmes, les évidences rationnelles les plus certaines, deviennent douteuses. Le doute est désormais « hyperbolique », c'est-à-dire excessif, dépassant les limites du raisonnable. === B. L'objection de la bonté divine === <blockquote> « Mais peut-être que Dieu n'a pas voulu que je fusse déçu de la sorte, car il est dit souverainement bon. Toutefois, si cela répugnerait à sa bonté, de m'avoir fait tel que je me trompasse toujours, cela semblerait aussi lui être aucunement contraire, de permettre que je me trompe quelquefois, et néanmoins je ne puis douter qu'il ne le permette. » </blockquote> Descartes envisage une objection théologique : Dieu, étant souverainement bon, ne peut pas vouloir me tromper. Mais cette objection se retourne. Si la bonté divine est incompatible avec l'erreur permanente, pourquoi est-elle compatible avec l'erreur occasionnelle ? Or, nous nous trompons parfois : c'est un fait d'expérience. La bonté divine ne garantit donc pas l'absence d'erreur. Cet argument est subtil. Descartes ne nie pas la bonté de Dieu ; il montre que cette bonté, même admise, ne suffit pas à exclure la possibilité de l'erreur. Le problème du mal (ici, le mal épistémique qu'est l'erreur) reste entier. La théodicée ne résout pas le problème du doute. === C. L'extension aux athées === <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. Mais ne leur résistons pas pour le présent, et supposons, en leur faveur, que tout ce qui est dit ici d'un Dieu soit une fable. » </blockquote> Descartes anticipe une objection : certains pourraient préférer l'athéisme à l'acceptation d'une incertitude universelle. Mais cette échappatoire est vaine. Même si Dieu n'existe pas, le doute subsiste, voire se renforce. <blockquote> « Toutefois, de quelque façon qu'ils supposent que je sois parvenu à l'état et à l'être que je possède, soit qu'ils l'attribuent à quelque destin ou fatalité, soit qu'ils le réfèrent au hasard, soit qu'ils veuillent que ce soit par une continuelle suite et liaison des choses, il est certain que, puisque faillir et se tromper est une espèce d'imperfection, d'autant moins puissant sera l'auteur qu'ils attribueront à mon origine, d'autant plus sera-t-il probable que je suis tellement imparfait que je me trompe toujours. » </blockquote> L'argument est retourné de façon habile. Quelle que soit l'origine supposée de mon être (destin, hasard, nécessité naturelle), moins cette cause est parfaite, plus il est probable que son effet (moi) soit imparfait et sujet à l'erreur. L'athéisme, loin de restaurer la certitude, la compromet davantage. Sans un Dieu parfait pour garantir mes facultés, je suis livré à une imperfection peut-être sans remède. == VI. La conclusion du premier mouvement du doute (§ 12) == <blockquote> « Auxquelles raisons je n'ai certes rien à répondre, mais 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, et que je ne leur donne pas plus de créance, que je ferais à des choses qui me paraîtraient évidemment fausses, si je désire trouver quelque chose de constant et d'assuré dans les sciences. » </blockquote> Ce paragraphe marque la conclusion du premier mouvement de la méditation. Le résultat est total : « il n'y en a pas une » de mes anciennes opinions qui échappe au doute. Descartes insiste sur le caractère méthodique de cette suspension : elle ne procède pas de l'« inconsidération ou légèreté », mais de « raisons très fortes et mûrement considérées ». La formule « arrêter et suspendre mon jugement » (en grec, ''epochè'') rappelle le vocabulaire sceptique. Mais la finalité est inverse : Descartes suspend son jugement pour pouvoir ensuite établir des certitudes. La suspension est provisoire, non définitive. Le principe méthodologique du début est réaffirmé : ce qui est douteux doit être traité comme faux, si l'on veut « trouver quelque chose de constant et d'assuré dans les sciences ». Le doute est un instrument, non une fin en soi. == VII. La résistance des anciennes opinions (§ 13) == <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> Descartes fait ici une remarque de psychologie épistémique. Les anciennes opinions ont une force propre qui leur vient de l'habitude. Elles « reviennent » à l'esprit, « contre mon gré ». La métaphore est presque juridique : le « long et familier usage » leur donne un « droit » d'occuper l'esprit. Les croyances ne sont pas de simples contenus neutres ; elles ont une ''efficace'', une tendance à s'imposer. Ce passage révèle une conception de l'esprit comme champ de forces. La volonté de douter ne suffit pas à neutraliser les croyances ; celles-ci ont leur inertie propre. Le philosophe doit lutter contre cette tendance naturelle à retomber dans les certitudes familières. <blockquote> « Et je ne me désaccoutumerai jamais d'y acquiescer, et de prendre confiance en elles, tant que je les considérerai telles qu'elles sont en effet, c'est à savoir en quelque façon douteuses, comme je viens de montrer, 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 les anciennes opinions sont « fort probables ». Il serait plus raisonnable de les croire que de les nier. Mais la probabilité n'est pas la certitude. Pour les besoins de la recherche métaphysique, le probable doit être traité comme le faux. Cette exigence va contre le sens commun et contre la tendance naturelle de l'esprit. <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 contrebalancer la force des opinions probables, Descartes décide de « se tromper lui-même » volontairement. Il va « feindre » que tout est faux. Cette décision marque le passage du doute simplement méthodique au doute hyperbolique assumé. Il ne s'agit plus seulement de suspendre son jugement, mais d'adopter activement la position contraire aux croyances naturelles. L'image de la balance éclaire cette décision. L'esprit penche spontanément du côté des préjugés ; pour rétablir l'équilibre, et donc l'impartialité du jugement, il faut peser de l'autre côté. Le doute volontaire joue ce rôle de contrepoids. == VIII. L'hypothèse du malin génie (§ 14) == === A. L'invention d'une fiction méthodologique === <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> Descartes forge ici l'une des figures les plus célèbres de l'histoire de la philosophie : le « malin génie » (''genius malignus'' en latin). Ce n'est pas un Dieu trompeur (ce serait contradictoire avec l'idée de Dieu comme source de vérité), mais une entité maléfique, « non moins rusé et trompeur que puissant », dont la seule raison d'être est de me tromper. Pourquoi cette nouvelle hypothèse ? L'argument du Dieu trompeur posait un problème théologique : Dieu, par définition, ne peut pas être trompeur. Le malin génie contourne cette difficulté. C'est une pure fiction méthodologique, un outil pour maintenir le doute à son maximum d'intensité. Peu importe qu'une telle entité existe réellement ; il suffit qu'elle soit concevable pour que le doute soit justifié. <blockquote> « Je penserai que le ciel, l'air, la terre, les couleurs, les figures, les sons et toutes les choses extérieures que nous voyons, ne sont que des illusions et tromperies, dont il se sert pour surprendre ma crédulité. » </blockquote> Le champ d'action du malin génie est total. Tout ce qui constitue le monde extérieur (« le ciel, l'air, la terre ») mais aussi les qualités sensibles (« les couleurs, les figures, les sons ») sont potentiellement des « illusions et tromperies ». La réalité tout entière devient suspecte, un piège tendu à ma « crédulité ». <blockquote> « Je me considérerai moi-même comme n'ayant point de mains, point d'yeux, point de chair, point de sang, comme n'ayant aucun sens, mais croyant faussement avoir toutes ces choses. » </blockquote> Le doute atteint désormais mon propre corps. Je dois supposer que je n'ai « point de mains, point d'yeux, point de chair, point de sang ». Mon corps tout entier pourrait être une illusion. Seule subsiste une croyance fausse : « croyant faussement avoir toutes ces choses ». Mais cette croyance, elle, existe. Le mouvement vers le ''cogito'' est préparé, sans être encore explicité. === B. La résolution de maintenir le doute === <blockquote> « Je demeurerai obstinément attaché à cette pensée ; et 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. C'est pourquoi je prendrai garde soigneusement de ne point recevoir en ma croyance aucune fausseté, et préparerai si bien mon esprit à toutes les ruses de ce grand trompeur, que, pour puissant et rusé qu'il soit, il ne me pourra jamais rien imposer. » </blockquote> Descartes affirme sa résolution avec une détermination remarquable. L'adverbe « obstinément » traduit une volonté de fer. Même si aucune vérité ne peut être atteinte, au moins la suspension du jugement est possible. C'est un gain : en ne croyant à rien, on ne croit à rien de faux. Le malin génie ne peut « rien imposer » à celui qui refuse tout assentiment. On voit ici apparaître le rôle de la volonté dans le doute cartésien. Le doute n'est pas seulement un état intellectuel ; c'est une décision, un acte de la volonté. Face aux « ruses » du trompeur, l'esprit se met en position de défense active. La vigilance intellectuelle est une forme de vertu. == IX. La difficulté de maintenir le doute (§ 15) == === A. La paresse et l'attrait de la vie ordinaire === <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 fin de la méditation prend une tonalité plus personnelle. Descartes avoue la difficulté de maintenir le doute. Le projet est « pénible et laborieux ». Une « paresse » naturelle pousse à retourner à la « vie ordinaire », c'est-à-dire à l'attitude naturelle où l'on ne doute de rien. Le doute hyperbolique demande un effort constant, une tension contre les tendances spontanées de l'esprit. === B. La métaphore de l'esclave rêvant de liberté === <blockquote> « Et tout de même qu'un esclave qui jouissait dans le sommeil d'une liberté imaginaire, lorsqu'il commence à soupçonner que sa liberté n'est qu'un songe, 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 de cet assoupissement. » </blockquote> Cette métaphore finale est d'une grande richesse. 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. De même, nous préférons nos croyances confortables à l'inconfort du doute. Les « anciennes opinions » sont comme un sommeil dont nous ne voulons pas sortir. Mais la métaphore contient aussi une promesse. L'esclave qui se réveille découvre sa condition réelle ; c'est le premier pas vers une possible émancipation. Le philosophe qui s'éveille du sommeil dogmatique accède à une lucidité nouvelle. Le « réveil » est douloureux, mais nécessaire. <blockquote> « De peur que les veilles laborieuses qui succéderaient à la tranquillité de ce repos, au lieu de m'apporter quelque jour et quelque lumière dans la connaissance de la vérité, ne fussent pas suffisantes pour éclaircir toutes les ténèbres des difficultés qui viennent d'être agitées. » </blockquote> La méditation s'achève sur une note d'incertitude. Descartes craint que l'effort de réflexion (« les veilles laborieuses ») ne suffise pas à dissiper les « ténèbres » du doute. La lumière de la vérité est espérée, mais non garantie. Cette fin ouverte prépare la suite : la Seconde Méditation apportera effectivement une première lumière avec la découverte du ''cogito''. == Conclusion : portée et signification de la Première Méditation == === A. Le bilan du doute === La Première Méditation a accompli un travail de destruction systématique. Toutes les sources de connaissance ont été mises en doute : les sens (argument de l'erreur des sens), l'imagination (argument du rêve), et même l'entendement (hypothèse du Dieu trompeur et du malin génie). Rien ne subsiste de l'édifice des anciennes opinions. Le doute a progressé par cercles concentriques, du plus superficiel au plus profond. On peut distinguer trois niveaux : # Le doute empirique : les sens nous trompent parfois # Le doute onirique : je pourrais rêver # Le doute métaphysique : un être tout-puissant pourrait me tromper sur tout Chaque niveau engloutit le précédent et l'approfondit. === B. Les caractères du doute cartésien === Le doute cartésien présente des caractères distinctifs qui le distinguent du scepticisme antique et moderne : * ''Méthodique'' : c'est un instrument au service de la recherche de la vérité, non une fin en soi. * ''Hyperbolique'' : il va au-delà de ce que le bon sens commun accepterait, en traitant le simplement douteux comme certainement faux. * ''Provisoire'' : destiné à être surmonté, il prépare la reconstruction du savoir. * ''Volontaire'' : c'est une décision, un acte de la volonté qui résiste aux tendances naturelles de l'esprit. === C. La préparation de la Seconde Méditation === La Première Méditation s'achève dans les « ténèbres », mais elle a préparé la « lumière » qui viendra. En effet, le doute poussé à son comble a isolé un élément qui résiste ''implicitement'' à la destruction : l'acte même de douter. En supposant que je n'ai pas de corps, je suppose que je crois faussement avoir un corps ; 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. Le ''cogito'' (« Je pense, donc je suis ») émergera comme la première vérité absolument certaine, résistant à tous les arguments du doute. Le malin génie lui-même ne peut me tromper sur le fait que, tant que je pense, j'existe. La destruction opérée par la Première Méditation aura ainsi préparé la reconstruction. === D. L'héritage philosophique === L'influence de la Première Méditation sur l'histoire de la philosophie est immense. Elle inaugure la tradition de la « philosophie du sujet » qui domine la pensée moderne. En faisant de la certitude subjective le critère de la vérité, Descartes place le sujet connaissant au centre de la réflexion philosophique, dans un geste que l'on a souvent rapproché du renversement de perspective que Kant, plus tard, comparera à l'hypothèse de Copernic. Ce n'est plus l'objet seul qui détermine la connaissance ; c'est l'esprit qui examine qui devient le point de départ. Les arguments du doute ont été repris, discutés, critiqués par tous les grands philosophes ultérieurs. L'argument du rêve est devenu un classique de l'épistémologie. L'hypothèse du malin génie a été sécularisée dans les discussions contemporaines sur le « cerveau dans une cuve » ou sur la simulation informatique. La question que pose Descartes, celle de savoir comment distinguer l'illusion de la réalité, reste au cœur de la réflexion philosophique. Ainsi, la Première Méditation n'est pas seulement un moment dans l'itinéraire cartésien vers la vérité ; c'est un texte fondateur de la philosophie moderne, dont les questions gardent toute leur actualité. == Notes et Références == {{references|colonnes=2}} [[Catégorie:Commentaire_philosophique]] olg4vkpobo4thyt066e5iduuoeadxtk Dictionnaire de philosophie/A 0 30496 767965 767810 2026-06-18T04:08:01Z PandaMystique 119061 767965 wikitext text/x-wiki {{DicoPhilo |A}} <!-- Grille de contenu --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2em; width: 100%; margin-bottom: 2em;"> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :[[Dictionnaire de philosophie/A (logique)|A]] :[[Dictionnaire de philosophie/Abduction|Abduction]] ᕻ :[[Dictionnaire de philosophie/Aboulie|Aboulie]] :[[Dictionnaire de philosophie/Absolu|Absolu]] :[[Dictionnaire de philosophie/Absolutisme|Absolutisme]] ᕻ :[[Dictionnaire de philosophie/Abstraction|Abstraction]] ᕻ :[[Dictionnaire de philosophie/Absurde|Absurde]] ᕻ :Académie :[[Dictionnaire de philosophie/Acatalépsie|Acatalépsie]] ᕻ :[[Dictionnaire de philosophie/Accident|Accident]] :[[Manuel de terminale de philosophie/Acte/Puissance|Acte et Puissance]] <small>(M)</small> :[[Dictionnaire de philosophie/Action|Action]] :[[Dictionnaire de philosophie/Affection|Affection]] :''Afrique'' ::[[Dictionnaire de philosophie/Philosophie africaine|Philosophie africaine]] :[[Dictionnaire de philosophie/Agnosticisme|Agnosticisme]] :{{Page|Aliénation}} :[[Dictionnaire de philosophie/Altérité|Altérité]] :[[Dictionnaire de philosophie/Altruisme|Altruisme]] ᕻ :[[Dictionnaire de philosophie/Âme|Âme]] :[[Dictionnaire de philosophie/Amitié|Amitié]] </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :[[Dictionnaire de philosophie/Amour|Amour]] :Analogie :Analyse :Analytique :[[Dictionnaire de philosophie/Anarchisme|Anarchisme]] ᕻ :{{Page|Anaxagore}} :[[Dictionnaire de philosophie/Angoisse|Angoisse]] ᕻ :[[Dictionnaire de philosophie/Animal|Animal]] ::Communication animale ::Droits ::[[Dictionnaire de philosophie/Intelligence animale|Intelligence animale]] ᕻ :[[Dictionnaire de philosophie/Anthropocentrisme|Anthropocentrisme]] :[[Dictionnaire de philosophie/Antinomie|Antinomie]] :[[Dictionnaire de philosophie/Aporie|Aporie]] :[[Dictionnaire de philosophie/Apparence|Apparence]] :[[Dictionnaire de philosophie/A priori|A priori]] :[[Dictionnaire de philosophie/Argument|Argument]] ::[[Philosophie de l'esprit/Argument de la connaissance|— de la connaissance]] :[[Dictionnaire de philosophie/Argentine (Philosophie)|Argentine]] (philosophie au XX{{e}} siècle) </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :[[Dictionnaire de philosophie/Aristote|Aristote]] ::Aristotélisme :[[Dictionnaire de philosophie/Art (introduction)|Art]] (introduction) ::[[Dictionnaire de philosophie/Art|Art]] (contemporain) ::[[Dictionnaire de philosophie/Art et Vérité|Art et Vérité]] :[[Dictionnaire de philosophie/Ataraxie|Ataraxie]] :[[Dictionnaire de philosophie/Athéisme|Athéisme]] :Atome ::[[Dictionnaire de philosophie/Atomisme|Atomisme]] :{{Page|Attribut}} :[[Dictionnaire de philosophie/Authenticité|Authenticité]] :[[Dictionnaire de philosophie/Autonomie|Autonomie]] :[[Dictionnaire de philosophie/Autorité|Autorité]] :[[Philosophie/Autrui|Autrui]] <small>(M)</small> :[[Dictionnaire de philosophie/Avortement|Avortement]] (éthique) ᕻ :[[Dictionnaire de philosophie/Axiome|Axiome]] </div> </div> {{PhiloRecherche}} {{Autocat}} 4f5evwkjsuu48gsxabfqmj9m09euly9 Dictionnaire de philosophie/B 0 30554 767967 754051 2026-06-18T04:24:29Z PandaMystique 119061 767967 wikitext text/x-wiki {{DicoPhilo |B}} <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1.5em; width: 100%;"> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :[[Dictionnaire de philosophie/Bateau de Neurath|Bateau de Neurath]] :[[Dictionnaire de philosophie/Beau|Beau]] :Béhaviorisme :[[Dictionnaire de philosophie/Besoin|Besoin]] :[[Dictionnaire de philosophie/Bien|Bien]] </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Bien commun :[[Dictionnaire de philosophie/Bioéthique|Bioéthique]] ᕻ :Bon sens :[[Dictionnaire de philosophie/Bonheur|Bonheur]] </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> </div> </div> {{PhiloRecherche}} {{Autocat}} 5v2wkrf55cgcpuras3eqd9nw3ovgh7f Fonctionnement d'un ordinateur/Les circuits pour l'addition et la soustraction 0 65787 767924 767849 2026-06-17T13:46:15Z Mewtow 31375 /* L'additionneur complet basé sur une modification de la retenue sortante */ 767924 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 de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. 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 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 bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|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 |} On voit 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. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] 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''. 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]. ==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> relnjn99pfbqkoxk6iqvdpp3i1wyvc1 767925 767924 2026-06-17T13:53:04Z Mewtow 31375 /* L'additionneur complet basé sur une modification de la retenue sortante */ 767925 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. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. 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 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 bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|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 |} On voit 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. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] 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''. 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]. ==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> tgz01ofutevemepiaagvfjkzbi7t4bd 767929 767925 2026-06-17T14:12:39Z Mewtow 31375 /* L'additionneur complet basé sur une modification de la retenue sortante */ 767929 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. Le concevoir 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.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. 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 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 bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|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 |} On voit 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. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] 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''. 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]. ==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> o6ijzw1eqvdg2hz6hi2o4i42fesjfxj 767930 767929 2026-06-17T14:19:10Z Mewtow 31375 /* L'additionneur complet basé sur une modification de la retenue sortante */ 767930 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. 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 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 bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|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 |} On voit 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. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] 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''. 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]. ==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> 2vpd354ei88ybw7jv5oqa55mumw89nn 767948 767930 2026-06-17T18:36:25Z Mewtow 31375 /* Les incrémenteurs carry skip */ 767948 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. 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 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 bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|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 |} On voit 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. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[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 cela, regardons comment les retenues sont calculées, dans le cadre de l'incrémentation. La retenue sortant d'un demi-additionneur est formé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 remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. La raison à cela est qu'un demi-additionneur calcule le bit de somme en faisant un XOR entre retenue entrante et bit d'opérande. Le XOR étant un inverseur commandable, cela veut dire que le bit de somme est égal : soit au bit d'entrée si la retenue entrante vaut 0, son inverse si la retenue entrante vaut 1. Pour implanter cela en circuit, on a besoin d'un circuit qui détermine si les bits des colonnes précédentes sont à 1, qui n'est autre qu'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''. 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''. 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]. ==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> dgmugd9vfwu6ised9iz39zyf812vkub 767949 767948 2026-06-17T18:40:11Z Mewtow 31375 /* Les incrémenteurs à anticipation de retenue */ 767949 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. 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 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 bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|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 |} On voit 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. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[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 cela, regardons comment les retenues sont calculées, dans le cadre de l'incrémentation. Pour cela, 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''. 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''. 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]. ==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> ht4lo7ll0zhwqbxxz79q67hg0baii6y 767950 767949 2026-06-17T18:49:29Z Mewtow 31375 /* Les incrémenteurs à anticipation de retenue */ 767950 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. 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 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 bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|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 |} On voit 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. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[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 cela, regardons comment les retenues sont calculées, dans le cadre de l'incrémentation. Pour cela, 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|vignette|upright=3|Incrémenteur hybride à 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''. 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]. ==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> 3aj4mq76fm1r0kewksd27r3mdr2l86e 767951 767950 2026-06-17T18:49:43Z Mewtow 31375 /* Les incrémenteurs à anticipation de retenue */ 767951 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. 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 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 bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|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 |} On voit 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. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[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 cela, regardons comment les retenues sont calculées, dans le cadre de l'incrémentation. Pour cela, 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''. 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]. ==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> sarn92z8ryh0g13jdrvahj1klh4ienw 767952 767951 2026-06-17T18:51:40Z Mewtow 31375 /* Les incrémenteurs à anticipation de retenue */ 767952 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. 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 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 bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|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 |} On voit 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. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[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 cela, regardons comment les retenues sont calculées, dans le cadre de l'incrémentation. Pour cela, 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]. ==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> fuo8fzristacab6an1e3s8imqibck61 767953 767952 2026-06-17T18:52:02Z Mewtow 31375 /* Les incrémenteurs à anticipation de retenue */ 767953 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. 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 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 bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|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 |} On voit 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. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[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]. ==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> 41wnfo1tfj79j0qssvi4unwexssh0um 767954 767953 2026-06-17T18:55:03Z Mewtow 31375 /* Les incrémenteurs carry skip */ 767954 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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 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 bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|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 |} On voit 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. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[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]. ==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> 9x3opzyivo7r7bx5wrhnxm7y9xpmlqc 767955 767954 2026-06-17T18:59:35Z Mewtow 31375 /* Les incrémenteurs carry skip */ 767955 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]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits é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]. ==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> fxa2doqtnuvpyhghzm8mf78jqlh52y1 Fonctionnement d'un ordinateur/Les circuits de calcul logique et bit à bit 0 69516 767937 767855 2026-06-17T16:49:30Z Mewtow 31375 /* L'opération de population count */ 767937 wikitext text/x-wiki Dans ce chapitre, nous allons voir les '''opérations de manipulation de bits''', des opérations qui manipulent les bits d'un opérande. La différence avec les opérations bit à bit est que les bits de colonnes différentes peuvent être combinés entre eux pour fournir leur résultat, elles peuvent les faire changer de place, en supprimer, en ajouter, etc. Mais cela deviendra plus compréhensible en voyant quelques exemples d'opérations de ce genre. ==Le test d'un bit dans un opérande entier== Une opération assez courante teste si un bit précis vaut 0 ou 1, dans une opérande. Par exemple, si je prends l'opérande 0001 1010 (codée sur 8 bits). Je peux tester si le cinquième bit en partant de la droite vaut 1, ou s'il vaut zéro. Ici, le bit vaut 1. En logiciel, le programmeur implémente cette opération en utilisant un masque. L'idée est que l'on masque les bits non-sélectionnés, puis on analyse le résultat. En l’occurrence, le masque sélectionne le bit voulu et mets les autres à zéro. Le résultat est alors comparé avec zéro, pour savoir quelle est la valeur du bit sélectionné. Si le résultat vaut zéro, alors le bit sélectionné vaut zéro. S'il est différent de zéro, alors le bit sélectionné vaut 1. [[File:Masques 2.png|centre|vignette|upright=2.5|Masques pour tester un bit.]] Mais en matériel, on dispose d'un circuit qui fait cela naturellement : le multiplexeur ! Sélectionner un bit dans une opérande est la raison d'être d'un multiplexeur. Il suffit de lui envoyer la position du bit voulu, et voilà ! On récupère le bit sélectionné. Reste alors à le comparer avec la valeur voulue. Si on veut tester si le bit vaut 1, il n'y a rien à faire : le bit testé est lui-même le résultat de la comparaison. Mais si on veut tester si le bit vaut zéro, il faut alors inverser le résultat : le résultat doit valoir 1 si le bit vaut zéro et inversement. En clair, il suffit de combiner un multiplexeur avec un inverseur commandable. : Au passage, intérieurement, un multiplexeur fait la même chose que logiciel. Il contient un décodeur pour générer le masque, applique le masque avec une couche de portes ET, puis compare le résultat avec zéro avec une porte OU. ==L'opération de ''population count''== L'opération de '''''population count''''' compte le nombre de bits à 1 d'un opérande entier. Elle est très utilisée quand on manipule des tableaux de bits, pour le codage/décodage vidéo/audio, pour crypter/décrypter des données, etc. Les réseaux de neurones artificiels, notamment ceux utilisés dans l'intelligence artificielle, font aussi usage de cette opération. Elle est aussi très courante dans les algorithmes de correction d'erreur, utilisés dans les transmissions réseaux ou dans certaines mémoires. En général, les autres livres d'architecture des ordinateurs parlent de l'opération elle-même, mais pas des circuits pour la calculer. Mais j'ai choisit de vous en parler, car cela montre une utilisation des additionneurs multi-opérande, qui ne servent pas que pour les circuits multiplieurs. ===Le circuit de ''population count'' : les compteurs parallèles=== La ''population count'' est un cas particulier d'addition multiopérande, où chaque opérande fait 1 bit. En effet, pour calculer la ''population count'' d'un opérande de N bits, il faut additionner ces N bits entre eux. Et les techniques vues dans le chapitre sur l'addition multiopérande marchent aussi pour la ''population count''. La technique la plus simple est celle dite du diviser pour régner. L'idée est que si on découpe l'opérande en deux, la ''population count'' est la somme des ''population count'' de chaque partie. Par exemple, pour calculer la ''population count'' d'un entier 32 bits (4 octets), on peut additionner les ''population count'' des 4 octets de l'opérande. Pour cela, il faut fabriquer des circuits capables d'additionner entre 2 et 7 bits, appelés des ''parallel counters'', terme que nous traduirons par '''compteurs parallèles'''. [[File:POPCOUNT avec un additionneur multiopérande.png|centre|vignette|upright=2|Circuit de calcul de population count.]] Il se trouve que nous avons déjà vu des compteurs parallèles dans les chapitres précédents. Les additionneurs complets sont des compteurs parallèles 3 bits, les demi-additionneurs sont des compteurs parallèle 2 bits. Pour rappel, le premier additionne trois bits, alors que le second additionne deux bits. Dans ce qui suit, nous allons utiliser les abréviations suivantes : FA (''Full-Adder) pour additionneur complet, HA (''Half-Adder) pour demi-additionneur. Le calcul de la ''population count'' peut donc utiliser des FA comme compteurs parallèles. Un tel additionneur regroupe les bits de l'opérande par triplets et additionne chaque triplet avec un FA. S'il reste une paire de bits isolées après avoir formé les triplets, elle est additionnée avec un HA. Les FA/HA calcule des ''population count'' intermédiaires codées sur 2 bits, qui sont ensuite additionnées par l'additionneur multi-opérande. Le circuit ne paye pas de mine, mais c'est un circuit de ce style qui a été utilisé sur le processeur ARM1, un des tout premier CPU ARM, prévu pour les premiers iPhones. [[File:POPCNT circuit.png|centre|vignette|upright=2|Illustration de la première couche du circuit de POPCNT.]] Le circuit précédent additionne un grand nombre de résultat intermédiaires codées sur 2 bits. L'idéal serait pourtant l'inverse : moins d'opérandes à additionner, mais celles-ci sont plus longues. Pour cela, il faut remplacer les FA par des compteurs parallèles qui fournissent des résultats codés sur 4, 5, 6, 7 bits, parfois plus. Intuitivement, on se dit qu'il faudrait découper les opérandes en groupes de 4, 8, 16 bits, ou toute autre puissance de deux. Sauf que ce n'est pas l'idéal. Par exemple, avec un résultat de 3 bits, on peut coder les valeurs de 0 à 7, ce qui fait 7 bits. Sur 4 bits, cela permet de gérer 15 bits, pas plus. Sur 5 bits, cela permet de gérer 63 bits d'entrée. À chaque fois, il nous manque un bit pour avoir un groupe bien rond de 4, 8, 16 bits. La raison est qu'il faut encoder le zéro pour le résultat. Les compteurs parallèles peuvent être construits comme n'importe quel circuit combinatoire, à partir de la table de vérité. Mais ils peuvent aussi être construits en combinant des compteurs parallèles plus petits avec un additionneur. Il s'agit de l'implémentation la plus simple, la moins optimisée, la plus gourmande en portes logiques. Heureusement, des simplifications sont possibles, comme on le verra dans la suite du chapitre. [[File:Population count avec des compteurs parallèles.png|centre|vignette|upright=2|Population count avec des compteurs parallèles]] ===Les compteurs parallèles de moins de 8 bits=== Dans cette section, nous allons voir comment créer des compteurs parallèles en utilisant des FA/HA, couplés à un additionneur. Nous simpliferons ces circuits par la suite. Le premier exemple intéressant est le '''compteur parallèle 4 bits''', qui prend 4 bits d'opérande et fournit un résultat de 3 bits. Premièrement, il additionne les bits d'opérande deux par deux, avec deux HA/ Les deux résultats de 2 bits sont ensuite additionnés avec un additionneur 2 bits. Le circuit final est le suivant : [[File:Compteur parallèle de 4 bits, fabriqué avec des HA et FA.png|centre|vignette|upright=2.5|Compteur parallèle de 4 bits, fabriqué avec des HA et FA]] Pour les compteurs parallèles de plus de 4 bits, il devient intéressant d'additionner les bits par groupes de 3, par triplet. Les bits d'un triplet sont additionnés avec un FA, ce qui donne un résultat sur deux bits. Le compteur parallèle 5 bits est construit sur le même modèle. Il calcule la ''population count'' d'une paire de bit et d'un triplet de bit, et additionne le tout avec un additionneur 2 bits. [[File:Compteur parallele 5 bits, naïf.png|centre|vignette|upright=2|Compteur parallele 5 bits, naïf]] Pour un compteur de 6 bits, la première couche ne contient que des FA, tout en conservant l'additionneur 2 bits. [[File:Compteur parallele 4bits.png|centre|vignette|upright=2|Compteur parallèle 6 bits]] Dans l'exemple précédent, il est intéressant d'ajouter un 7ème bit d'opérande, pour profiter de l'entrée de retenue de l'additionneur. En effet, tous les additionneurs dignes de ce nom disposent d'une entrée de retenue, utilisée pour l'incrémentation ou d'autres opérations. Elle permet d'ajouter un bit en plus, sur la colonne des bits de poids faible. Et bien on peut rajouter un 7ème bit sur cette entrée. Et dans le cas général, au lieu d'additionner des triplets de bits, on peut rajouter un bit en plus. [[File:Compteur parallel 7bits.png|centre|vignette|upright=2|Compteur parallèle 7 bits]] ===Les simplifications liées aux demi-additionneurs=== Les compteurs vus plus haut peuvent être simplifiés, afin de faire des économies de portes logiques. Les compteurs parallèle de 6 et 7 bits ne peuvent pas se simplifier facilement, mais ceux de 4 et 5 bits le peuvent. Les simplifications sont liés au fait que ces deux circuits intégrent des paires de HA en série, à savoir que le second prend l'entrée du premier. Et à une porte logique près, ces deux HA en série forment un FA. Pour le compteur parallèle 5 bits, la simplification donne le circuit suivant. Le circuit originel avait deux HA et deux FA, cette version simplifié élimine un HA, ce qui fait une petite économie de circuits. Avec cette simplification, on perd l'organisation en deux couches : une couche de FA/HA qui calcule la ''population count'' de paires/triplets de bits, suivi par un additionneur 2 bits. Mais le seul désavantage est que le circuit est moins simple à expliquer, ce qui est juste un petit défaut. [[File:Circuit de calcul de PCOUNT de 5 bits.png|centre|vignette|upright=2|Circuit de calcul de PCOUNT de 5 bits]] Pour le compteur parallèle 4 bits, une implémentation alternative donne le circuit suivant. Le circuit incorpore un FA et deux HA, contre 4 HA avec le circuit de base. Sachant qu'un FA contient 2 HA et une porte logique, le circuit n'économise pas de portes logiques. Notez que ce circuit peut être interprété comme un FA couplé à un additionneur. Précisément, il additionne trois bits, puis décide d'incrémenter le résultat ou non suivant la valeur du quatrième bit. Le circuit est donc composé d'un FA suivi par un incrémenteur commandable (son entrée de retenue est configurable). [[File:Compteur parallèle de 4 bits, version alternative.png|centre|vignette|upright=2|Compteur parallèle de 4 bits, version alternative]] ===Les ''adders compressors'' : fusionner des additionneurs complets=== Nous venons de voir une simplification assez basique, à savoir fusionner plusieurs HA en un seul FA. Mais est-ce qu'il existe un équivalent pour les FA ? A savoir un circuit qui fusionne plusieurs FA en un seul circuit amélioré ? intuitivement, on se dit que non, car un tel circuit serait tout sauf intuitif pour ce qui est des retenues. Sauf que la réponse est oui, il existe des circuits qui fusionnent plusieurs FA entre eux et fournit exactement les mêmes sorties que les FA fusionnés. De tels circuits sont appelés des '''''adder compressors'''''. Les ''adder compressors'' sont utilisés dans le cadre de l'addition multiopérande en général, pas seulement pour le calcul de la ''population count''. Ils sont surtout utilisés dans les additionneurs multiopérandes en arbre. Les arbres de Wallace ou de Dadda peuvent être modifiés de manière à fusionner des FA d'une même couche, en les remplaçant par des ''adder compressors''. Mais la construction de l'arbre d'additionneur est alors beaucoup plus complexe, ce qui explique pourquoi je n'en ai pas parlé dans le chapitre sur l'addition multiopérande. Les ''adder compressors'' fournissent le bit de poids faible du résultat et les différentes retenues des additions intermédiaires fournies par les FA fusionnés. Par exemple, prenons le compteur parallèle de 5 bits, composé de deux FA placés l'un à la suite de l'autre, avec un HA qui additionne les deux retenues produites par les deux FA. Les deux FA peuvent être remplacés par un mal-nommé ''adder compressor'' 4:2, qui prend 5 bit d'opérande et fournit les trois mêmes sorties que les deux FA : le bit de poids faible du résultat final, les deux retenues des additions intermédiaires. Les retenues doivent être combinées ensemble par des circuits à part, pour obtenir un compteur parallèle. Dans le cadre de l'addition multiopérande, les retenues sont simplement propagées à la colonne suivante, elles sont envoyées en entrée d'un autre ''adder compressor''. [[File:Simplification d'un compteur parallèle 5 bits avec un adder compressor.png|centre|vignette|upright=2|Simplification d'un compteur parallèle 5 bits avec un adder compressor.]] L'avantage est que le calcul du bit de somme est simplifié. Le mieux est de partir de l'exemple avec un compteur parallèle 5 bits, avec ses deux FA en série. Voici ce que l'on obtient en enchainant deux FA, au niveau des XOR : [[File:Adder compressor 4-2.png|centre|vignette|upright=2|Adder compressor 4-2]] Le schéma montre que l'on a quatre portes XOR placées en série, ce qui est tout sauf idéal. Mieux vaut essayer de les mettre en parallèle, pour gagner un petit peu en rapidité. Il est par exemple possible d'améliorer le circuit précédent pour passer de 4 portes en série à seulement 3, ce qui est légèrement plus rapide. [[File:Adder compressor 4-2 optimisé.png|centre|vignette|upright=2|Adder compressor 4-2 optimisé]] En clair, la fusion des FA permet de réorganiser la chaine de portes XOR qui calcule le bit de somme. Les portes XOR doivent idéalement former un arbre équilibré, de manière à réduire le nombre de portes XOR à traverser. Un ''adder compressor'' utilise l'arbre des portes XOR idéal, mais calcule les retenues par groupes de 3 bits. [[File:Addition des bits de somme.png|centre|vignette|upright=2|Addition des bits de somme avec des HA : arbre équilibré]] ==Les opérations FFS, FFZ, CTO et CLO== Dans cette section, nous allons aborder plusieurs opérations fortement liées entre elles, illustrées dans le schéma ci-dessous. Elles sont très courantes sur la plupart des ordinateurs, surtout dans les ordinateurs embarqués. Beaucoup d'ordinateurs, comme les anciens mac avec des processeurs type Power PC et les processeurs MIPS ou RISC ont des instructions pour effectuer ces opérations. 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", "les 0 de poids faible" et quelques autres du même genre. Quand nous parlerons du 0 de poids faible, nous voudrons parler du premier 0 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0011 1011, le 0 de poids faible est le troisième bit en partant de la droite. Quand nous parlerons du 1 de poids faible, c'est la même chose, mais pour le premier bit à 1. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant aux expressions "le 1 de poids fort" et "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Par contre, les expressions "LES 1 de poids faible" ou "LES 0 de poids faible" ne parlent pas de la même chose. Quand nous voudrons parler des 1 de poids faible, au pluriel, nous voulons dire : tous les bits situés avant le 0 de poids faible. Par exemple, prenons le nombre 0011 0011 : les 1 de poids faible correspondent ici aux deux premiers bits en partant de la droite. Même chose quand on parle des zéros de poids faible au pluriel. Quant aux expressions "les 1 de poids fort" ou "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Les opérations que nous allons voir sont au nombre de 8 et elles s'expliquent facilement avec le schéma ci-dessous. [[File:Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.png|centre|upright=2.0|vignette|Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.]] Les quatre opération suivantes donnent la position des 0/1 de poids faible/fort : * L'opération '''''Find First Set''''', donne la position du 1 de poids faible. * L'opération '''''Find highest set''''' donne la position du 1 de poids fort. * L'opération '''''Find First Zero''''' donne la position du 0 de poids faible (le plus à droite). * L'opération '''''Find Highest Zero''''' donne la position du 0 de poids fort (le plus à gauche). Elles ont des opérations corolaires qui elles, comptent le nombre de 0/1 avant ou après des 0/1 de poids fort/faible. * L'opération '''''Count Trailing Zeros''''' compte les zéros situés à droite du 1 de poids faible. * L'opération '''''Count Leading Zeros''''' compte les zéros à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' compte les 1 situés à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' compte les 1 situés à droite du 0 de poids faible. Dans toutes ces opérations, les bits sont numérotés, leur numéro étant appelé leur position ou leur indice. La position d'un bit est donc donnée par ce numéro. Ces opérations varient selon la méthode utilisée pour numéroter les bits. On peut commencer à compter les bits à partir de 0, le 0 étant le numéro du bit de poids faible. Mais on peut aussi compter à partir de 1, le bit de poids faible étant celui de numéro 1. Ces deux conventions ne sont pas équivalentes. Si on choisit la première convention, certaines opérations sont équivalentes. Par exemple, les opérations ''Count Trailing Zeros'' et ''Find First Set'' donnent toutes les deux le même résultat. Avec la première convention, pour un nombre codé sur <math>n</math> bits, on a : : <math>\text{fhs} + \text{clz(n)} = n - 1</math> : <math>\text{fhz} + \text{clo(n)} = n - 1</math> : <math>\text{ffs} = \text{ctz(n)}</math> : <math>\text{ffz} = \text{cto(n)}</math> On voit que certaines opérations sont équivalentes, ce qui nous arrange bien. Il y a deux classes d'opérations : celles à gauche dans les équations précédentes, celles à droite. Les premiers donnent la position du 0/1 de poids faible/fort, celles qui comptent des 0/1 de poids faibles/fort. Et les deux classes s'implémentent par des circuits très différents. ===L'implémentation avec un encodeur à priorité=== La première implémentation implémente les quatre calculs suivants : * le ''Find First Set'', abréviée FFS ; * le ''Find Highest set'', abrévié FHS ; * le ''Find First Zero'', abréviée FFZ ; * le ''Find highest Zero'', abrévié FHZ. Implémenter chaque opération peut se faire avec un encodeur à priorité. Pour les quatre opérations précédentes, il existe un encodeur à priorité qui s'en charge. Par exemple, on peut utiliser un encodeur à priorité qui donne la position du 1 de poids fort, c’est-à-dire qui réalise l'opération ''Find Highest Set''. Il existe aussi un autre encodeur à priorité qui lui donne la position du 1 de poids faible, ce qui correspond à l'opération ''Find First Set''. Il existe aussi un encodeur qui donne la position du zéro de poids faible (''Find First Zero'') et un autre qui donne celle du zéro de poids fort (''Find highest Zero''). Mais utiliser quatre encodeurs différents n'est pas l'idéal. Il est en effet possible de faire avec un seul encodeur. L'idée est qu'un encodeur à priorité est composé d'un encodeur normal, couplé à un circuit de priorité qui sélectionne le 0/1 de poids fort/faible. L'idée est de rendre ce circuit configurable, de manière à choisir l'opération voulue parmi les 4 précédentes. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité]] Une autre méthode utilise un inverseur commandable. En, effet, les opérations FHS et FHZ peuvent se déduire l'une de l'autre, en inversant le nombre passé en entrée : les 0 de poids fort deviennent alors des 1 de poids fort, et vice-versa. Idem pour les opérations FFS et FFZ. En inversant l'entrée, le 1 de poids faible deviendra le 0 de poids faible et inversement. Inverser les bits de l'entrée se fait avec un inverseur commandable. [[File:Circuit qui effectue les opérations FHS, FFS, CLZ et autres.png|centre|vignette|upright=2|Circuit qui effectue les opérations FHS, FFS, CLZ et autres.]] ===L'implémentation avec la ''population count''=== Maintenant, voyons comment implémenter les quatre opérations suivantes. Il s'agit des opérations qui comptent les 0 ou 1 de poids faible, et ceux de poids fort. * L'opération '''''Count Trailing Zeros''''' donne le nombre de zéros situés à droite de ce 1 de poids faible. * L'opération '''''Count Leading Zeros''''' donne nombre de zéros situés à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' donnent le nombre de 1 à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' donne le nombre de 1 à droite du 0 de poids faible. Les quatre opérations listées plus haut comptent un certain nombre de 0 ou 1. Compter des 1 ressemble beaucoup à ce que fait le circuit de ''population count''. La différence est qu'ici, seuls certains bits sont à prendre en compte : ceux situés à droite/gauche d'un 0/1 de poids faible/fort. Or, nous avons déjà un outil pour ignorer certains bits : l'usage de masques avec des opérations bit à bit. L'idée est alors de générer un masque qui indique la position des 0/1 de poids faible/fort. Chaque bit du masque est associé au bit à la même place dans l'opérande, celui de même poids. Un bit du masque à 1 indique que le bit est à prendre en compte, alors qu'un bit à 0 indique un bit à ignorer. Par exemple, prenons le cas où on veut compter le nombre de ''Trailing Zeros'', à savoir les 0 de poids faible, ceux situés à droite du premier 1 rencontré en lisant l'opérande de droite à gauche. La première étape génère un nombre qui a un 1 à la place de chaque ''Trailing Zero'', et un 0 ailleurs. {|class="wikitable" |- ! Opérande | 0010 1101 1001 1000 0000 |- ! Masque | 0000 0000 0000 0111 1111 |} Une fois le masque voulu obtenu, on compte le nombre de 1 dans le masque généré. En clair, on calcule sa ''population count''. Le résultat donne le nombre voulu. Le circuit qui génère le masque a une implémentation similaire à celle utilisée par un encodeur à priorité. Avec un encodeur à priorité qui calcul l'opération ''Find First Set'', le circuit met à 0 les bits qui suivent le 1 de poids fort. Avec l'opération ''Count Leading Zero'', le circuit fait la même chose, sauf que les bits sont mis à 1. Le circuit est construit de la même manière, comme illustré ci-dessous. Il s'agit de l'implémentation la plus simple, composée de briques qui mettent à 0/1 un bit de l'opérande, qui sont enchainés les uns à la suite des autres. [[File:L'implémentation de l'opération CLZ avec la population count.png|centre|vignette|upright=2|L'implémentation de l'opération CLZ avec la population count]] Le circuit précédent met à 1 un bit à la fois. Une amélioration serait d'en traiter plusieurs à la fois. Par exemple, on peut imaginer un circuit qui traite des groupes de 4/5 bits. Pour chaque groupe, un circuit détecte les 1 de poids fort et met les bits suivants à 1. Le circuit peut se concevoir simplement avec un tableau de Karnaugh. Évidemment, pour enchainer plusieurs circuits, il faut gérer le cas où un 1 de poids fort a été détecté dans un groupe précédent et mettre toutes les sorties à 1 cas échéant, avec un circuit de mise à 111111 qu'on a déjà vu. [[File:Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT.png|centre|vignette|upright=2|Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT]] Une version améliorée de cette technique a apparemment été utilisée par Intel dans certains de ces processeurs, le brevet "Combined set bit count and detector logic" détaille l'implémentation d'une technique similaire. ==Les circuits générateurs/vérificateurs d'ECC== Au tout début de ce cours, nous avions vu les codes ECC, qui détectent ou corrigent des corruptions de données. Si un bit est altéré, ils permettent de détecter que le bit en question a été inversé, et peuvent éventuellement le corriger pour retrouver la donnée initiale. Les deux codes ECC les plus connus sont le bit de parité et les codes de Hamming. Et ils sont très liés à la ''population count''. Dans ce qui suit, nous allons voir des circuits qui calculent soit un bit de parité, soit le code de Hamming d'un nombre. ===Le générateur de bit de parité=== Pour rappel, le bit de parité permet de détecter qu'un bit a été inversé, à savoir qu'il est passé de 1 à 0 ou inversement. Pour cela, on ajoute un bit de parité aux données à sécuriser, afin que le nombre de bits à 1 soit pair, bit de parité inclus. En clair, le bit de parité vaut 0 si la donnée a un nombre de bits à 1 pair, il vaut 1 si ce nombre est impair. Dans cette section, nous allons voir un circuit qui calcule le bit de parité d'un opérande. [[File:Circuit de parité.PNG|vignette|Circuit de parité]] Intuitivement, on se dit qu'il faut compter les 1 dans l'opérande, avant de calculer sa parité et d'en déduire le bit de parité. Le bit de parité est donc le bit de poids faible de la ''population count''. Le bit de parité se calcule donc en additionnant les bits de l'opérande, mais sans tenir compte des bits de poids fort, sans tenir compte des retenues, en ne conservant que le bit de somme. Lors de l'addition de deux bits, ce bit de somme est calculé en faisant un XOR entre les deux bits à additionner. Pour N bits, il suffit d'enchainer N-1 portes XOR. Avec cette logique, on peut créer un '''générateur de parité parallèle''', un circuit qui calcule le bit de parité d'un opérande, en faisant un XOR entre tous ses bits. En réfléchissant, on devine qu'on peut structurer les portes XOR comme illustré ci-contre. Le circuit précédent calcule le bit de parité d'un opérande. Pour ce qui est de vérifier si une donnée est corrompue, rien de plus simple : il suffit de générer le bit de parité de la donnée seule, et de le comparer avec le bit de parité stocké dans la donnée avec la porte logique adaptée. Le circuit qui génère un bit de parité et celui qui vérifie si le bit de parité est valide sont donc très similaires. ===Le générateur/''checker'' d'ECC=== [[File:Hamming(7,4).svg|vignette|Hamming(7,4)]] Les codes de Hamming calculent plusieurs bits de parité, qui sont chacun calculés en prenant en compte certains bits de l'opérande. Par exemple, le code de Hamming de type 7,4 prend des données sur 4 bits, et leur ajoute 3 bits de parité, ce qui fait en tout 7 bits : c'est de là que vient le nom de 7-4-3 du code. Chaque bit de parité se calcule à partir de 3 bits du nombre. Le schéma ci-contre indique quels sont les bits de données utilisés pour calculer un bit de parité : les bits de parité sont notés p, les bits de données d. L'implémentation matérielle est donc très simple : un circuit qui génère un code de Hamming est composé de plusieurs circuits de génération de parité, idem pour un circuit qui vérifie le code de Hamming d'un opérande. Étudions par exemple le circuit suivant, conçu pour le code 7-4-3. Il vérifie si les 4 bits de données sont valides, à savoir si les trois bits d'ECC collent bien aux données associées. Si les deux valeurs correspondent, il n'y a pas d'erreur. Mais si les bits ne correspondent pas, alors on sait quel bit est erroné en regardant quel bit d'ECC est invalide. Le circuit corrige alors le bit erroné. En premier lieu, le circuit calcule le code de Hamming des 4 bits de données, avec une première couche de portes XOR. Le résultat est alors comparé avec les trois bits d'ECC présents dans l'opérande, par un comparateur d'égalité, lui-même construit avec des portes XOR. Le tout est suivi par un circuit de correction d'erreur. Une couche de portes ET/NON sélectionne le bit à corriger. Elle génère un masque de 4 bits qui indique quel bit inverser : celui dont le bit du masque est à 1. La dernière couche de portes XOR prend ce masque et l'applique aux 4 bits de données, ce qui inverse le bit adéquat. [[File:HammingCircuit.png|centre|vignette|upright=2|Circuit de vérification d'un code de Hamming 7,4.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits pour la multiplication et la division | prevText=Les circuits pour la multiplication et la division | next=Les circuits de calcul flottant | nextText=Les circuits de calcul flottant }} </noinclude> 31tqx1blc8i7dvglmfl4axht1ouwox0 767938 767937 2026-06-17T16:50:24Z Mewtow 31375 /* Le circuit de population count : les compteurs parallèles */ 767938 wikitext text/x-wiki Dans ce chapitre, nous allons voir les '''opérations de manipulation de bits''', des opérations qui manipulent les bits d'un opérande. La différence avec les opérations bit à bit est que les bits de colonnes différentes peuvent être combinés entre eux pour fournir leur résultat, elles peuvent les faire changer de place, en supprimer, en ajouter, etc. Mais cela deviendra plus compréhensible en voyant quelques exemples d'opérations de ce genre. ==Le test d'un bit dans un opérande entier== Une opération assez courante teste si un bit précis vaut 0 ou 1, dans une opérande. Par exemple, si je prends l'opérande 0001 1010 (codée sur 8 bits). Je peux tester si le cinquième bit en partant de la droite vaut 1, ou s'il vaut zéro. Ici, le bit vaut 1. En logiciel, le programmeur implémente cette opération en utilisant un masque. L'idée est que l'on masque les bits non-sélectionnés, puis on analyse le résultat. En l’occurrence, le masque sélectionne le bit voulu et mets les autres à zéro. Le résultat est alors comparé avec zéro, pour savoir quelle est la valeur du bit sélectionné. Si le résultat vaut zéro, alors le bit sélectionné vaut zéro. S'il est différent de zéro, alors le bit sélectionné vaut 1. [[File:Masques 2.png|centre|vignette|upright=2.5|Masques pour tester un bit.]] Mais en matériel, on dispose d'un circuit qui fait cela naturellement : le multiplexeur ! Sélectionner un bit dans une opérande est la raison d'être d'un multiplexeur. Il suffit de lui envoyer la position du bit voulu, et voilà ! On récupère le bit sélectionné. Reste alors à le comparer avec la valeur voulue. Si on veut tester si le bit vaut 1, il n'y a rien à faire : le bit testé est lui-même le résultat de la comparaison. Mais si on veut tester si le bit vaut zéro, il faut alors inverser le résultat : le résultat doit valoir 1 si le bit vaut zéro et inversement. En clair, il suffit de combiner un multiplexeur avec un inverseur commandable. : Au passage, intérieurement, un multiplexeur fait la même chose que logiciel. Il contient un décodeur pour générer le masque, applique le masque avec une couche de portes ET, puis compare le résultat avec zéro avec une porte OU. ==L'opération de ''population count''== L'opération de '''''population count''''' compte le nombre de bits à 1 d'un opérande entier. Elle est très utilisée quand on manipule des tableaux de bits, pour le codage/décodage vidéo/audio, pour crypter/décrypter des données, etc. Les réseaux de neurones artificiels, notamment ceux utilisés dans l'intelligence artificielle, font aussi usage de cette opération. Elle est aussi très courante dans les algorithmes de correction d'erreur, utilisés dans les transmissions réseaux ou dans certaines mémoires. En général, les autres livres d'architecture des ordinateurs parlent de l'opération elle-même, mais pas des circuits pour la calculer. Mais j'ai choisit de vous en parler, car cela montre une utilisation des additionneurs multi-opérande, qui ne servent pas que pour les circuits multiplieurs. ===Le circuit de ''population count'' : les compteurs parallèles=== La ''population count'' est un cas particulier d'addition multiopérande, où chaque opérande fait 1 bit. En effet, pour calculer la ''population count'' d'un opérande de N bits, il faut additionner ces N bits entre eux. Et les techniques vues dans le chapitre sur l'addition multiopérande marchent aussi pour la ''population count''. La technique la plus simple est celle dite du diviser pour régner. L'idée est que si on découpe l'opérande en deux, la ''population count'' est la somme des ''population count'' de chaque partie. Par exemple, pour calculer la ''population count'' d'un entier 32 bits (4 octets), on peut additionner les ''population count'' des 4 octets de l'opérande. Pour cela, il faut fabriquer des circuits capables d'additionner entre 2 et 7 bits, appelés des ''parallel counters'', terme que nous traduirons par '''compteurs parallèles'''. [[File:POPCOUNT avec un additionneur multiopérande.png|centre|vignette|upright=2|Circuit de calcul de population count.]] Il se trouve que nous avons déjà vu des compteurs parallèles dans les chapitres précédents. Les additionneurs complets sont des compteurs parallèles 3 bits, les demi-additionneurs sont des compteurs parallèle 2 bits. Pour rappel, le premier additionne trois bits, alors que le second additionne deux bits. Dans ce qui suit, nous allons utiliser les abréviations suivantes : FA (''Full-Adder) pour additionneur complet, HA (''Half-Adder) pour demi-additionneur. Le calcul de la ''population count'' peut donc utiliser des FA comme compteurs parallèles. Un tel additionneur regroupe les bits de l'opérande par triplets et additionne chaque triplet avec un FA. S'il reste une paire de bits isolées après avoir formé les triplets, elle est additionnée avec un HA. Les FA/HA calcule des ''population count'' intermédiaires codées sur 2 bits, qui sont ensuite additionnées par l'additionneur multi-opérande. Le circuit ne paye pas de mine, mais c'est un circuit de ce style qui a été utilisé sur le processeur ARM1, un des tout premier CPU ARM, prévu pour les premiers iPhones. [[File:POPCNT circuit.png|centre|vignette|upright=2|Illustration de la première couche du circuit de POPCNT.]] Le circuit précédent additionne un grand nombre de résultat intermédiaires codées sur 2 bits. L'idéal serait pourtant l'inverse : moins d'opérandes à additionner, mais celles-ci sont plus longues. Pour cela, il faut remplacer les FA par des compteurs parallèles qui fournissent des résultats codés sur 4, 5, 6, 7 bits, parfois plus. Intuitivement, on se dit qu'il faudrait découper les opérandes en groupes de 4, 8, 16 bits, ou toute autre puissance de deux. Sauf que ce n'est pas l'idéal. Par exemple, avec un résultat de 3 bits, on peut coder les valeurs de 0 à 7, ce qui fait 7 bits. Sur 4 bits, cela permet de gérer 15 bits, pas plus. Sur 5 bits, cela permet de gérer 63 bits d'entrée. À chaque fois, il nous manque un bit pour avoir un groupe bien rond de 4, 8, 16 bits. La raison est qu'il faut encoder le zéro pour le résultat. Les compteurs parallèles peuvent être construits comme n'importe quel circuit combinatoire, à partir de la table de vérité. Mais ils peuvent aussi être construits en combinant des compteurs parallèles plus petits avec un additionneur. Il s'agit de l'implémentation la plus simple, la moins optimisée, la plus gourmande en portes logiques. Heureusement, des simplifications sont possibles, comme on le verra dans la suite du chapitre. [[File:Population count avec des compteurs parallèles.png|centre|vignette|upright=2|Population count avec des compteurs parallèles]] ===Les compteurs parallèles de moins de 8 bits=== Dans cette section, nous allons voir comment créer des compteurs parallèles en utilisant des FA/HA, couplés à un additionneur. Nous simpliferons ces circuits par la suite. Le premier exemple intéressant est le '''compteur parallèle 4 bits''', qui prend 4 bits d'opérande et fournit un résultat de 3 bits. Premièrement, il additionne les bits d'opérande deux par deux, avec deux HA/ Les deux résultats de 2 bits sont ensuite additionnés avec un additionneur 2 bits. Le circuit final est le suivant : [[File:Compteur parallèle de 4 bits, fabriqué avec des HA et FA.png|centre|vignette|upright=2.5|Compteur parallèle de 4 bits, fabriqué avec des HA et FA]] Pour les compteurs parallèles de plus de 4 bits, il devient intéressant d'additionner les bits par groupes de 3, par triplet. Les bits d'un triplet sont additionnés avec un FA, ce qui donne un résultat sur deux bits. Le compteur parallèle 5 bits est construit sur le même modèle. Il calcule la ''population count'' d'une paire de bit et d'un triplet de bit, et additionne le tout avec un additionneur 2 bits. [[File:Compteur parallele 5 bits, naïf.png|centre|vignette|upright=2|Compteur parallele 5 bits, naïf]] Pour un compteur de 6 bits, la première couche ne contient que des FA, tout en conservant l'additionneur 2 bits. [[File:Compteur parallele 4bits.png|centre|vignette|upright=2|Compteur parallèle 6 bits]] Dans l'exemple précédent, il est intéressant d'ajouter un 7ème bit d'opérande, pour profiter de l'entrée de retenue de l'additionneur. En effet, tous les additionneurs dignes de ce nom disposent d'une entrée de retenue, utilisée pour l'incrémentation ou d'autres opérations. Elle permet d'ajouter un bit en plus, sur la colonne des bits de poids faible. Et bien on peut rajouter un 7ème bit sur cette entrée. Et dans le cas général, au lieu d'additionner des triplets de bits, on peut rajouter un bit en plus. [[File:Compteur parallel 7bits.png|centre|vignette|upright=2|Compteur parallèle 7 bits]] ===Les simplifications liées aux demi-additionneurs=== Les compteurs vus plus haut peuvent être simplifiés, afin de faire des économies de portes logiques. Les compteurs parallèle de 6 et 7 bits ne peuvent pas se simplifier facilement, mais ceux de 4 et 5 bits le peuvent. Les simplifications sont liés au fait que ces deux circuits intégrent des paires de HA en série, à savoir que le second prend l'entrée du premier. Et à une porte logique près, ces deux HA en série forment un FA. Pour le compteur parallèle 5 bits, la simplification donne le circuit suivant. Le circuit originel avait deux HA et deux FA, cette version simplifié élimine un HA, ce qui fait une petite économie de circuits. Avec cette simplification, on perd l'organisation en deux couches : une couche de FA/HA qui calcule la ''population count'' de paires/triplets de bits, suivi par un additionneur 2 bits. Mais le seul désavantage est que le circuit est moins simple à expliquer, ce qui est juste un petit défaut. [[File:Circuit de calcul de PCOUNT de 5 bits.png|centre|vignette|upright=2|Circuit de calcul de PCOUNT de 5 bits]] Pour le compteur parallèle 4 bits, une implémentation alternative donne le circuit suivant. Le circuit incorpore un FA et deux HA, contre 4 HA avec le circuit de base. Sachant qu'un FA contient 2 HA et une porte logique, le circuit n'économise pas de portes logiques. Notez que ce circuit peut être interprété comme un FA couplé à un additionneur. Précisément, il additionne trois bits, puis décide d'incrémenter le résultat ou non suivant la valeur du quatrième bit. Le circuit est donc composé d'un FA suivi par un incrémenteur commandable (son entrée de retenue est configurable). [[File:Compteur parallèle de 4 bits, version alternative.png|centre|vignette|upright=2|Compteur parallèle de 4 bits, version alternative]] ===Les ''adders compressors'' : fusionner des additionneurs complets=== Nous venons de voir une simplification assez basique, à savoir fusionner plusieurs HA en un seul FA. Mais est-ce qu'il existe un équivalent pour les FA ? A savoir un circuit qui fusionne plusieurs FA en un seul circuit amélioré ? intuitivement, on se dit que non, car un tel circuit serait tout sauf intuitif pour ce qui est des retenues. Sauf que la réponse est oui, il existe des circuits qui fusionnent plusieurs FA entre eux et fournit exactement les mêmes sorties que les FA fusionnés. De tels circuits sont appelés des '''''adder compressors'''''. Les ''adder compressors'' sont utilisés dans le cadre de l'addition multiopérande en général, pas seulement pour le calcul de la ''population count''. Ils sont surtout utilisés dans les additionneurs multiopérandes en arbre. Les arbres de Wallace ou de Dadda peuvent être modifiés de manière à fusionner des FA d'une même couche, en les remplaçant par des ''adder compressors''. Mais la construction de l'arbre d'additionneur est alors beaucoup plus complexe, ce qui explique pourquoi je n'en ai pas parlé dans le chapitre sur l'addition multiopérande. Les ''adder compressors'' fournissent le bit de poids faible du résultat et les différentes retenues des additions intermédiaires fournies par les FA fusionnés. Par exemple, prenons le compteur parallèle de 5 bits, composé de deux FA placés l'un à la suite de l'autre, avec un HA qui additionne les deux retenues produites par les deux FA. Les deux FA peuvent être remplacés par un mal-nommé ''adder compressor'' 4:2, qui prend 5 bit d'opérande et fournit les trois mêmes sorties que les deux FA : le bit de poids faible du résultat final, les deux retenues des additions intermédiaires. Les retenues doivent être combinées ensemble par des circuits à part, pour obtenir un compteur parallèle. Dans le cadre de l'addition multiopérande, les retenues sont simplement propagées à la colonne suivante, elles sont envoyées en entrée d'un autre ''adder compressor''. [[File:Simplification d'un compteur parallèle 5 bits avec un adder compressor.png|centre|vignette|upright=2|Simplification d'un compteur parallèle 5 bits avec un adder compressor.]] L'avantage est que le calcul du bit de somme est simplifié. Le mieux est de partir de l'exemple avec un compteur parallèle 5 bits, avec ses deux FA en série. Voici ce que l'on obtient en enchainant deux FA, au niveau des XOR : [[File:Adder compressor 4-2.png|centre|vignette|upright=2|Adder compressor 4-2]] Le schéma montre que l'on a quatre portes XOR placées en série, ce qui est tout sauf idéal. Mieux vaut essayer de les mettre en parallèle, pour gagner un petit peu en rapidité. Il est par exemple possible d'améliorer le circuit précédent pour passer de 4 portes en série à seulement 3, ce qui est légèrement plus rapide. [[File:Adder compressor 4-2 optimisé.png|centre|vignette|upright=2|Adder compressor 4-2 optimisé]] En clair, la fusion des FA permet de réorganiser la chaine de portes XOR qui calcule le bit de somme. Les portes XOR doivent idéalement former un arbre équilibré, de manière à réduire le nombre de portes XOR à traverser. Un ''adder compressor'' utilise l'arbre des portes XOR idéal, mais calcule les retenues par groupes de 3 bits. [[File:Addition des bits de somme.png|centre|vignette|upright=2|Addition des bits de somme avec des HA : arbre équilibré]] ==Les opérations FFS, FFZ, CTO et CLO== Dans cette section, nous allons aborder plusieurs opérations fortement liées entre elles, illustrées dans le schéma ci-dessous. Elles sont très courantes sur la plupart des ordinateurs, surtout dans les ordinateurs embarqués. Beaucoup d'ordinateurs, comme les anciens mac avec des processeurs type Power PC et les processeurs MIPS ou RISC ont des instructions pour effectuer ces opérations. 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", "les 0 de poids faible" et quelques autres du même genre. Quand nous parlerons du 0 de poids faible, nous voudrons parler du premier 0 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0011 1011, le 0 de poids faible est le troisième bit en partant de la droite. Quand nous parlerons du 1 de poids faible, c'est la même chose, mais pour le premier bit à 1. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant aux expressions "le 1 de poids fort" et "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Par contre, les expressions "LES 1 de poids faible" ou "LES 0 de poids faible" ne parlent pas de la même chose. Quand nous voudrons parler des 1 de poids faible, au pluriel, nous voulons dire : tous les bits situés avant le 0 de poids faible. Par exemple, prenons le nombre 0011 0011 : les 1 de poids faible correspondent ici aux deux premiers bits en partant de la droite. Même chose quand on parle des zéros de poids faible au pluriel. Quant aux expressions "les 1 de poids fort" ou "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Les opérations que nous allons voir sont au nombre de 8 et elles s'expliquent facilement avec le schéma ci-dessous. [[File:Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.png|centre|upright=2.0|vignette|Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.]] Les quatre opération suivantes donnent la position des 0/1 de poids faible/fort : * L'opération '''''Find First Set''''', donne la position du 1 de poids faible. * L'opération '''''Find highest set''''' donne la position du 1 de poids fort. * L'opération '''''Find First Zero''''' donne la position du 0 de poids faible (le plus à droite). * L'opération '''''Find Highest Zero''''' donne la position du 0 de poids fort (le plus à gauche). Elles ont des opérations corolaires qui elles, comptent le nombre de 0/1 avant ou après des 0/1 de poids fort/faible. * L'opération '''''Count Trailing Zeros''''' compte les zéros situés à droite du 1 de poids faible. * L'opération '''''Count Leading Zeros''''' compte les zéros à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' compte les 1 situés à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' compte les 1 situés à droite du 0 de poids faible. Dans toutes ces opérations, les bits sont numérotés, leur numéro étant appelé leur position ou leur indice. La position d'un bit est donc donnée par ce numéro. Ces opérations varient selon la méthode utilisée pour numéroter les bits. On peut commencer à compter les bits à partir de 0, le 0 étant le numéro du bit de poids faible. Mais on peut aussi compter à partir de 1, le bit de poids faible étant celui de numéro 1. Ces deux conventions ne sont pas équivalentes. Si on choisit la première convention, certaines opérations sont équivalentes. Par exemple, les opérations ''Count Trailing Zeros'' et ''Find First Set'' donnent toutes les deux le même résultat. Avec la première convention, pour un nombre codé sur <math>n</math> bits, on a : : <math>\text{fhs} + \text{clz(n)} = n - 1</math> : <math>\text{fhz} + \text{clo(n)} = n - 1</math> : <math>\text{ffs} = \text{ctz(n)}</math> : <math>\text{ffz} = \text{cto(n)}</math> On voit que certaines opérations sont équivalentes, ce qui nous arrange bien. Il y a deux classes d'opérations : celles à gauche dans les équations précédentes, celles à droite. Les premiers donnent la position du 0/1 de poids faible/fort, celles qui comptent des 0/1 de poids faibles/fort. Et les deux classes s'implémentent par des circuits très différents. ===L'implémentation avec un encodeur à priorité=== La première implémentation implémente les quatre calculs suivants : * le ''Find First Set'', abréviée FFS ; * le ''Find Highest set'', abrévié FHS ; * le ''Find First Zero'', abréviée FFZ ; * le ''Find highest Zero'', abrévié FHZ. Implémenter chaque opération peut se faire avec un encodeur à priorité. Pour les quatre opérations précédentes, il existe un encodeur à priorité qui s'en charge. Par exemple, on peut utiliser un encodeur à priorité qui donne la position du 1 de poids fort, c’est-à-dire qui réalise l'opération ''Find Highest Set''. Il existe aussi un autre encodeur à priorité qui lui donne la position du 1 de poids faible, ce qui correspond à l'opération ''Find First Set''. Il existe aussi un encodeur qui donne la position du zéro de poids faible (''Find First Zero'') et un autre qui donne celle du zéro de poids fort (''Find highest Zero''). Mais utiliser quatre encodeurs différents n'est pas l'idéal. Il est en effet possible de faire avec un seul encodeur. L'idée est qu'un encodeur à priorité est composé d'un encodeur normal, couplé à un circuit de priorité qui sélectionne le 0/1 de poids fort/faible. L'idée est de rendre ce circuit configurable, de manière à choisir l'opération voulue parmi les 4 précédentes. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité]] Une autre méthode utilise un inverseur commandable. En, effet, les opérations FHS et FHZ peuvent se déduire l'une de l'autre, en inversant le nombre passé en entrée : les 0 de poids fort deviennent alors des 1 de poids fort, et vice-versa. Idem pour les opérations FFS et FFZ. En inversant l'entrée, le 1 de poids faible deviendra le 0 de poids faible et inversement. Inverser les bits de l'entrée se fait avec un inverseur commandable. [[File:Circuit qui effectue les opérations FHS, FFS, CLZ et autres.png|centre|vignette|upright=2|Circuit qui effectue les opérations FHS, FFS, CLZ et autres.]] ===L'implémentation avec la ''population count''=== Maintenant, voyons comment implémenter les quatre opérations suivantes. Il s'agit des opérations qui comptent les 0 ou 1 de poids faible, et ceux de poids fort. * L'opération '''''Count Trailing Zeros''''' donne le nombre de zéros situés à droite de ce 1 de poids faible. * L'opération '''''Count Leading Zeros''''' donne nombre de zéros situés à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' donnent le nombre de 1 à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' donne le nombre de 1 à droite du 0 de poids faible. Les quatre opérations listées plus haut comptent un certain nombre de 0 ou 1. Compter des 1 ressemble beaucoup à ce que fait le circuit de ''population count''. La différence est qu'ici, seuls certains bits sont à prendre en compte : ceux situés à droite/gauche d'un 0/1 de poids faible/fort. Or, nous avons déjà un outil pour ignorer certains bits : l'usage de masques avec des opérations bit à bit. L'idée est alors de générer un masque qui indique la position des 0/1 de poids faible/fort. Chaque bit du masque est associé au bit à la même place dans l'opérande, celui de même poids. Un bit du masque à 1 indique que le bit est à prendre en compte, alors qu'un bit à 0 indique un bit à ignorer. Par exemple, prenons le cas où on veut compter le nombre de ''Trailing Zeros'', à savoir les 0 de poids faible, ceux situés à droite du premier 1 rencontré en lisant l'opérande de droite à gauche. La première étape génère un nombre qui a un 1 à la place de chaque ''Trailing Zero'', et un 0 ailleurs. {|class="wikitable" |- ! Opérande | 0010 1101 1001 1000 0000 |- ! Masque | 0000 0000 0000 0111 1111 |} Une fois le masque voulu obtenu, on compte le nombre de 1 dans le masque généré. En clair, on calcule sa ''population count''. Le résultat donne le nombre voulu. Le circuit qui génère le masque a une implémentation similaire à celle utilisée par un encodeur à priorité. Avec un encodeur à priorité qui calcul l'opération ''Find First Set'', le circuit met à 0 les bits qui suivent le 1 de poids fort. Avec l'opération ''Count Leading Zero'', le circuit fait la même chose, sauf que les bits sont mis à 1. Le circuit est construit de la même manière, comme illustré ci-dessous. Il s'agit de l'implémentation la plus simple, composée de briques qui mettent à 0/1 un bit de l'opérande, qui sont enchainés les uns à la suite des autres. [[File:L'implémentation de l'opération CLZ avec la population count.png|centre|vignette|upright=2|L'implémentation de l'opération CLZ avec la population count]] Le circuit précédent met à 1 un bit à la fois. Une amélioration serait d'en traiter plusieurs à la fois. Par exemple, on peut imaginer un circuit qui traite des groupes de 4/5 bits. Pour chaque groupe, un circuit détecte les 1 de poids fort et met les bits suivants à 1. Le circuit peut se concevoir simplement avec un tableau de Karnaugh. Évidemment, pour enchainer plusieurs circuits, il faut gérer le cas où un 1 de poids fort a été détecté dans un groupe précédent et mettre toutes les sorties à 1 cas échéant, avec un circuit de mise à 111111 qu'on a déjà vu. [[File:Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT.png|centre|vignette|upright=2|Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT]] Une version améliorée de cette technique a apparemment été utilisée par Intel dans certains de ces processeurs, le brevet "Combined set bit count and detector logic" détaille l'implémentation d'une technique similaire. ==Les circuits générateurs/vérificateurs d'ECC== Au tout début de ce cours, nous avions vu les codes ECC, qui détectent ou corrigent des corruptions de données. Si un bit est altéré, ils permettent de détecter que le bit en question a été inversé, et peuvent éventuellement le corriger pour retrouver la donnée initiale. Les deux codes ECC les plus connus sont le bit de parité et les codes de Hamming. Et ils sont très liés à la ''population count''. Dans ce qui suit, nous allons voir des circuits qui calculent soit un bit de parité, soit le code de Hamming d'un nombre. ===Le générateur de bit de parité=== Pour rappel, le bit de parité permet de détecter qu'un bit a été inversé, à savoir qu'il est passé de 1 à 0 ou inversement. Pour cela, on ajoute un bit de parité aux données à sécuriser, afin que le nombre de bits à 1 soit pair, bit de parité inclus. En clair, le bit de parité vaut 0 si la donnée a un nombre de bits à 1 pair, il vaut 1 si ce nombre est impair. Dans cette section, nous allons voir un circuit qui calcule le bit de parité d'un opérande. [[File:Circuit de parité.PNG|vignette|Circuit de parité]] Intuitivement, on se dit qu'il faut compter les 1 dans l'opérande, avant de calculer sa parité et d'en déduire le bit de parité. Le bit de parité est donc le bit de poids faible de la ''population count''. Le bit de parité se calcule donc en additionnant les bits de l'opérande, mais sans tenir compte des bits de poids fort, sans tenir compte des retenues, en ne conservant que le bit de somme. Lors de l'addition de deux bits, ce bit de somme est calculé en faisant un XOR entre les deux bits à additionner. Pour N bits, il suffit d'enchainer N-1 portes XOR. Avec cette logique, on peut créer un '''générateur de parité parallèle''', un circuit qui calcule le bit de parité d'un opérande, en faisant un XOR entre tous ses bits. En réfléchissant, on devine qu'on peut structurer les portes XOR comme illustré ci-contre. Le circuit précédent calcule le bit de parité d'un opérande. Pour ce qui est de vérifier si une donnée est corrompue, rien de plus simple : il suffit de générer le bit de parité de la donnée seule, et de le comparer avec le bit de parité stocké dans la donnée avec la porte logique adaptée. Le circuit qui génère un bit de parité et celui qui vérifie si le bit de parité est valide sont donc très similaires. ===Le générateur/''checker'' d'ECC=== [[File:Hamming(7,4).svg|vignette|Hamming(7,4)]] Les codes de Hamming calculent plusieurs bits de parité, qui sont chacun calculés en prenant en compte certains bits de l'opérande. Par exemple, le code de Hamming de type 7,4 prend des données sur 4 bits, et leur ajoute 3 bits de parité, ce qui fait en tout 7 bits : c'est de là que vient le nom de 7-4-3 du code. Chaque bit de parité se calcule à partir de 3 bits du nombre. Le schéma ci-contre indique quels sont les bits de données utilisés pour calculer un bit de parité : les bits de parité sont notés p, les bits de données d. L'implémentation matérielle est donc très simple : un circuit qui génère un code de Hamming est composé de plusieurs circuits de génération de parité, idem pour un circuit qui vérifie le code de Hamming d'un opérande. Étudions par exemple le circuit suivant, conçu pour le code 7-4-3. Il vérifie si les 4 bits de données sont valides, à savoir si les trois bits d'ECC collent bien aux données associées. Si les deux valeurs correspondent, il n'y a pas d'erreur. Mais si les bits ne correspondent pas, alors on sait quel bit est erroné en regardant quel bit d'ECC est invalide. Le circuit corrige alors le bit erroné. En premier lieu, le circuit calcule le code de Hamming des 4 bits de données, avec une première couche de portes XOR. Le résultat est alors comparé avec les trois bits d'ECC présents dans l'opérande, par un comparateur d'égalité, lui-même construit avec des portes XOR. Le tout est suivi par un circuit de correction d'erreur. Une couche de portes ET/NON sélectionne le bit à corriger. Elle génère un masque de 4 bits qui indique quel bit inverser : celui dont le bit du masque est à 1. La dernière couche de portes XOR prend ce masque et l'applique aux 4 bits de données, ce qui inverse le bit adéquat. [[File:HammingCircuit.png|centre|vignette|upright=2|Circuit de vérification d'un code de Hamming 7,4.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits pour la multiplication et la division | prevText=Les circuits pour la multiplication et la division | next=Les circuits de calcul flottant | nextText=Les circuits de calcul flottant }} </noinclude> gyk6zt31ahhsg5jk3rlm1b8w50opolh 767939 767938 2026-06-17T16:51:46Z Mewtow 31375 /* Le circuit de population count : les compteurs parallèles */ 767939 wikitext text/x-wiki Dans ce chapitre, nous allons voir les '''opérations de manipulation de bits''', des opérations qui manipulent les bits d'un opérande. La différence avec les opérations bit à bit est que les bits de colonnes différentes peuvent être combinés entre eux pour fournir leur résultat, elles peuvent les faire changer de place, en supprimer, en ajouter, etc. Mais cela deviendra plus compréhensible en voyant quelques exemples d'opérations de ce genre. ==Le test d'un bit dans un opérande entier== Une opération assez courante teste si un bit précis vaut 0 ou 1, dans une opérande. Par exemple, si je prends l'opérande 0001 1010 (codée sur 8 bits). Je peux tester si le cinquième bit en partant de la droite vaut 1, ou s'il vaut zéro. Ici, le bit vaut 1. En logiciel, le programmeur implémente cette opération en utilisant un masque. L'idée est que l'on masque les bits non-sélectionnés, puis on analyse le résultat. En l’occurrence, le masque sélectionne le bit voulu et mets les autres à zéro. Le résultat est alors comparé avec zéro, pour savoir quelle est la valeur du bit sélectionné. Si le résultat vaut zéro, alors le bit sélectionné vaut zéro. S'il est différent de zéro, alors le bit sélectionné vaut 1. [[File:Masques 2.png|centre|vignette|upright=2.5|Masques pour tester un bit.]] Mais en matériel, on dispose d'un circuit qui fait cela naturellement : le multiplexeur ! Sélectionner un bit dans une opérande est la raison d'être d'un multiplexeur. Il suffit de lui envoyer la position du bit voulu, et voilà ! On récupère le bit sélectionné. Reste alors à le comparer avec la valeur voulue. Si on veut tester si le bit vaut 1, il n'y a rien à faire : le bit testé est lui-même le résultat de la comparaison. Mais si on veut tester si le bit vaut zéro, il faut alors inverser le résultat : le résultat doit valoir 1 si le bit vaut zéro et inversement. En clair, il suffit de combiner un multiplexeur avec un inverseur commandable. : Au passage, intérieurement, un multiplexeur fait la même chose que logiciel. Il contient un décodeur pour générer le masque, applique le masque avec une couche de portes ET, puis compare le résultat avec zéro avec une porte OU. ==L'opération de ''population count''== L'opération de '''''population count''''' compte le nombre de bits à 1 d'un opérande entier. Elle est très utilisée quand on manipule des tableaux de bits, pour le codage/décodage vidéo/audio, pour crypter/décrypter des données, etc. Les réseaux de neurones artificiels, notamment ceux utilisés dans l'intelligence artificielle, font aussi usage de cette opération. Elle est aussi très courante dans les algorithmes de correction d'erreur, utilisés dans les transmissions réseaux ou dans certaines mémoires. En général, les autres livres d'architecture des ordinateurs parlent de l'opération elle-même, mais pas des circuits pour la calculer. Mais j'ai choisit de vous en parler, car cela montre une utilisation des additionneurs multi-opérande, qui ne servent pas que pour les circuits multiplieurs. ===Le circuit de ''population count'' : les compteurs parallèles=== La ''population count'' est un cas particulier d'addition multiopérande, où chaque opérande fait 1 bit. En effet, pour calculer la ''population count'' d'un opérande de N bits, il faut additionner ces N bits entre eux. Et les techniques vues dans le chapitre sur l'addition multiopérande marchent aussi pour la ''population count''. La technique la plus simple est celle dite du diviser pour régner. L'idée est que si on découpe l'opérande en deux, la ''population count'' est la somme des ''population count'' de chaque partie. Par exemple, pour calculer la ''population count'' d'un entier 32 bits (4 octets), on peut additionner les ''population count'' des 4 octets de l'opérande. Mais la norme est d'additionner la ''population count'' de groupes de bits un peu plus petits qu'un octet. Pour cela, il faut fabriquer des circuits capables d'additionner entre 2 et 8 bits, appelés des ''parallel counters'', terme que nous traduirons par '''compteurs parallèles'''. [[File:POPCOUNT avec un additionneur multiopérande.png|centre|vignette|upright=2|Circuit de calcul de population count.]] Il se trouve que nous avons déjà vu des compteurs parallèles dans les chapitres précédents. Les additionneurs complets sont des compteurs parallèles 3 bits, les demi-additionneurs sont des compteurs parallèle 2 bits. Pour rappel, le premier additionne trois bits, alors que le second additionne deux bits. Dans ce qui suit, nous allons utiliser les abréviations suivantes : FA (''Full-Adder) pour additionneur complet, HA (''Half-Adder) pour demi-additionneur. Le calcul de la ''population count'' peut donc utiliser des FA comme compteurs parallèles. Un tel additionneur regroupe les bits de l'opérande par triplets et additionne chaque triplet avec un FA. S'il reste une paire de bits isolées après avoir formé les triplets, elle est additionnée avec un HA. Les FA/HA calcule des ''population count'' intermédiaires codées sur 2 bits, qui sont ensuite additionnées par l'additionneur multi-opérande. Le circuit ne paye pas de mine, mais c'est un circuit de ce style qui a été utilisé sur le processeur ARM1, un des tout premier CPU ARM, prévu pour les premiers iPhones. [[File:POPCNT circuit.png|centre|vignette|upright=2|Illustration de la première couche du circuit de POPCNT.]] Le circuit précédent additionne un grand nombre de résultat intermédiaires codées sur 2 bits. L'idéal serait pourtant l'inverse : moins d'opérandes à additionner, mais celles-ci sont plus longues. Pour cela, il faut remplacer les FA par des compteurs parallèles qui fournissent des résultats codés sur 4, 5, 6, 7 bits, parfois plus. Intuitivement, on se dit qu'il faudrait découper les opérandes en groupes de 4, 8, 16 bits, ou toute autre puissance de deux. Sauf que ce n'est pas l'idéal. Par exemple, avec un résultat de 3 bits, on peut coder les valeurs de 0 à 7, ce qui fait 7 bits. Sur 4 bits, cela permet de gérer 15 bits, pas plus. Sur 5 bits, cela permet de gérer 63 bits d'entrée. À chaque fois, il nous manque un bit pour avoir un groupe bien rond de 4, 8, 16 bits. La raison est qu'il faut encoder le zéro pour le résultat. Les compteurs parallèles peuvent être construits comme n'importe quel circuit combinatoire, à partir de la table de vérité. Mais ils peuvent aussi être construits en combinant des compteurs parallèles plus petits avec un additionneur. Il s'agit de l'implémentation la plus simple, la moins optimisée, la plus gourmande en portes logiques. Heureusement, des simplifications sont possibles, comme on le verra dans la suite du chapitre. [[File:Population count avec des compteurs parallèles.png|centre|vignette|upright=2|Population count avec des compteurs parallèles]] ===Les compteurs parallèles de moins de 8 bits=== Dans cette section, nous allons voir comment créer des compteurs parallèles en utilisant des FA/HA, couplés à un additionneur. Nous simpliferons ces circuits par la suite. Le premier exemple intéressant est le '''compteur parallèle 4 bits''', qui prend 4 bits d'opérande et fournit un résultat de 3 bits. Premièrement, il additionne les bits d'opérande deux par deux, avec deux HA/ Les deux résultats de 2 bits sont ensuite additionnés avec un additionneur 2 bits. Le circuit final est le suivant : [[File:Compteur parallèle de 4 bits, fabriqué avec des HA et FA.png|centre|vignette|upright=2.5|Compteur parallèle de 4 bits, fabriqué avec des HA et FA]] Pour les compteurs parallèles de plus de 4 bits, il devient intéressant d'additionner les bits par groupes de 3, par triplet. Les bits d'un triplet sont additionnés avec un FA, ce qui donne un résultat sur deux bits. Le compteur parallèle 5 bits est construit sur le même modèle. Il calcule la ''population count'' d'une paire de bit et d'un triplet de bit, et additionne le tout avec un additionneur 2 bits. [[File:Compteur parallele 5 bits, naïf.png|centre|vignette|upright=2|Compteur parallele 5 bits, naïf]] Pour un compteur de 6 bits, la première couche ne contient que des FA, tout en conservant l'additionneur 2 bits. [[File:Compteur parallele 4bits.png|centre|vignette|upright=2|Compteur parallèle 6 bits]] Dans l'exemple précédent, il est intéressant d'ajouter un 7ème bit d'opérande, pour profiter de l'entrée de retenue de l'additionneur. En effet, tous les additionneurs dignes de ce nom disposent d'une entrée de retenue, utilisée pour l'incrémentation ou d'autres opérations. Elle permet d'ajouter un bit en plus, sur la colonne des bits de poids faible. Et bien on peut rajouter un 7ème bit sur cette entrée. Et dans le cas général, au lieu d'additionner des triplets de bits, on peut rajouter un bit en plus. [[File:Compteur parallel 7bits.png|centre|vignette|upright=2|Compteur parallèle 7 bits]] ===Les simplifications liées aux demi-additionneurs=== Les compteurs vus plus haut peuvent être simplifiés, afin de faire des économies de portes logiques. Les compteurs parallèle de 6 et 7 bits ne peuvent pas se simplifier facilement, mais ceux de 4 et 5 bits le peuvent. Les simplifications sont liés au fait que ces deux circuits intégrent des paires de HA en série, à savoir que le second prend l'entrée du premier. Et à une porte logique près, ces deux HA en série forment un FA. Pour le compteur parallèle 5 bits, la simplification donne le circuit suivant. Le circuit originel avait deux HA et deux FA, cette version simplifié élimine un HA, ce qui fait une petite économie de circuits. Avec cette simplification, on perd l'organisation en deux couches : une couche de FA/HA qui calcule la ''population count'' de paires/triplets de bits, suivi par un additionneur 2 bits. Mais le seul désavantage est que le circuit est moins simple à expliquer, ce qui est juste un petit défaut. [[File:Circuit de calcul de PCOUNT de 5 bits.png|centre|vignette|upright=2|Circuit de calcul de PCOUNT de 5 bits]] Pour le compteur parallèle 4 bits, une implémentation alternative donne le circuit suivant. Le circuit incorpore un FA et deux HA, contre 4 HA avec le circuit de base. Sachant qu'un FA contient 2 HA et une porte logique, le circuit n'économise pas de portes logiques. Notez que ce circuit peut être interprété comme un FA couplé à un additionneur. Précisément, il additionne trois bits, puis décide d'incrémenter le résultat ou non suivant la valeur du quatrième bit. Le circuit est donc composé d'un FA suivi par un incrémenteur commandable (son entrée de retenue est configurable). [[File:Compteur parallèle de 4 bits, version alternative.png|centre|vignette|upright=2|Compteur parallèle de 4 bits, version alternative]] ===Les ''adders compressors'' : fusionner des additionneurs complets=== Nous venons de voir une simplification assez basique, à savoir fusionner plusieurs HA en un seul FA. Mais est-ce qu'il existe un équivalent pour les FA ? A savoir un circuit qui fusionne plusieurs FA en un seul circuit amélioré ? intuitivement, on se dit que non, car un tel circuit serait tout sauf intuitif pour ce qui est des retenues. Sauf que la réponse est oui, il existe des circuits qui fusionnent plusieurs FA entre eux et fournit exactement les mêmes sorties que les FA fusionnés. De tels circuits sont appelés des '''''adder compressors'''''. Les ''adder compressors'' sont utilisés dans le cadre de l'addition multiopérande en général, pas seulement pour le calcul de la ''population count''. Ils sont surtout utilisés dans les additionneurs multiopérandes en arbre. Les arbres de Wallace ou de Dadda peuvent être modifiés de manière à fusionner des FA d'une même couche, en les remplaçant par des ''adder compressors''. Mais la construction de l'arbre d'additionneur est alors beaucoup plus complexe, ce qui explique pourquoi je n'en ai pas parlé dans le chapitre sur l'addition multiopérande. Les ''adder compressors'' fournissent le bit de poids faible du résultat et les différentes retenues des additions intermédiaires fournies par les FA fusionnés. Par exemple, prenons le compteur parallèle de 5 bits, composé de deux FA placés l'un à la suite de l'autre, avec un HA qui additionne les deux retenues produites par les deux FA. Les deux FA peuvent être remplacés par un mal-nommé ''adder compressor'' 4:2, qui prend 5 bit d'opérande et fournit les trois mêmes sorties que les deux FA : le bit de poids faible du résultat final, les deux retenues des additions intermédiaires. Les retenues doivent être combinées ensemble par des circuits à part, pour obtenir un compteur parallèle. Dans le cadre de l'addition multiopérande, les retenues sont simplement propagées à la colonne suivante, elles sont envoyées en entrée d'un autre ''adder compressor''. [[File:Simplification d'un compteur parallèle 5 bits avec un adder compressor.png|centre|vignette|upright=2|Simplification d'un compteur parallèle 5 bits avec un adder compressor.]] L'avantage est que le calcul du bit de somme est simplifié. Le mieux est de partir de l'exemple avec un compteur parallèle 5 bits, avec ses deux FA en série. Voici ce que l'on obtient en enchainant deux FA, au niveau des XOR : [[File:Adder compressor 4-2.png|centre|vignette|upright=2|Adder compressor 4-2]] Le schéma montre que l'on a quatre portes XOR placées en série, ce qui est tout sauf idéal. Mieux vaut essayer de les mettre en parallèle, pour gagner un petit peu en rapidité. Il est par exemple possible d'améliorer le circuit précédent pour passer de 4 portes en série à seulement 3, ce qui est légèrement plus rapide. [[File:Adder compressor 4-2 optimisé.png|centre|vignette|upright=2|Adder compressor 4-2 optimisé]] En clair, la fusion des FA permet de réorganiser la chaine de portes XOR qui calcule le bit de somme. Les portes XOR doivent idéalement former un arbre équilibré, de manière à réduire le nombre de portes XOR à traverser. Un ''adder compressor'' utilise l'arbre des portes XOR idéal, mais calcule les retenues par groupes de 3 bits. [[File:Addition des bits de somme.png|centre|vignette|upright=2|Addition des bits de somme avec des HA : arbre équilibré]] ==Les opérations FFS, FFZ, CTO et CLO== Dans cette section, nous allons aborder plusieurs opérations fortement liées entre elles, illustrées dans le schéma ci-dessous. Elles sont très courantes sur la plupart des ordinateurs, surtout dans les ordinateurs embarqués. Beaucoup d'ordinateurs, comme les anciens mac avec des processeurs type Power PC et les processeurs MIPS ou RISC ont des instructions pour effectuer ces opérations. 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", "les 0 de poids faible" et quelques autres du même genre. Quand nous parlerons du 0 de poids faible, nous voudrons parler du premier 0 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0011 1011, le 0 de poids faible est le troisième bit en partant de la droite. Quand nous parlerons du 1 de poids faible, c'est la même chose, mais pour le premier bit à 1. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant aux expressions "le 1 de poids fort" et "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Par contre, les expressions "LES 1 de poids faible" ou "LES 0 de poids faible" ne parlent pas de la même chose. Quand nous voudrons parler des 1 de poids faible, au pluriel, nous voulons dire : tous les bits situés avant le 0 de poids faible. Par exemple, prenons le nombre 0011 0011 : les 1 de poids faible correspondent ici aux deux premiers bits en partant de la droite. Même chose quand on parle des zéros de poids faible au pluriel. Quant aux expressions "les 1 de poids fort" ou "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Les opérations que nous allons voir sont au nombre de 8 et elles s'expliquent facilement avec le schéma ci-dessous. [[File:Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.png|centre|upright=2.0|vignette|Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.]] Les quatre opération suivantes donnent la position des 0/1 de poids faible/fort : * L'opération '''''Find First Set''''', donne la position du 1 de poids faible. * L'opération '''''Find highest set''''' donne la position du 1 de poids fort. * L'opération '''''Find First Zero''''' donne la position du 0 de poids faible (le plus à droite). * L'opération '''''Find Highest Zero''''' donne la position du 0 de poids fort (le plus à gauche). Elles ont des opérations corolaires qui elles, comptent le nombre de 0/1 avant ou après des 0/1 de poids fort/faible. * L'opération '''''Count Trailing Zeros''''' compte les zéros situés à droite du 1 de poids faible. * L'opération '''''Count Leading Zeros''''' compte les zéros à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' compte les 1 situés à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' compte les 1 situés à droite du 0 de poids faible. Dans toutes ces opérations, les bits sont numérotés, leur numéro étant appelé leur position ou leur indice. La position d'un bit est donc donnée par ce numéro. Ces opérations varient selon la méthode utilisée pour numéroter les bits. On peut commencer à compter les bits à partir de 0, le 0 étant le numéro du bit de poids faible. Mais on peut aussi compter à partir de 1, le bit de poids faible étant celui de numéro 1. Ces deux conventions ne sont pas équivalentes. Si on choisit la première convention, certaines opérations sont équivalentes. Par exemple, les opérations ''Count Trailing Zeros'' et ''Find First Set'' donnent toutes les deux le même résultat. Avec la première convention, pour un nombre codé sur <math>n</math> bits, on a : : <math>\text{fhs} + \text{clz(n)} = n - 1</math> : <math>\text{fhz} + \text{clo(n)} = n - 1</math> : <math>\text{ffs} = \text{ctz(n)}</math> : <math>\text{ffz} = \text{cto(n)}</math> On voit que certaines opérations sont équivalentes, ce qui nous arrange bien. Il y a deux classes d'opérations : celles à gauche dans les équations précédentes, celles à droite. Les premiers donnent la position du 0/1 de poids faible/fort, celles qui comptent des 0/1 de poids faibles/fort. Et les deux classes s'implémentent par des circuits très différents. ===L'implémentation avec un encodeur à priorité=== La première implémentation implémente les quatre calculs suivants : * le ''Find First Set'', abréviée FFS ; * le ''Find Highest set'', abrévié FHS ; * le ''Find First Zero'', abréviée FFZ ; * le ''Find highest Zero'', abrévié FHZ. Implémenter chaque opération peut se faire avec un encodeur à priorité. Pour les quatre opérations précédentes, il existe un encodeur à priorité qui s'en charge. Par exemple, on peut utiliser un encodeur à priorité qui donne la position du 1 de poids fort, c’est-à-dire qui réalise l'opération ''Find Highest Set''. Il existe aussi un autre encodeur à priorité qui lui donne la position du 1 de poids faible, ce qui correspond à l'opération ''Find First Set''. Il existe aussi un encodeur qui donne la position du zéro de poids faible (''Find First Zero'') et un autre qui donne celle du zéro de poids fort (''Find highest Zero''). Mais utiliser quatre encodeurs différents n'est pas l'idéal. Il est en effet possible de faire avec un seul encodeur. L'idée est qu'un encodeur à priorité est composé d'un encodeur normal, couplé à un circuit de priorité qui sélectionne le 0/1 de poids fort/faible. L'idée est de rendre ce circuit configurable, de manière à choisir l'opération voulue parmi les 4 précédentes. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité]] Une autre méthode utilise un inverseur commandable. En, effet, les opérations FHS et FHZ peuvent se déduire l'une de l'autre, en inversant le nombre passé en entrée : les 0 de poids fort deviennent alors des 1 de poids fort, et vice-versa. Idem pour les opérations FFS et FFZ. En inversant l'entrée, le 1 de poids faible deviendra le 0 de poids faible et inversement. Inverser les bits de l'entrée se fait avec un inverseur commandable. [[File:Circuit qui effectue les opérations FHS, FFS, CLZ et autres.png|centre|vignette|upright=2|Circuit qui effectue les opérations FHS, FFS, CLZ et autres.]] ===L'implémentation avec la ''population count''=== Maintenant, voyons comment implémenter les quatre opérations suivantes. Il s'agit des opérations qui comptent les 0 ou 1 de poids faible, et ceux de poids fort. * L'opération '''''Count Trailing Zeros''''' donne le nombre de zéros situés à droite de ce 1 de poids faible. * L'opération '''''Count Leading Zeros''''' donne nombre de zéros situés à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' donnent le nombre de 1 à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' donne le nombre de 1 à droite du 0 de poids faible. Les quatre opérations listées plus haut comptent un certain nombre de 0 ou 1. Compter des 1 ressemble beaucoup à ce que fait le circuit de ''population count''. La différence est qu'ici, seuls certains bits sont à prendre en compte : ceux situés à droite/gauche d'un 0/1 de poids faible/fort. Or, nous avons déjà un outil pour ignorer certains bits : l'usage de masques avec des opérations bit à bit. L'idée est alors de générer un masque qui indique la position des 0/1 de poids faible/fort. Chaque bit du masque est associé au bit à la même place dans l'opérande, celui de même poids. Un bit du masque à 1 indique que le bit est à prendre en compte, alors qu'un bit à 0 indique un bit à ignorer. Par exemple, prenons le cas où on veut compter le nombre de ''Trailing Zeros'', à savoir les 0 de poids faible, ceux situés à droite du premier 1 rencontré en lisant l'opérande de droite à gauche. La première étape génère un nombre qui a un 1 à la place de chaque ''Trailing Zero'', et un 0 ailleurs. {|class="wikitable" |- ! Opérande | 0010 1101 1001 1000 0000 |- ! Masque | 0000 0000 0000 0111 1111 |} Une fois le masque voulu obtenu, on compte le nombre de 1 dans le masque généré. En clair, on calcule sa ''population count''. Le résultat donne le nombre voulu. Le circuit qui génère le masque a une implémentation similaire à celle utilisée par un encodeur à priorité. Avec un encodeur à priorité qui calcul l'opération ''Find First Set'', le circuit met à 0 les bits qui suivent le 1 de poids fort. Avec l'opération ''Count Leading Zero'', le circuit fait la même chose, sauf que les bits sont mis à 1. Le circuit est construit de la même manière, comme illustré ci-dessous. Il s'agit de l'implémentation la plus simple, composée de briques qui mettent à 0/1 un bit de l'opérande, qui sont enchainés les uns à la suite des autres. [[File:L'implémentation de l'opération CLZ avec la population count.png|centre|vignette|upright=2|L'implémentation de l'opération CLZ avec la population count]] Le circuit précédent met à 1 un bit à la fois. Une amélioration serait d'en traiter plusieurs à la fois. Par exemple, on peut imaginer un circuit qui traite des groupes de 4/5 bits. Pour chaque groupe, un circuit détecte les 1 de poids fort et met les bits suivants à 1. Le circuit peut se concevoir simplement avec un tableau de Karnaugh. Évidemment, pour enchainer plusieurs circuits, il faut gérer le cas où un 1 de poids fort a été détecté dans un groupe précédent et mettre toutes les sorties à 1 cas échéant, avec un circuit de mise à 111111 qu'on a déjà vu. [[File:Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT.png|centre|vignette|upright=2|Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT]] Une version améliorée de cette technique a apparemment été utilisée par Intel dans certains de ces processeurs, le brevet "Combined set bit count and detector logic" détaille l'implémentation d'une technique similaire. ==Les circuits générateurs/vérificateurs d'ECC== Au tout début de ce cours, nous avions vu les codes ECC, qui détectent ou corrigent des corruptions de données. Si un bit est altéré, ils permettent de détecter que le bit en question a été inversé, et peuvent éventuellement le corriger pour retrouver la donnée initiale. Les deux codes ECC les plus connus sont le bit de parité et les codes de Hamming. Et ils sont très liés à la ''population count''. Dans ce qui suit, nous allons voir des circuits qui calculent soit un bit de parité, soit le code de Hamming d'un nombre. ===Le générateur de bit de parité=== Pour rappel, le bit de parité permet de détecter qu'un bit a été inversé, à savoir qu'il est passé de 1 à 0 ou inversement. Pour cela, on ajoute un bit de parité aux données à sécuriser, afin que le nombre de bits à 1 soit pair, bit de parité inclus. En clair, le bit de parité vaut 0 si la donnée a un nombre de bits à 1 pair, il vaut 1 si ce nombre est impair. Dans cette section, nous allons voir un circuit qui calcule le bit de parité d'un opérande. [[File:Circuit de parité.PNG|vignette|Circuit de parité]] Intuitivement, on se dit qu'il faut compter les 1 dans l'opérande, avant de calculer sa parité et d'en déduire le bit de parité. Le bit de parité est donc le bit de poids faible de la ''population count''. Le bit de parité se calcule donc en additionnant les bits de l'opérande, mais sans tenir compte des bits de poids fort, sans tenir compte des retenues, en ne conservant que le bit de somme. Lors de l'addition de deux bits, ce bit de somme est calculé en faisant un XOR entre les deux bits à additionner. Pour N bits, il suffit d'enchainer N-1 portes XOR. Avec cette logique, on peut créer un '''générateur de parité parallèle''', un circuit qui calcule le bit de parité d'un opérande, en faisant un XOR entre tous ses bits. En réfléchissant, on devine qu'on peut structurer les portes XOR comme illustré ci-contre. Le circuit précédent calcule le bit de parité d'un opérande. Pour ce qui est de vérifier si une donnée est corrompue, rien de plus simple : il suffit de générer le bit de parité de la donnée seule, et de le comparer avec le bit de parité stocké dans la donnée avec la porte logique adaptée. Le circuit qui génère un bit de parité et celui qui vérifie si le bit de parité est valide sont donc très similaires. ===Le générateur/''checker'' d'ECC=== [[File:Hamming(7,4).svg|vignette|Hamming(7,4)]] Les codes de Hamming calculent plusieurs bits de parité, qui sont chacun calculés en prenant en compte certains bits de l'opérande. Par exemple, le code de Hamming de type 7,4 prend des données sur 4 bits, et leur ajoute 3 bits de parité, ce qui fait en tout 7 bits : c'est de là que vient le nom de 7-4-3 du code. Chaque bit de parité se calcule à partir de 3 bits du nombre. Le schéma ci-contre indique quels sont les bits de données utilisés pour calculer un bit de parité : les bits de parité sont notés p, les bits de données d. L'implémentation matérielle est donc très simple : un circuit qui génère un code de Hamming est composé de plusieurs circuits de génération de parité, idem pour un circuit qui vérifie le code de Hamming d'un opérande. Étudions par exemple le circuit suivant, conçu pour le code 7-4-3. Il vérifie si les 4 bits de données sont valides, à savoir si les trois bits d'ECC collent bien aux données associées. Si les deux valeurs correspondent, il n'y a pas d'erreur. Mais si les bits ne correspondent pas, alors on sait quel bit est erroné en regardant quel bit d'ECC est invalide. Le circuit corrige alors le bit erroné. En premier lieu, le circuit calcule le code de Hamming des 4 bits de données, avec une première couche de portes XOR. Le résultat est alors comparé avec les trois bits d'ECC présents dans l'opérande, par un comparateur d'égalité, lui-même construit avec des portes XOR. Le tout est suivi par un circuit de correction d'erreur. Une couche de portes ET/NON sélectionne le bit à corriger. Elle génère un masque de 4 bits qui indique quel bit inverser : celui dont le bit du masque est à 1. La dernière couche de portes XOR prend ce masque et l'applique aux 4 bits de données, ce qui inverse le bit adéquat. [[File:HammingCircuit.png|centre|vignette|upright=2|Circuit de vérification d'un code de Hamming 7,4.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits pour la multiplication et la division | prevText=Les circuits pour la multiplication et la division | next=Les circuits de calcul flottant | nextText=Les circuits de calcul flottant }} </noinclude> tr0h6ae153e163uhhdmvot5r801bpfr 767940 767939 2026-06-17T16:54:53Z Mewtow 31375 /* Les compteurs parallèles de moins de 8 bits */ 767940 wikitext text/x-wiki Dans ce chapitre, nous allons voir les '''opérations de manipulation de bits''', des opérations qui manipulent les bits d'un opérande. La différence avec les opérations bit à bit est que les bits de colonnes différentes peuvent être combinés entre eux pour fournir leur résultat, elles peuvent les faire changer de place, en supprimer, en ajouter, etc. Mais cela deviendra plus compréhensible en voyant quelques exemples d'opérations de ce genre. ==Le test d'un bit dans un opérande entier== Une opération assez courante teste si un bit précis vaut 0 ou 1, dans une opérande. Par exemple, si je prends l'opérande 0001 1010 (codée sur 8 bits). Je peux tester si le cinquième bit en partant de la droite vaut 1, ou s'il vaut zéro. Ici, le bit vaut 1. En logiciel, le programmeur implémente cette opération en utilisant un masque. L'idée est que l'on masque les bits non-sélectionnés, puis on analyse le résultat. En l’occurrence, le masque sélectionne le bit voulu et mets les autres à zéro. Le résultat est alors comparé avec zéro, pour savoir quelle est la valeur du bit sélectionné. Si le résultat vaut zéro, alors le bit sélectionné vaut zéro. S'il est différent de zéro, alors le bit sélectionné vaut 1. [[File:Masques 2.png|centre|vignette|upright=2.5|Masques pour tester un bit.]] Mais en matériel, on dispose d'un circuit qui fait cela naturellement : le multiplexeur ! Sélectionner un bit dans une opérande est la raison d'être d'un multiplexeur. Il suffit de lui envoyer la position du bit voulu, et voilà ! On récupère le bit sélectionné. Reste alors à le comparer avec la valeur voulue. Si on veut tester si le bit vaut 1, il n'y a rien à faire : le bit testé est lui-même le résultat de la comparaison. Mais si on veut tester si le bit vaut zéro, il faut alors inverser le résultat : le résultat doit valoir 1 si le bit vaut zéro et inversement. En clair, il suffit de combiner un multiplexeur avec un inverseur commandable. : Au passage, intérieurement, un multiplexeur fait la même chose que logiciel. Il contient un décodeur pour générer le masque, applique le masque avec une couche de portes ET, puis compare le résultat avec zéro avec une porte OU. ==L'opération de ''population count''== L'opération de '''''population count''''' compte le nombre de bits à 1 d'un opérande entier. Elle est très utilisée quand on manipule des tableaux de bits, pour le codage/décodage vidéo/audio, pour crypter/décrypter des données, etc. Les réseaux de neurones artificiels, notamment ceux utilisés dans l'intelligence artificielle, font aussi usage de cette opération. Elle est aussi très courante dans les algorithmes de correction d'erreur, utilisés dans les transmissions réseaux ou dans certaines mémoires. En général, les autres livres d'architecture des ordinateurs parlent de l'opération elle-même, mais pas des circuits pour la calculer. Mais j'ai choisit de vous en parler, car cela montre une utilisation des additionneurs multi-opérande, qui ne servent pas que pour les circuits multiplieurs. ===Le circuit de ''population count'' : les compteurs parallèles=== La ''population count'' est un cas particulier d'addition multiopérande, où chaque opérande fait 1 bit. En effet, pour calculer la ''population count'' d'un opérande de N bits, il faut additionner ces N bits entre eux. Et les techniques vues dans le chapitre sur l'addition multiopérande marchent aussi pour la ''population count''. La technique la plus simple est celle dite du diviser pour régner. L'idée est que si on découpe l'opérande en deux, la ''population count'' est la somme des ''population count'' de chaque partie. Par exemple, pour calculer la ''population count'' d'un entier 32 bits (4 octets), on peut additionner les ''population count'' des 4 octets de l'opérande. Mais la norme est d'additionner la ''population count'' de groupes de bits un peu plus petits qu'un octet. Pour cela, il faut fabriquer des circuits capables d'additionner entre 2 et 8 bits, appelés des ''parallel counters'', terme que nous traduirons par '''compteurs parallèles'''. [[File:POPCOUNT avec un additionneur multiopérande.png|centre|vignette|upright=2|Circuit de calcul de population count.]] Il se trouve que nous avons déjà vu des compteurs parallèles dans les chapitres précédents. Les additionneurs complets sont des compteurs parallèles 3 bits, les demi-additionneurs sont des compteurs parallèle 2 bits. Pour rappel, le premier additionne trois bits, alors que le second additionne deux bits. Dans ce qui suit, nous allons utiliser les abréviations suivantes : FA (''Full-Adder) pour additionneur complet, HA (''Half-Adder) pour demi-additionneur. Le calcul de la ''population count'' peut donc utiliser des FA comme compteurs parallèles. Un tel additionneur regroupe les bits de l'opérande par triplets et additionne chaque triplet avec un FA. S'il reste une paire de bits isolées après avoir formé les triplets, elle est additionnée avec un HA. Les FA/HA calcule des ''population count'' intermédiaires codées sur 2 bits, qui sont ensuite additionnées par l'additionneur multi-opérande. Le circuit ne paye pas de mine, mais c'est un circuit de ce style qui a été utilisé sur le processeur ARM1, un des tout premier CPU ARM, prévu pour les premiers iPhones. [[File:POPCNT circuit.png|centre|vignette|upright=2|Illustration de la première couche du circuit de POPCNT.]] Le circuit précédent additionne un grand nombre de résultat intermédiaires codées sur 2 bits. L'idéal serait pourtant l'inverse : moins d'opérandes à additionner, mais celles-ci sont plus longues. Pour cela, il faut remplacer les FA par des compteurs parallèles qui fournissent des résultats codés sur 4, 5, 6, 7 bits, parfois plus. Intuitivement, on se dit qu'il faudrait découper les opérandes en groupes de 4, 8, 16 bits, ou toute autre puissance de deux. Sauf que ce n'est pas l'idéal. Par exemple, avec un résultat de 3 bits, on peut coder les valeurs de 0 à 7, ce qui fait 7 bits. Sur 4 bits, cela permet de gérer 15 bits, pas plus. Sur 5 bits, cela permet de gérer 63 bits d'entrée. À chaque fois, il nous manque un bit pour avoir un groupe bien rond de 4, 8, 16 bits. La raison est qu'il faut encoder le zéro pour le résultat. Les compteurs parallèles peuvent être construits comme n'importe quel circuit combinatoire, à partir de la table de vérité. Mais ils peuvent aussi être construits en combinant des compteurs parallèles plus petits avec un additionneur. Il s'agit de l'implémentation la plus simple, la moins optimisée, la plus gourmande en portes logiques. Heureusement, des simplifications sont possibles, comme on le verra dans la suite du chapitre. [[File:Population count avec des compteurs parallèles.png|centre|vignette|upright=2|Population count avec des compteurs parallèles]] ===Les compteurs parallèles de moins de 8 bits=== Dans cette section, nous allons voir comment créer des compteurs parallèles en utilisant des FA/HA, couplés à un additionneur. Nous simpliferons ces circuits par la suite. Le premier exemple intéressant est le '''compteur parallèle 4 bits''', qui prend 4 bits d'opérande et fournit un résultat de 3 bits. Premièrement, il additionne les bits d'opérande deux par deux, avec deux HA/ Les deux résultats de 2 bits sont ensuite additionnés avec un additionneur 2 bits. Le circuit final est le suivant : [[File:Compteur parallèle de 4 bits, fabriqué avec des HA et FA.png|centre|vignette|upright=2.5|Compteur parallèle de 4 bits, fabriqué avec des HA et FA]] Pour les compteurs parallèles de plus de 4 bits, il devient intéressant d'additionner les bits par groupes de 3, par triplet. Les bits d'un triplet sont additionnés avec un FA, ce qui donne un résultat sur deux bits. Le compteur parallèle 5 bits est construit sur le même modèle. Il calcule la ''population count'' d'une paire de bit et d'un triplet de bit, et additionne le tout avec un additionneur 2 bits. [[File:Compteur parallele 5 bits, naïf.png|centre|vignette|upright=2|Compteur parallele 5 bits, naïf]] Pour un compteur de 6 bits, la première couche ne contient que des FA, tout en conservant l'additionneur 2 bits. [[File:Compteur parallele 4bits.png|centre|vignette|upright=2|Compteur parallèle 6 bits]] Dans l'exemple précédent, il est intéressant de remplacer le HA qui reste par un FA. L'entrée de retenue entrante est utilisée pour additionner un 7ème bit d'opérande. [[File:Compteur parallel 7bits.png|centre|vignette|upright=2|Compteur parallèle 7 bits]] ===Les simplifications liées aux demi-additionneurs=== Les compteurs vus plus haut peuvent être simplifiés, afin de faire des économies de portes logiques. Les compteurs parallèle de 6 et 7 bits ne peuvent pas se simplifier facilement, mais ceux de 4 et 5 bits le peuvent. Les simplifications sont liés au fait que ces deux circuits intégrent des paires de HA en série, à savoir que le second prend l'entrée du premier. Et à une porte logique près, ces deux HA en série forment un FA. Pour le compteur parallèle 5 bits, la simplification donne le circuit suivant. Le circuit originel avait deux HA et deux FA, cette version simplifié élimine un HA, ce qui fait une petite économie de circuits. Avec cette simplification, on perd l'organisation en deux couches : une couche de FA/HA qui calcule la ''population count'' de paires/triplets de bits, suivi par un additionneur 2 bits. Mais le seul désavantage est que le circuit est moins simple à expliquer, ce qui est juste un petit défaut. [[File:Circuit de calcul de PCOUNT de 5 bits.png|centre|vignette|upright=2|Circuit de calcul de PCOUNT de 5 bits]] Pour le compteur parallèle 4 bits, une implémentation alternative donne le circuit suivant. Le circuit incorpore un FA et deux HA, contre 4 HA avec le circuit de base. Sachant qu'un FA contient 2 HA et une porte logique, le circuit n'économise pas de portes logiques. Notez que ce circuit peut être interprété comme un FA couplé à un additionneur. Précisément, il additionne trois bits, puis décide d'incrémenter le résultat ou non suivant la valeur du quatrième bit. Le circuit est donc composé d'un FA suivi par un incrémenteur commandable (son entrée de retenue est configurable). [[File:Compteur parallèle de 4 bits, version alternative.png|centre|vignette|upright=2|Compteur parallèle de 4 bits, version alternative]] ===Les ''adders compressors'' : fusionner des additionneurs complets=== Nous venons de voir une simplification assez basique, à savoir fusionner plusieurs HA en un seul FA. Mais est-ce qu'il existe un équivalent pour les FA ? A savoir un circuit qui fusionne plusieurs FA en un seul circuit amélioré ? intuitivement, on se dit que non, car un tel circuit serait tout sauf intuitif pour ce qui est des retenues. Sauf que la réponse est oui, il existe des circuits qui fusionnent plusieurs FA entre eux et fournit exactement les mêmes sorties que les FA fusionnés. De tels circuits sont appelés des '''''adder compressors'''''. Les ''adder compressors'' sont utilisés dans le cadre de l'addition multiopérande en général, pas seulement pour le calcul de la ''population count''. Ils sont surtout utilisés dans les additionneurs multiopérandes en arbre. Les arbres de Wallace ou de Dadda peuvent être modifiés de manière à fusionner des FA d'une même couche, en les remplaçant par des ''adder compressors''. Mais la construction de l'arbre d'additionneur est alors beaucoup plus complexe, ce qui explique pourquoi je n'en ai pas parlé dans le chapitre sur l'addition multiopérande. Les ''adder compressors'' fournissent le bit de poids faible du résultat et les différentes retenues des additions intermédiaires fournies par les FA fusionnés. Par exemple, prenons le compteur parallèle de 5 bits, composé de deux FA placés l'un à la suite de l'autre, avec un HA qui additionne les deux retenues produites par les deux FA. Les deux FA peuvent être remplacés par un mal-nommé ''adder compressor'' 4:2, qui prend 5 bit d'opérande et fournit les trois mêmes sorties que les deux FA : le bit de poids faible du résultat final, les deux retenues des additions intermédiaires. Les retenues doivent être combinées ensemble par des circuits à part, pour obtenir un compteur parallèle. Dans le cadre de l'addition multiopérande, les retenues sont simplement propagées à la colonne suivante, elles sont envoyées en entrée d'un autre ''adder compressor''. [[File:Simplification d'un compteur parallèle 5 bits avec un adder compressor.png|centre|vignette|upright=2|Simplification d'un compteur parallèle 5 bits avec un adder compressor.]] L'avantage est que le calcul du bit de somme est simplifié. Le mieux est de partir de l'exemple avec un compteur parallèle 5 bits, avec ses deux FA en série. Voici ce que l'on obtient en enchainant deux FA, au niveau des XOR : [[File:Adder compressor 4-2.png|centre|vignette|upright=2|Adder compressor 4-2]] Le schéma montre que l'on a quatre portes XOR placées en série, ce qui est tout sauf idéal. Mieux vaut essayer de les mettre en parallèle, pour gagner un petit peu en rapidité. Il est par exemple possible d'améliorer le circuit précédent pour passer de 4 portes en série à seulement 3, ce qui est légèrement plus rapide. [[File:Adder compressor 4-2 optimisé.png|centre|vignette|upright=2|Adder compressor 4-2 optimisé]] En clair, la fusion des FA permet de réorganiser la chaine de portes XOR qui calcule le bit de somme. Les portes XOR doivent idéalement former un arbre équilibré, de manière à réduire le nombre de portes XOR à traverser. Un ''adder compressor'' utilise l'arbre des portes XOR idéal, mais calcule les retenues par groupes de 3 bits. [[File:Addition des bits de somme.png|centre|vignette|upright=2|Addition des bits de somme avec des HA : arbre équilibré]] ==Les opérations FFS, FFZ, CTO et CLO== Dans cette section, nous allons aborder plusieurs opérations fortement liées entre elles, illustrées dans le schéma ci-dessous. Elles sont très courantes sur la plupart des ordinateurs, surtout dans les ordinateurs embarqués. Beaucoup d'ordinateurs, comme les anciens mac avec des processeurs type Power PC et les processeurs MIPS ou RISC ont des instructions pour effectuer ces opérations. 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", "les 0 de poids faible" et quelques autres du même genre. Quand nous parlerons du 0 de poids faible, nous voudrons parler du premier 0 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0011 1011, le 0 de poids faible est le troisième bit en partant de la droite. Quand nous parlerons du 1 de poids faible, c'est la même chose, mais pour le premier bit à 1. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant aux expressions "le 1 de poids fort" et "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Par contre, les expressions "LES 1 de poids faible" ou "LES 0 de poids faible" ne parlent pas de la même chose. Quand nous voudrons parler des 1 de poids faible, au pluriel, nous voulons dire : tous les bits situés avant le 0 de poids faible. Par exemple, prenons le nombre 0011 0011 : les 1 de poids faible correspondent ici aux deux premiers bits en partant de la droite. Même chose quand on parle des zéros de poids faible au pluriel. Quant aux expressions "les 1 de poids fort" ou "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Les opérations que nous allons voir sont au nombre de 8 et elles s'expliquent facilement avec le schéma ci-dessous. [[File:Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.png|centre|upright=2.0|vignette|Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.]] Les quatre opération suivantes donnent la position des 0/1 de poids faible/fort : * L'opération '''''Find First Set''''', donne la position du 1 de poids faible. * L'opération '''''Find highest set''''' donne la position du 1 de poids fort. * L'opération '''''Find First Zero''''' donne la position du 0 de poids faible (le plus à droite). * L'opération '''''Find Highest Zero''''' donne la position du 0 de poids fort (le plus à gauche). Elles ont des opérations corolaires qui elles, comptent le nombre de 0/1 avant ou après des 0/1 de poids fort/faible. * L'opération '''''Count Trailing Zeros''''' compte les zéros situés à droite du 1 de poids faible. * L'opération '''''Count Leading Zeros''''' compte les zéros à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' compte les 1 situés à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' compte les 1 situés à droite du 0 de poids faible. Dans toutes ces opérations, les bits sont numérotés, leur numéro étant appelé leur position ou leur indice. La position d'un bit est donc donnée par ce numéro. Ces opérations varient selon la méthode utilisée pour numéroter les bits. On peut commencer à compter les bits à partir de 0, le 0 étant le numéro du bit de poids faible. Mais on peut aussi compter à partir de 1, le bit de poids faible étant celui de numéro 1. Ces deux conventions ne sont pas équivalentes. Si on choisit la première convention, certaines opérations sont équivalentes. Par exemple, les opérations ''Count Trailing Zeros'' et ''Find First Set'' donnent toutes les deux le même résultat. Avec la première convention, pour un nombre codé sur <math>n</math> bits, on a : : <math>\text{fhs} + \text{clz(n)} = n - 1</math> : <math>\text{fhz} + \text{clo(n)} = n - 1</math> : <math>\text{ffs} = \text{ctz(n)}</math> : <math>\text{ffz} = \text{cto(n)}</math> On voit que certaines opérations sont équivalentes, ce qui nous arrange bien. Il y a deux classes d'opérations : celles à gauche dans les équations précédentes, celles à droite. Les premiers donnent la position du 0/1 de poids faible/fort, celles qui comptent des 0/1 de poids faibles/fort. Et les deux classes s'implémentent par des circuits très différents. ===L'implémentation avec un encodeur à priorité=== La première implémentation implémente les quatre calculs suivants : * le ''Find First Set'', abréviée FFS ; * le ''Find Highest set'', abrévié FHS ; * le ''Find First Zero'', abréviée FFZ ; * le ''Find highest Zero'', abrévié FHZ. Implémenter chaque opération peut se faire avec un encodeur à priorité. Pour les quatre opérations précédentes, il existe un encodeur à priorité qui s'en charge. Par exemple, on peut utiliser un encodeur à priorité qui donne la position du 1 de poids fort, c’est-à-dire qui réalise l'opération ''Find Highest Set''. Il existe aussi un autre encodeur à priorité qui lui donne la position du 1 de poids faible, ce qui correspond à l'opération ''Find First Set''. Il existe aussi un encodeur qui donne la position du zéro de poids faible (''Find First Zero'') et un autre qui donne celle du zéro de poids fort (''Find highest Zero''). Mais utiliser quatre encodeurs différents n'est pas l'idéal. Il est en effet possible de faire avec un seul encodeur. L'idée est qu'un encodeur à priorité est composé d'un encodeur normal, couplé à un circuit de priorité qui sélectionne le 0/1 de poids fort/faible. L'idée est de rendre ce circuit configurable, de manière à choisir l'opération voulue parmi les 4 précédentes. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité]] Une autre méthode utilise un inverseur commandable. En, effet, les opérations FHS et FHZ peuvent se déduire l'une de l'autre, en inversant le nombre passé en entrée : les 0 de poids fort deviennent alors des 1 de poids fort, et vice-versa. Idem pour les opérations FFS et FFZ. En inversant l'entrée, le 1 de poids faible deviendra le 0 de poids faible et inversement. Inverser les bits de l'entrée se fait avec un inverseur commandable. [[File:Circuit qui effectue les opérations FHS, FFS, CLZ et autres.png|centre|vignette|upright=2|Circuit qui effectue les opérations FHS, FFS, CLZ et autres.]] ===L'implémentation avec la ''population count''=== Maintenant, voyons comment implémenter les quatre opérations suivantes. Il s'agit des opérations qui comptent les 0 ou 1 de poids faible, et ceux de poids fort. * L'opération '''''Count Trailing Zeros''''' donne le nombre de zéros situés à droite de ce 1 de poids faible. * L'opération '''''Count Leading Zeros''''' donne nombre de zéros situés à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' donnent le nombre de 1 à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' donne le nombre de 1 à droite du 0 de poids faible. Les quatre opérations listées plus haut comptent un certain nombre de 0 ou 1. Compter des 1 ressemble beaucoup à ce que fait le circuit de ''population count''. La différence est qu'ici, seuls certains bits sont à prendre en compte : ceux situés à droite/gauche d'un 0/1 de poids faible/fort. Or, nous avons déjà un outil pour ignorer certains bits : l'usage de masques avec des opérations bit à bit. L'idée est alors de générer un masque qui indique la position des 0/1 de poids faible/fort. Chaque bit du masque est associé au bit à la même place dans l'opérande, celui de même poids. Un bit du masque à 1 indique que le bit est à prendre en compte, alors qu'un bit à 0 indique un bit à ignorer. Par exemple, prenons le cas où on veut compter le nombre de ''Trailing Zeros'', à savoir les 0 de poids faible, ceux situés à droite du premier 1 rencontré en lisant l'opérande de droite à gauche. La première étape génère un nombre qui a un 1 à la place de chaque ''Trailing Zero'', et un 0 ailleurs. {|class="wikitable" |- ! Opérande | 0010 1101 1001 1000 0000 |- ! Masque | 0000 0000 0000 0111 1111 |} Une fois le masque voulu obtenu, on compte le nombre de 1 dans le masque généré. En clair, on calcule sa ''population count''. Le résultat donne le nombre voulu. Le circuit qui génère le masque a une implémentation similaire à celle utilisée par un encodeur à priorité. Avec un encodeur à priorité qui calcul l'opération ''Find First Set'', le circuit met à 0 les bits qui suivent le 1 de poids fort. Avec l'opération ''Count Leading Zero'', le circuit fait la même chose, sauf que les bits sont mis à 1. Le circuit est construit de la même manière, comme illustré ci-dessous. Il s'agit de l'implémentation la plus simple, composée de briques qui mettent à 0/1 un bit de l'opérande, qui sont enchainés les uns à la suite des autres. [[File:L'implémentation de l'opération CLZ avec la population count.png|centre|vignette|upright=2|L'implémentation de l'opération CLZ avec la population count]] Le circuit précédent met à 1 un bit à la fois. Une amélioration serait d'en traiter plusieurs à la fois. Par exemple, on peut imaginer un circuit qui traite des groupes de 4/5 bits. Pour chaque groupe, un circuit détecte les 1 de poids fort et met les bits suivants à 1. Le circuit peut se concevoir simplement avec un tableau de Karnaugh. Évidemment, pour enchainer plusieurs circuits, il faut gérer le cas où un 1 de poids fort a été détecté dans un groupe précédent et mettre toutes les sorties à 1 cas échéant, avec un circuit de mise à 111111 qu'on a déjà vu. [[File:Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT.png|centre|vignette|upright=2|Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT]] Une version améliorée de cette technique a apparemment été utilisée par Intel dans certains de ces processeurs, le brevet "Combined set bit count and detector logic" détaille l'implémentation d'une technique similaire. ==Les circuits générateurs/vérificateurs d'ECC== Au tout début de ce cours, nous avions vu les codes ECC, qui détectent ou corrigent des corruptions de données. Si un bit est altéré, ils permettent de détecter que le bit en question a été inversé, et peuvent éventuellement le corriger pour retrouver la donnée initiale. Les deux codes ECC les plus connus sont le bit de parité et les codes de Hamming. Et ils sont très liés à la ''population count''. Dans ce qui suit, nous allons voir des circuits qui calculent soit un bit de parité, soit le code de Hamming d'un nombre. ===Le générateur de bit de parité=== Pour rappel, le bit de parité permet de détecter qu'un bit a été inversé, à savoir qu'il est passé de 1 à 0 ou inversement. Pour cela, on ajoute un bit de parité aux données à sécuriser, afin que le nombre de bits à 1 soit pair, bit de parité inclus. En clair, le bit de parité vaut 0 si la donnée a un nombre de bits à 1 pair, il vaut 1 si ce nombre est impair. Dans cette section, nous allons voir un circuit qui calcule le bit de parité d'un opérande. [[File:Circuit de parité.PNG|vignette|Circuit de parité]] Intuitivement, on se dit qu'il faut compter les 1 dans l'opérande, avant de calculer sa parité et d'en déduire le bit de parité. Le bit de parité est donc le bit de poids faible de la ''population count''. Le bit de parité se calcule donc en additionnant les bits de l'opérande, mais sans tenir compte des bits de poids fort, sans tenir compte des retenues, en ne conservant que le bit de somme. Lors de l'addition de deux bits, ce bit de somme est calculé en faisant un XOR entre les deux bits à additionner. Pour N bits, il suffit d'enchainer N-1 portes XOR. Avec cette logique, on peut créer un '''générateur de parité parallèle''', un circuit qui calcule le bit de parité d'un opérande, en faisant un XOR entre tous ses bits. En réfléchissant, on devine qu'on peut structurer les portes XOR comme illustré ci-contre. Le circuit précédent calcule le bit de parité d'un opérande. Pour ce qui est de vérifier si une donnée est corrompue, rien de plus simple : il suffit de générer le bit de parité de la donnée seule, et de le comparer avec le bit de parité stocké dans la donnée avec la porte logique adaptée. Le circuit qui génère un bit de parité et celui qui vérifie si le bit de parité est valide sont donc très similaires. ===Le générateur/''checker'' d'ECC=== [[File:Hamming(7,4).svg|vignette|Hamming(7,4)]] Les codes de Hamming calculent plusieurs bits de parité, qui sont chacun calculés en prenant en compte certains bits de l'opérande. Par exemple, le code de Hamming de type 7,4 prend des données sur 4 bits, et leur ajoute 3 bits de parité, ce qui fait en tout 7 bits : c'est de là que vient le nom de 7-4-3 du code. Chaque bit de parité se calcule à partir de 3 bits du nombre. Le schéma ci-contre indique quels sont les bits de données utilisés pour calculer un bit de parité : les bits de parité sont notés p, les bits de données d. L'implémentation matérielle est donc très simple : un circuit qui génère un code de Hamming est composé de plusieurs circuits de génération de parité, idem pour un circuit qui vérifie le code de Hamming d'un opérande. Étudions par exemple le circuit suivant, conçu pour le code 7-4-3. Il vérifie si les 4 bits de données sont valides, à savoir si les trois bits d'ECC collent bien aux données associées. Si les deux valeurs correspondent, il n'y a pas d'erreur. Mais si les bits ne correspondent pas, alors on sait quel bit est erroné en regardant quel bit d'ECC est invalide. Le circuit corrige alors le bit erroné. En premier lieu, le circuit calcule le code de Hamming des 4 bits de données, avec une première couche de portes XOR. Le résultat est alors comparé avec les trois bits d'ECC présents dans l'opérande, par un comparateur d'égalité, lui-même construit avec des portes XOR. Le tout est suivi par un circuit de correction d'erreur. Une couche de portes ET/NON sélectionne le bit à corriger. Elle génère un masque de 4 bits qui indique quel bit inverser : celui dont le bit du masque est à 1. La dernière couche de portes XOR prend ce masque et l'applique aux 4 bits de données, ce qui inverse le bit adéquat. [[File:HammingCircuit.png|centre|vignette|upright=2|Circuit de vérification d'un code de Hamming 7,4.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits pour la multiplication et la division | prevText=Les circuits pour la multiplication et la division | next=Les circuits de calcul flottant | nextText=Les circuits de calcul flottant }} </noinclude> gif2mi0imgc9chw5m8h4nu1en6kud8n Fonctionnement d'un ordinateur/Les circuits de masquage 0 70434 767926 767858 2026-06-17T14:04:31Z Mewtow 31375 /* Le circuit qui combine les trois précédents */ 767926 wikitext text/x-wiki Dans ce chapitre, nous allons voir les '''opérations bit à bit''', un ensemble d'opérations qui appliquent une opération binaire sur un ou deux nombres. La plus simple d'entre elle est l'opération NON, aussi appelée opération de complémentation, qui inverse tous les bits d'un nombre. Il s'agit de l'opération la plus simple et nous en avions déjà parlé dans les chapitres précédents. Mais il existe des opérations bit à bit un chouia plus complexes, comme celles qui font un ET/OU/XOR entre deux nombres. Pour être plus précis, elles font un ET/OU/XOR entre les deux bits de même poids. L'exemple du OU bit à bit est illustré ci-dessous, les exemples du ET et du XOR sont similaires. [[File:Binary num bitwise OR.png|centre|vignette|upright=2|Opération OU bit à bit.]] De telles opérations sont appelées bit à bit car elles combinent les bits de même poids de deux opérandes. Par contre, il n'y a pas de calculs entre bits de poids différents, les colonnes sont traitées indépendamment. Elles sont très utilisées en programmation, et tout ordinateur digne de ce nom contient un circuit capable d'effectuer ces opérations. Dans ce chapitre, nous allons voir divers circuits capables d'effectuer des opérations bit à bit, et voir comment les combiner. Les opérations bit à bit classiques peuvent prendre une ou deux opérandes. La plupart en prenant deux comme les opérations ET/OU/XOR, l'opération NON en prend une seule. Les opérations bit à bit sur deux opérandes sont au nombre de 16, ce qui correspond au nombre de portes logiques à deux entrées possibles. Mais ce chiffre de 16 inclut les opérations bit à bit sur une opérande unique, qui sont au nombre de 4. Les opérations bit à bit sur une seule opérande sont plus simples à voir, nous verrons les opérations bit à bit à deux opérandes plus tard. ==Les opérations bit à bit à une opérande== Les opérations bit à bit n'ayant qu'une seule opérande sont au nombre de quatre : * Mettre à zéro l'opérande (porte FALSE). * Mettre à 11111...11111 l'opérande (porte TRUE). * Inverser les bits de l'opérande (porte NON). * Recopier l'opérande (porte OUI). Dans ce qui va suivre, nous allons créer un circuit qui prend en entrée une opérande, un nombre, et applique une des quatre opérations précédente. On peut choisir l'opération voulue grâce à plusieurs bits de commande, idéalement deux. Le circuit est composé à partir de circuits plus simples, au maximum trois : un circuit qui inverse le bit d'entrée à la demande, un autre qui le met à 1, un autre qui le met à 0. Ces trois circuits ont une entrée de commande qui détermine s'il faut faire l'opération, ou si le circuit doit se comporter comme une simple porte OUI, qui recopie sont entrée sur sa sortie et ne fait donc aucune opération. Le circuit recopie le bit d'entrée si cette entrée est à 0, mais il inverse/set/reset le bit d'entrée si elle est à 1. Pour comprendre comment concevoir ces circuits, il faut rappeler les relations suivantes, qui donnent le résultat d'un ET/OU/XOR entre un bit d'opérande noté a et un bit qui vaut 0 ou 1. {|class="wikitable" |- ! ! Opération ! Interprétation du résultat |- ! rowspan="2" | Porte ET | <math>a.0=0</math> | Mise à zéro du bit d'entrée |- | <math>a.1=a</math> | Recopie du bit d'entrée |- ! rowspan="2" | Porte OU | <math>a+1=1</math> | Mise à 1 du bit d'entrée |- | <math>a+0=a</math> | Recopie du bit d'entrée |- ! rowspan="2" | Porte XOR | <math>a \oplus 0=a</math> | Recopie du bit d'entrée |- | <math>a \oplus 1=\overline{a}</math> | Inversion du bit d'entrée |} Pour résumer ce qui va suivre : * Le circuit de mise à 1 commandable est une porte simple OU. * Le circuit d’inversion commandable est une simple porte XOR. * Le circuit de Reset, qui permet de mettre à zéro un bit si besoin, est une porte ET un peu modifiée. ===Le circuit de mise à la valeur maximale=== Dans cette section, nous allons voir un circuit : soit recopie l'entrée sur sa sortie, soit la met à 11111...111. Le choix entre les deux situations est réalisé par une entrée ''Set'' de 1 bit : un 1 sur cette entrée met la sortie à la valeur maximale, un 0 signifie que l'entrée est recopiée en sortie. Ce circuit est utilisé pour gérer les débordements d'entier avec l'arithmétique saturée (revoir le chapitre sur le codage des entiers pour plus d'explications). Le circuit de mise à 111111...111 gére le cas où le calcul déborde, ce qui demande de mettre la sortie à la valeur maximale. Évidemment, le circuit de calcul doit non seulement faire le calcul, mais aussi détecter les débordements d'entiers, afin de fournir le bit pour l'entrée ''Set''. Mais nous verrons cela dans le chapitre sur les circuits de calcul entier. La porte OU est toute indiquée pour cela. La mise à 1 d'un bit d'entrée demande de faire un OU de celui-ci avec un 1, alors que recopier un bit d'entrée demande de faire un OU de celui-ci avec un 0. [[File:Circuit de mise à 1111111...11.png|centre|vignette|upright=2|Circuit de mise à 1111111...11]] ===Le circuit de mise à zéro=== Le circuit de ''Reset'' fait la même chose que le circuit précédent, sauf que sa sortie n'est pas mise à 1111...1111, mais à 0. Le circuit de ''Reset'' prend en entrée un bit de ''Reset'' qui indique s'il faut mettre à zéro l'entrée ou non. Si le signal Reset est à 1, alors on met à zéro le bit d'entrée, mais on le laisse intact sinon. Le tableau ci-dessus nous dit que la porte ET est adaptée : elle recopie le bit d'entrée si le bit de commande vaut 1, et elle le met à 0 si le bit de commande vaut 0. Cependant, rappelons que l'on souhaite que le le circuit fasse un ''Reset'' si le bit de commande est à 1, pas 0, et la porte ET fait l'inverse. Pour corriger cela, on doit ajouter une porte NON. Le tout donne le circuit ci-dessous. [[File:Circuit de mise à zéro d'un bit.png|centre|vignette|upright=2|Circuit de mise à zéro d'un bit]] Un circuit qui met à zéro un nombre est composé de plusieurs circuits ci-dessus, à la différence que la porte NON est potentiellement partagée. Par contre, chaque bit est bien relié à une porte ET. [[File:Circuit de mise à zéro.png|centre|vignette|upright=2|Circuit de mise à zéro]] ===L'inverseur commandable=== L''''inverseur commandable''' est un circuit qui, comme son nom l'indique, inverse les bits d'entrée si un bit de commande nommé ''Invert'' vaut 1. La porte XOR est toute indiquée pour, ce qui fait que le circuit d'inversion commandable est composé d'une couche de portes XOR, chaque porte ayant une entrée connectée au bit de commande. [[File:Inverseur commandable.png|centre|vignette|upright=2|Inverseur commandable par un bit.]] ===Le circuit qui combine les trois précédents=== Voyons maintenant un circuit qui combine les trois circuits précédents, appelé la '''porte logique universelle 1 bit'''. Elle s'appelle ainsi car elle regroupe les quatre portes logiques de 1 bit en une seule. Suivant comment on la configure, elle peut servir de porte OUi, de porte NON, de porte TRUE ou de porte FALSE. Et elle est bien plus utile que vous ne pouvez le penser, on l'utilisera d'ailleurs dans ce cours. L'implémentation naïve met les trois circuits les uns à la suite des autres, ce qui donne pour chaque bit d'opérande trois portes logiques ET/OU/XOR en série. Le problème est qu'il faut préciser trois bits de commandes, alors qu'on peut en théorie se débrouiller avec seulement 2 bits. Il faut alors ajouter un circuit combinatoire pour calculer les trois bits de commande à partir des deux bits initiaux. [[File:Porte logique universelle de 1 bit, faite avec trois portes.png|centre|vignette|upright=2|Porte logique universelle de 1 bit, faite avec trois portes]] Mais il y a moyen de se passer d'une porte logique ! L'idée est que mettre à 0 et mettre à 1 sont deux opérations inverses l'une de l'autre. Mettre à 1 revient à mettre à 0, puis à inverser le résultat. Et inversement, mettre à 0 revient à mettre à 1 avant d'inverser le tout. Il suffit donc de mettre le circuit d'inversion commandable à la fin du circuit, juste après un circuit de mise à 0 ou de mise à 1, au choix. En faisant comme cela, il ne reste que deux portes logiques, donc deux entrées. En choisissant bien les valeurs sur l'entrée de commande, on peut connecter les entrées de commande directement sur les opérandes des deux portes, sans passer par un circuit combinatoire. [[File:Porte logique universelle de 1 bit, faite avec deux portes.png|centre|vignette|upright=2|Porte logique universelle de 1 bit, faite avec deux portes]] ==Les opérations bit à bit à deux opérandes== Les opérations bit à bit à deux opérandes effectuent un ET, un OU, ou un XOR entre deux opérandes. Ici, le ET/OU/XOR se fait entre deux bits de même poids dans une opérande. Les circuits qui effectuent ces opérations sont assez simples, ils sont composés de portes logiques placées les unes à côté des autres. Il n'y a pas de possibilité de combiner des portes comme c'était le cas dans la section précédente. ===Les opérations de masquage=== Il est intéressant de donner quelques exemples d'utilisation des opérations bit à bit ET/OU/XOR. L'utilité des opérations bit est bit est en effet loin d'être évidente. L'exemple que nous allons prendre est celui des '''opérations de masquage''', très connue des programmeurs bas niveau. Leur but est de modifier certains bits d'un opérande, mais de laisser certains intouchés. Les bits modifiés peuvent être forcés à 1, forcés à 0, ou inversés. Pour cela, on combine l'opérande avec un second opérande, qui est appelée le '''masque'''. Les bits à modifier sont indiqués par le masque : chaque bit du masque indique s'il faut modifier ou laisser intact le bit correspondant dans l'opérande. Le résultat dépend de l'opération entre masque et opérande, les trois opérations utilisées étant un ET, un OU ou un XOR. Faire un ET entre l'opérande et le masque va mettre certains bits de l’opérande à 0. Les bits mis à 0 sont ceux où le bit du masque correspondant est à 0, tandis que les autres sont recopiés tels quels. La même chose a lieu avec l'opération OU, sauf que cette fois-ci, certains bits de l'opérande sont mis à 1. Les bits mis à 1 sont ceux pour lesquels le bit du masque correspondant est un 1. [[File:Masques 1.png|centre|vignette|upright=2.5|Masques 1]] Dans le cas d'un XOR, les bits sont inversés. Les bits inversés sont ceux pour lesquels le bit du masque correspondant est un 1. [[File:Masquage des n bits de poids faible.png|centre|vignette|upright=2|Masquage des n bits de poids faible]] ===Un exemple d'utilisation des opérations de masquage=== Pour donner un exemple d'utilisation, parlons des droits d'accès à un fichier. Ceux-ci sont regroupés dans une suite de bits : un des bits indique s'il est accessible en écriture, un autre pour les accès en lecture, un autre s'il est exécutable, etc. Bref, modifier les droits en écriture de ce fichier demande de modifier le bit associé à 1 ou à 0, sans toucher aux autres. Cela peut se faire facilement en utilisant une instruction bit à bit avec un masque bien choisie. Un autre cas typique est celui où un développeur compacte plusieurs données dans un seul entier. Par exemple, prenons le cas d'une date, exprimée sous la forme jour/mois/année. Un développeur normal stockera cette date dans trois entiers : un pour le jour, un pour le mois, et un pour la date. Mais un programmeur plus pointilleux sera capable d'utiliser un seul entier pour stocker le jour, le mois et l'année. Pour cela, il raisonnera comme suit : * un mois comporte maximum 31 jours : on doit donc encoder tous les nombres compris entre 1 et 31, ce qui peut se faire en 5 bits ; * une année comporte 12 mois, ce qui tient dans 4 bits ; * et enfin, en supposant que l'on doive gérer les années depuis la naissance de Jésus jusqu'à l'année 2047, 11 bits peuvent suffire. Dans ces conditions, notre développeur décidera d'utiliser un entier de 32 bits pour le stockage des dates : * les 5 bits de poids forts serviront à stocker le jour ; * les 4 bits suivants stockeront le mois ; * et les bits qui restent stockeront l'année. Le développeur qui souhaite modifier le jour ou le mois d'une date devra modifier une partie des bits, tout en laissant les autres intacts. Encore une fois, cela peut se faire facilement en utilisant une instruction bit à bit avec un masque bien choisi. {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits combinatoires | prevText=Les circuits combinatoires | next=Les circuits de sélection | nextText=Les circuits de sélection }} {{autocat}} 2xj8ixc0zbeempfjwcbr7mefcauviyj Fonctionnement d'un ordinateur/Les circuits compteurs et décompteurs 0 78073 767956 765340 2026-06-17T19:15:15Z Mewtow 31375 /* Les compteurs synchrones */ 767956 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. Tous les compteurs/décompteurs 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]] 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 et asynchrones== Dans cette section, 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=== 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.]] Il est aussi possible d'utiliser des bascules D pour créer un compteur comme les deux précédents. 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.]] ===Les compteurs synchrones=== Passons maintenant au '''compteurs synchrones'''. Pour simplifier, ils sont composés en combinant un registre, avec un circuit combinatoire. Le circuit combinatoire incrémente une opérande, ici le registre. [[File:Basic Sync Counter.svg|centre|vignette|upright=1.5|Compteur synchrone, cas général.]] 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.]] ===La gestion du débordement des compteurs synchrones/asynchrones=== Les compteurs précédents ne peuvent pas être réinitialisés, ce qui pose des problèmes, notamment 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 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 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> obc2ycayrayywd6mhq76h4e04cxogj2 767957 767956 2026-06-17T19:17:19Z Mewtow 31375 /* Les compteurs synchrones et asynchrones */ 767957 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. Tous les compteurs/décompteurs 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]] 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 et asynchrones== Dans cette section, 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 une opérande, ici le registre. [[File:Basic Sync Counter.svg|centre|vignette|upright=1.5|Compteur synchrone, cas général.]] 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 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.]] Il est aussi possible d'utiliser des bascules D pour créer un compteur comme les deux précédents. 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.]] ===La gestion du débordement des compteurs synchrones/asynchrones=== Les compteurs précédents ne peuvent pas être réinitialisés, ce qui pose des problèmes, notamment 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 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 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> 5ra8jyz7mpldnu68ssxd5actzbdn1s8 767958 767957 2026-06-17T20:34:47Z Mewtow 31375 /* Les compteurs synchrones et asynchrones */ 767958 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. Tous les compteurs/décompteurs 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]] 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== Dans la suite, 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''' sont composés en combinant un registre, avec un circuit combinatoire. Le circuit combinatoire incrémente une opérande, ici le registre. [[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.]] Il est aussi possible d'utiliser des bascules D pour créer un compteur comme les deux précédents. 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.]] Les compteurs précédents ne peuvent pas être réinitialisés, ce qui pose des problèmes, notamment 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 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> jj5nuviz06xwhgg5zgkncw89bgcrog2 767959 767958 2026-06-17T20:35:28Z Mewtow 31375 /* Les compteurs asynchrones */ 767959 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. Tous les compteurs/décompteurs 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]] 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== Dans la suite, 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''' sont composés en combinant un registre, avec un circuit combinatoire. Le circuit combinatoire incrémente une opérande, ici le registre. [[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.]] 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.]] Les compteurs précédents ne peuvent pas être réinitialisés, ce qui pose des problèmes, notamment 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 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> rymm1hzndpw1bj7b5omkz9xfsjscnhg 767960 767959 2026-06-17T20:35:53Z Mewtow 31375 /* Les compteurs asynchrones */ 767960 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. Tous les compteurs/décompteurs 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]] 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== Dans la suite, 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''' sont composés en combinant un registre, avec un circuit combinatoire. Le circuit combinatoire incrémente une opérande, ici le registre. [[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.]] 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.]] 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 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> ld4e4445p5zg29oc5wafz1tmw6c7vpt 767961 767960 2026-06-17T20:36:14Z Mewtow 31375 /* Les compteurs asynchrones */ 767961 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. Tous les compteurs/décompteurs 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]] 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== Dans la suite, 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''' sont composés en combinant un registre, avec un circuit combinatoire. Le circuit combinatoire incrémente une opérande, ici le registre. [[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> 3tpavyiq46dy374vzbdem02jfoacost 767962 767961 2026-06-17T20:37:16Z Mewtow 31375 767962 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. Tous les compteurs/décompteurs 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]] 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 asynchrones== Dans la suite, 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''' 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 une opérande, ici le registre. [[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> 899vwiugjl8m3w4e7ghes10t7hk0459 767963 767962 2026-06-17T20:38:11Z Mewtow 31375 /* Les compteurs synchrones */ 767963 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. Tous les compteurs/décompteurs 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]] 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 asynchrones== Dans la suite, 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''' 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> 7z76f2dttzj003hja5h5p68h573xn1r 767964 767963 2026-06-17T20:40:08Z Mewtow 31375 /* Le circuit d'un compteur : généralités */ 767964 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.]] ==Les compteurs asynchrones== Dans la suite, 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''' 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> 0j7lu5vldhgxtly1nmi5zb0b5gb2t3h Philosophie/Thalès de Milet/Textes et traductions période Principat Empire Romain 0 78966 767980 767432 2026-06-18T06:05:47Z Alex Mtlr 103840 /* Paragraphe III. */ 767980 wikitext text/x-wiki {| border="0" cellpadding="0" width="100%" style="background: #f9f9f9" | colspan="3" height="25"|<div style="text-align: center;">[[Philosophie/Thalès de Milet|'''Thalès de Milet''']]</div> |- | width="33%"|'''[[Philosophie/Thalès de Milet/Textes_et_traductions_période_République_Romaine|Période République Romaine]]''' |- | width="33%"|'''[[Philosophie/Thalès de Milet/Textes_et_traductions_période_Grèce_Hellénistique|Période de la Grèce Hellénistique]]''' |- | width="33%"|'''[[Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC|Période de la Grèce Classique]]''' |} {{EnTravaux}} <span style="font-size:18pt;">Période du Principat de l’[[w:Empire_romain|''Empire'']] [[#Empire|<span id="Empire_back"><sup>'''I'''</sup></span>]] [[w:Rome_antique|''Romain'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Rome_back|<sup>🔄</sup>]]</span> <p style="text-align: right;">(16 janvier [[w:27_av._J.-C.|-27]] <sup>[[w:Ier_siècle_av._J.-C.|⏳]]</sup>, nomination de [[w:Auguste|'''Caius Iulius Caesar Octavianus''']] aux titres d’[[w:Auguste_(titre)|''Augustus'']] et de [[w:Princeps_senatus|''Princeps'']] par le [[w:Sénat_romain|''Sénat romain'']] — fin du [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]], création du système [[w:Tétrarchie|''tétrarchique'']] [[#tétrarchie|<span id="tétrarchie_back"><sup>'''II'''</sup></span>]] par [[w:Dioclétien|'''Dioclétien''']] [[#Dioclétien|<span id="Dioclétien_back"><sup>'''III'''</sup></span>]] pour faire face aux [[w:Invasions_barbares#Première_période_:_les_mouvements_migratoires_germaniques_du_IIIe_siècle|''incursions barbares'']]) {{Boîte déroulante début|titre=NdA Empire|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Empire_back|<span id="Empire"><sup>I</sup></span>]] Du nom commun latin imperium [[wikt:en:imperium#Latin|(en)]], « 1. L’empire, l’État, le gouvernement impérial, le royaume, la domination. 2. Le droit ou le pouvoir de commander ou d’avoir le contrôle ; domination. 3. Commandement ou autorité absolue sur l’empire (ou un autre régime politique) ; souveraineté ; domination. 4. (militaire) Autorité militaire, commandement (d’une armée). 5. L’exercice de l’autorité, de la règle, de la loi, du contrôle, de la souveraineté. 6. Un commandement, un ordre, une direction, une injonction.) »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du verbe imperō, « 1. (avec datif) Commander, donner des ordres à, imposer, exiger. 2. Gouverner. »;<br /><p style="margin: 0 2em; text-indent: 30px;">➥ du préfixe prépositionnal in-, « 1. Dans, à l’intérieur. 2. Contre; dans; sur; vers. 3. (utiliser comme un intensifieur). 4. Attaché à des [[w:Aspect_inchoatif|''verbes inchoatifs'']], il peut exprimer le sens d’un changement en cours ou d’un achèvement partiel. »;<br /><p style="margin: 0 2em; text-indent: 30px;">➥ +‎ du verbe parō [[wikt:en:paro#Latin|(en)]], « 1. Arranger, ordonner, concevoir. 2. Fournir, meubler, préparer. 3. Résoudre, viser, décider. 4. Obtenir, acquérir, se procurer, se faire. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du suffixe nominal abstractif‎ -ium [[wikt:en:-ium#Latin|(en)]], désignant parfois des offices et des groupes. »;<br /><p style="margin: 0 2em; text-indent: 15px;">Selon l’historien, spécialiste de l’[[w:Grèce_antique|''antiquité grecque'']], [[w:Moses_Finley|Moses Finley]], définit un empire par tout {{Info|''« exercice durable par un État d’une autorité, d’un pouvoir, ou d’un contrôle sur un ou plusieurs États, communautés ou peuples »''|Moses Finley, Économie et société en Grèce antique, La Découverte, 2007.}}. L’historien [[w:Jean_Tulard|Jean Tulard]], précise cette définition par {{Info|''cinq traits suivants''|Jean Tulard, Les Empires occidentaux de Rome à Berlin, PUF, 1997.}} :<br /><p style="margin: 0 2em; text-indent: 15px;"> • Une volonté expansionniste ;<br /><p style="margin: 0 2em; text-indent: 15px;">• Une organisation centralisée ;<br /><p style="margin: 0 2em; text-indent: 15px;">• Des peuples encadrés par une armature politique et fiscale commune ;<br /><p style="margin: 0 2em; text-indent: 15px;">• La croyance en une supériorité d’essence ;<br /><p style="margin: 0 2em; text-indent: 15px;">• Un début et une fin clairement identifiés. <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#tétrarchie_back|<span id="tétrarchie"><sup>II</sup></span>]] Du nom commun grec ancien τετραρχία / tetrarkhía;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du préfixe τετρα- / tétra- [[wikt:en:τετρα-#Ancient_Greek|(en)]], « quatre »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du suffixe -αρχία / -arkhía [[wikt:en:-αρχία#Ancient_Greek|(en)]], « -archie (forme de gouvernement ou de règle) »;<br /><p style="margin: 0 2em; text-indent: 15px;"> Système de gouvernement de l’Empire ''romain'' mis en place par Dioclétien à la fin du [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]], pour faire face aux invasions barbares. Il consiste en la division de la direction de l’empire entre, d’une part deux [[w:Empereur_romain|''empereurs'']] — les [[w:Auguste_(titre)|''augustes'']] —, d’autre part deux ''lieutenants'' (successeurs désignés des ''augustes'') — les [[w:C%C3%A9sar_(titre)|''césars'']]. <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#Dioclétien_back|<span id="Dioclétien"><sup>III</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Gaius|praenomen, nom individuel du citoyen romain}} {{Info|Aurelius|nomen, nom de famille}} {{Info|Valerius|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, surnommé Dioclētiānus [[wikt:en:Diocletian#English|(en)]] lorsqu’il a été proclamé empereur par ses troupes;<br /><p style="margin: 0 2em; text-indent: 15px;"> Militaire et empereur, connu pour avoir séparé et élargi les services civils et militaires de l’empire, et réorganisé les divisions provinciales de l’empire, établissant le gouvernement le plus vaste et le plus bureaucratique de l’histoire de l’empire. En [[w:286|286]], il nomme son ''césar'', ou adjoint et successeur, [[w:Maximien_Hercule|Maximien]] ''Auguste'', co-empereur, et partage l’Empire entre l’Orient et l’Occident, puis en 293, y nomme respectivement [[w:Galère_(empereur_romain)|Maximien Galère]] et [[w:Constance_Chlore|Constance Chlore]] comme ''césar''.<br/><br/></div> ''' {{Boîte déroulante fin}} == [[w:Sénèque|'''Sénèque''']] [[#Sénèque|<span id="Sénèque_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:5_av._J.-C.|-5]] <sup>[[w:Ier_siècle_av._J.-C.|⏳]]</sup> / [[w:1|1]] <sup>[[w:Ier_siècle|⏳]]</sup>, à [[w:Corduba|Corduba]] — 12 avril [[w:65|65]], à [[w:Rome_antique|''Rome'']], dans une maison de plaisance, la « quatrième pierre milliaire », contraint au [[w:Suicide_forcé|''suicide forcé'']] par l’empereur [[w:Néron|'''Néron''']] après avoir été dénoncé dans la [[w:Conjuration_de_Pison|''Conjuration de Pison'']], sans preuve selon [[w:Tacite|'''Tacite''']] [https://remacle.org/bloodwolf/historiens/tacite/annales15.htm <sup>Annales, l.V, §§LX-LXVI.</sup>]) [[s:Auteur:Sénèque_le_Jeune|<sup>📚</sup>]] [https://books.google.fr/books?id=_HZTvAxN7CIC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA177#v=onepage&q&f=true {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume VI, §43 - Seneca (Lucius Annaeus –)}}] [[Fichier:Duble_herma_of_Socrates_and_Seneca_Antikensammlung_Berlin_03_.jpg|vignette|<p style="text-align: justify; text-indent: 15px;">Double-hermès du [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]], unique portrait de '''Sénèque''' nommé et authentifié, et associé à celui de '''Socrate''', dont le point commun est celui d’avoir été contraint de se donner la mort. Copie ''romaine'' d’un modèle fait du vivant même du philosophe [https://books.google.fr/books?id=_HZTvAxN7CIC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA180#v=onepage&q&f=true {{Info|<sup>➕</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume VI, §43 - Seneca (Lucius Annaeus –), Iconographie}}] [https://books.google.fr/books?id=_HZTvAxN7CIC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA201#v=onepage&q&f=true {{Info|<sup>➕➕</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume VI, §43 - Seneca (Lucius Annaeus –), Iconographie - contribution de J. Lang}}].<br /><p style="text-align: justify; text-indent: 15px;">Matériau : Marbre blanc-brunâtre, légèrement veiné, finement cristallin.<br /><p style="text-indent: 15px;">Provenance : ''Rome'', 1813.<br /><p style="text-align: justify; text-indent: 15px;">Exposition : Staatliche Museen zu Berlin, Antikensammlung, SK. 391 [https://recherche.smb.museum/detail/698814/doppelherme-des-sokrates-und-seneca-mit-namensbeischriften-der-dargestellten <sup>🔍</sup>].]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Homme politique romain, philosophe stoïcien et dramaturge, il devient tour à tour conseiller à la cour impériale sous '''Caligula''' puis '''Claude''', est exilé en 41 en ''Corse'', où il écrit ses premiers traités philosophiques avant d’être rappelé comme tuteur du jeune '''Néron''' en 49, et enfin, lorsque ce dernier accède au pouvoir, en devient le conseiller et l’un des personnages les plus influents de l’Empire.</div> {{Boîte déroulante début|titre=NdA Sénèque|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Sénèque_back|<span id="Sénèque"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Lucius|praenomen, nom individuel du citoyen romain}} {{Info|Annaeus|nomen, nom de famille}} {{Info|Seneca|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}'''<br/><br/></div> {{Boîte déroulante fin}} === [[w:Sénèque#Physique|Questions naturelles]] === <p style="text-align: right;">[[s:Questions_naturelles|📚]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Ouvrage de philosophie naturelle écrit vers 65. Il ne s’agit pas d’une [[w:Encyclopédie|encyclopédie]] [[#encyclopédie|<span id="encyclopédie_back"><sup>'''I'''</sup></span>]] systématique comme l’[[w:Histoire_naturelle_(Pline_l'Ancien)|''Histoire naturelle'']] [[#Histoire_naturelle|<sup>⤵️</sup>]] de [[w:Pline_l'Ancien|'''Pline l’Ancien''']] [[#Pline_l’Ancien_I|<sup>⤵️</sup>]], bien que ces 2 œuvres représentent les rares ouvrages romains consacrés à l’étude du monde naturel. L’investigation de '''Sénèque''' se déroule principalement à travers la prise en compte des points de vue d’autres penseurs, ''grecs'' et ''romains'', bien qu’elle ne soit pas dénuée de pensées originales, dont éthiques conforment à la pensée ''stoïcienne''.</div> {{Boîte déroulante début|titre=NdA Questions naturelles|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#encyclopédie_back|<span id="encyclopédie"><sup>I</sup></span>]] Du nom commun [[w:Latin#Latin_humaniste|latin Renaissance]] encyclopaedīa [[wikt:en:encyclopaedia#Latin|(en)]]; de l’expression grec ancien ἐγκύκλῐος παιδείᾱ / enkúklios paideíā [https://dumas.ccsd.cnrs.fr/dumas-03927443/file/DONNADILLE-MR2-Pline-VERS-FINALE.pdf {{Info|<sup>🔍</sup>|Lisa Donnadille. Merveilles animalières dans les livres VIII à XI de l’Histoire naturelle de Pline l’Ancien. Littératures. 2020. ffdumas-03927443, p.21}}], « cercle de l’éducation ou des sciences, l’ensemble des sciences qui constituent une éducation complète »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ de l’adjectif ἐγκύκλιος / enkúklios, littéralement « qui est rond ou tourne en rond, circulaire », ou au sens figuré « qui revient en cercle sur soi-même, périodique », « qui embrasse un cercle entier »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du nom commun παιδεία / paideía, « l’éducation »;'''<br /><p style="margin: 0 2em; text-align: center;">« ''Si à première vue la signification de cette expression semble être sans ambiguïté, sa portée réelle et la compréhension qu’en avaient les auteurs grecs puis latins font l’objet de débats parmi les spécialistes. En effet, deux interprétations sont possibles lorsqu’un auteur de l’Antiquité a recours à cette expression dans l’un de ses textes. Dans le premier cas, cela équivaudrait à parler d’une éducation ordinaire, commune à tous ; et dans le second cas, cela ferait référence à la quantité de connaissances et de sciences qu’il faudrait maîtriser au préalable avant de commencer l’étude d’un sujet précis, qui serait dans ce cas placé en haut d’une hiérarchie dans les savoirs.'' »<br /><p style="margin: 0 2em; text-align: right;">''' Lisa Donnadille. [https://dumas.ccsd.cnrs.fr/dumas-03927443/file/DONNADILLE-MR2-Pline-VERS-FINALE.pdf Merveilles animalières dans les livres VIII à XI de l’Histoire naturelle de Pline l’Ancien. Littératures. 2020. ffdumas-03927443], p.21'''<br/><br/></div> {{Boîte déroulante fin}} ==== Livre III — De l’eau ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">En prologue, Sénèque explique pourquoi il est plus important de s’intéresser à l’observation du monde, à sa connaissance et à sa compréhension plutôt qu’à sa conquête. Puis, il développe diverses théories sur la formation des rivières, les eaux souterraines et les propriétés de l’eau. Dans une critique morale aux chapitres XVII à XIX, il fustige la mauvaise pratique consistant à amener à table des poissons, notamment des rougets, vivants et à se délecter de leurs couleurs changeantes à l’agonie avant de les préparer devant les convives. En épilogue, il énonce son [[w:Eschatologie|''eschatologie'']], sa vision de la fin du monde où les êtres vivants seront anéantis par des raz-de-marée, marquant la fin d’un cycle du vivant et le début d’un autre.</div> ===== <div style="text-align: center;">Chapitre XIII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la doctrine de '''Thalès''' faisant de l’eau l’élément à l’origine de la vie et critique d’une autre de la terre flottant dessus.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''13.''' Adiciam, ut '''Thales''' ait, «ualentissimum elementum est». Hoc fuisse primum putat, ex hoc surrexisse omnia. Sed nos quoque aut in eadem sententia, aut in uicinia eius sumus. Dicimus enim ignem esse qui occupet mundum et in se cuncta conuertat; hunc euanidum languentemque considere et nihil relinqui aliud in rerum natura igne restincto quam umoren; in hoc futuri mundi spem latere. Ita ignis exitus mundi est, umor primordium. Miraris ex hoc posse amnes semper exire qui pro omnibus fuit et ex quo sunt omnia? Hic umor in diductione rerum ad quartas redactus est, sic positus ut sufficere fluminibus edendis, ut riuis, ut fontibus posset.<br /><p style="text-indent: 15px;">'''14.''' Quae sequitur '''Thaletis''' inepta sententia est. Ait enim terrarum orbem aqua sustineri et uehi more nauigii mobilitateque eius fluctuare tunc cum dicitur tremere; non est ergo mirum si abundat umor ad flumina profundenda, cum in umore sit totus. Hanc ueterem et rudem sententiam explode. Nec est quod credas in hunc orbem aquam subire per rimas et facere sentinam.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-i-1979/page/n1/mode/2up <u>L. Annaei Senecae, Natvrales Qvaestiones</u>], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-i-1979/page/n261/mode/2up ''Liber Tertivs.''], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-i-1979/page/n293/mode/2up ''chap. 13.-14.''], texte établi par Carmen Codoñer Merino [[w:es:Carmen_Codoñer_Merino|(es)]], Consejo Superior de Investigaciones Científicas, Madrid, 1979</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''XIII.''' Aqua, ait '''Thales''', valentissimum elementum est : hoc fuisse primum putat, et hoc surrexisse omnia. Sed et nos quoque aut in eadem sententia, aut in ultima sumus. Dicimus enim ignem esse, qui occupet mundum, et in se cuncta convertat ; hunc evanidum considere, et nihil relinqui aliud in rerum natura, igne restincto, quam humorem : in hoc futuri mundi spem latere. Ita ignis exitus mundi est, humor primordium. Miraris amnes ex hoc posse exire semper, qui pro omnibus fuit, et ex quo sunt omnia? Hic humor in diductione rerum ad quartas redactus est, sic positus, ut fluminibus edendis sufficere, ut rivis, ut fontibus posset. Quæ sequitur, '''Thaletis''' inepta sententia est : ait enim , terrarum orbem aqua sustineri, et vehi more navigii, mobilitateque ejus fluctuare, tum quum dicitur tremere. Non est ergo mirum, si abundat humor ad flumina fundenda, quum mundus in humore sit totus. Hanc veterem et rudem sententiam explode : nec est quod credas, in hunc orbem aquam subire per rimas et facere sentiuam.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA327#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Troisième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA342#v=onepage&q&f=true ''chap. XIII.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''XIII.''' L’eau, dit '''Thalès''', est le plus puissant des éléments, le premier en date, celui par qui tout a pris vie. Nous pensons comme '''Thalès''', au moins sur le dernier point. En effet, nous prétendons que le feu doit s’emparer du monde entier et convertir tout en sa propre substance, puis s’évaporer, s’affaisser, s’éteindre et ne rien laisser autre chose dans la nature que l’eau ; qu’enfin l’eau recèle l’espoir du monde futur. Ainsi périra par le feu cette création dont l’eau fut le principe. Es-tu surpris que des fleuves sortent incessamment d’un élément qui a tenu lieu de tout, et duquel tout est sorti ? Quand les éléments furent séparés les uns des autres, l’eau fut réduite au quart de l’univers, et placée de manière à suffire à l’écoulement des fleuves, des ruisseaux, des fontaines. Mais voici une idée absurde de ce même '''Thalès'''. Il dit que la terre est soutenue par l’eau sur laquelle elle vogue comme un navire ; qu’à la mobilité d’un tel support sont dues les fluctuations qu’on appelle tremblements de terre. Ce ne sera donc pas merveille qu’il y ait assez d’eau pour entretenir les fleuves, si tout le globe est dans l’eau. Ce système grossier et suranné n’est que risible ; tu ne saurais admettre que l’eau pénètre notre globe par ses interstices, et que la cale est entr’ouverte.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[s:Questions_naturelles_(trad._Baillard)|<u>Sénèque le Jeune</u>]], [[s:Questions_naturelles_(trad._Baillard)/Livre_3|''Livre III. chap. 13.'']], traduction par [[s:Auteur:Joseph_Baillard|Joseph Baillard]], Hachette, 1914<br />(également disponible [https://remacle.org/bloodwolf/philosophes/seneque/questionsnaturelles3.htm ici])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''XIII.''' L’eau, dit '''Thalès''', est le plus puissant des éléments : elle existait avant tout, elle est le principe de tout. Nous pensons comme '''Thalès''', au moins sur le dernier point. En effet, nous croyons que le feu, s’emparant du monde entier, convertira tout en sa propre substance : mais il finira par cesser ses ravages, et quand il sera éteint, dans toute la nature il ne restera que l’eau, et cette eau renfermera le germe et l’espérance d’un monde futur. Ainsi par le feu s’accomplira la destruction de l’univers, et par l’eau sa réorganisation. Êtes-vous surpris, maintenant, qu’après avoir tenu lieu de tous les éléments, et les avoir produits tous, l’eau suffise à l’entretien perpétuel des fleuves ? Quand les éléments furent séparés les uns des autres, l’eau fut réduite au quart de l’univers, et dans une proportion convenable pour suffire à l’alimentation des fontaines, des ruisseaux et des rivières. Mais voici une idée absurde du même '''Thalès''' : il dit que la terre est soutenue par l’eau, et qu’elle flotte sur elle comme un navire ; que les tremblements de terre sont causés par les oscillations et les mouvements du fluide qui la soutient. Il n’est donc pas étonnant qu’il y ait assez d’eau pour alimenter les fleuves, puisque tout le globe est dans l’eau. Mais rejetons cette vieille et informe hypothèse, qui assimile les sources aux flots que la cale entr’ouverte laisse pénétrer dans le vaisseau.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA327#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Troisième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA342#v=onepage&q&f=true ''chap. XIII.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''Chap. III.'''<br />''Opiniõ de Thales touchant l’eau.''<br /><p style="text-align: justify; text-indent: 15px;">L’eau , comme dit '''Thales''' , e[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki>t</nowiki> le plus fort des Elemens. Il croit me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me qu’elle e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le premier , & que toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es en ont pris nai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ance. Pour moy ie {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uis de cette opinion , ou du moins de la derniere partie de cette opinion. Car nous [[#nous_stoiciens_NdT_dR|<span id="nous_stoiciens_NdT_dR_back"><sup>1</sup></span>]] di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons que c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le feu qui enueloppera tout le monde , & qui conuertira en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oy toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es; qu’il deuiendra {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans force quand il n’aura plus de nourriture , qu’apres que le feu {{Info|ſ|forme ancienne longue de la lettre s minuscule}}era e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}teint il ne demeurera rien de re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te à la nature que l’eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement , & que c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t en elle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eule que con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te l’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}perance d’vn monde futur. Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i le feu e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t la fin du monde , & l’eau en e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le commencement. Vous e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tonnez-vous donc que les fleuues pui{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ent tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir d’vn Element , qui e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t fait pour toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es & dont toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e font ? Lors que la nature fit le departement des Elemens , l’eau fut placée de telle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte , qu’elle peut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uffire pour les fleuues , pour les rui{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eaux , pour les fontaines. Mais ce que '''Thales''' dit en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uitte e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t ridicule , car il dit que le Globe de la terre e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenu par les eaux ; qu’elles le portent comme vn vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau , & qu’elles l’agitent de la me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte , lors que nous croyons qu’il tremble. Il ne faut donc pas s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tonner , s’il ya tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ez d’eau pour former de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i grands fleuues , puis que tout le monde nage fur l’eau. Mais me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pri{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ez cette vieille , & cette gro{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}iere opinion , & ne croyez pas que l’eau vienne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la terre , comme par des fentes & par des creua{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}es , & qu’elle y {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement comme dans le fond d’vn vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#nous_stoiciens_NdT_dR_back|<span id="nous_stoiciens_NdT_dR"><sup>1.</sup></span>]] Les Stoïciens.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=ktOcOg9lr54C&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii&hl=fr&pg=PA1#v=onepage&q&f=true <u>Seneque Des Qvestions Natvrelles</u>], [https://books.google.fr/books?id=ktOcOg9lr54C&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii&hl=fr&pg=PA202#v=onepage&q&f=true ''Livre Troisiesme. Des eaux.''], [https://books.google.fr/books?id=ktOcOg9lr54C&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii&hl=fr&pg=PA234#v=onepage&q&f=true ''chap. XIII.''], traduction par [[w:Pierre_Du_Ryer|Pierre Du Ryer]], A Lyon, Chez Christofle Fovrmy, 1663</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ==== Livre IV — Du Nil ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">En prologue, '''Sénèque''' fait l’éloge de [[w:Lucilius_le_Jeune|'''Lucilius''']] [[#Lucilius|<span id="Lucilius_back"><sup>'''I'''</sup></span>]] avant de lui expliquer les dangers de la flatterie. Puis, il décrit la crue du [[w:Nil|''Nil'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Nil_back|<sup>🔄</sup>]], expose les théories tentant de l’expliquer et les réfute. En épilogue, il fait le procès du luxe, et plus particulièrement celui d’acheter de la neige, et donc de marchandiser l’eau, regrettant qu’on ne puisse faire de même avec l’air et le soleil.</div> {{Boîte déroulante début|titre=NdA Lucilius|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Lucilius_back|<span id="Lucilius"><sup>I</sup></span>]] Du nom propre latin Lucilius [[wikt:en:Lucilius#Latin|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">Gouverneur ''romain'' de Sicile durant le règne de [[w:Néron|Néron]], ainsi qu’un ami et un correspondant de Sénèque.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ier_siècle_av._J.-C.|I<sup>er</sup> siècle {{Info|EC|de l’Ère Commune}}]], [[w:Campanie#Histoire|''Campanie'']], [[w:Quatorze_régions_de_la_Rome_augustéenne#Regio_I_:_Porte_Capène|''Regio I'']])'''<br/><br/></div> {{Boîte déroulante fin}} ===== <div style="text-align: center;">Chapitre II.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réfutation par '''Sénèque''' d’une théorie explicite de '''Thalès''' sur la crue du ''Nil'' (théorie identique mais supposément implicite rapportée par [[w:Hérodote|'''Hérodote''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Chapitre_XX|<sup>🔄</sup>]]).</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''2.''' [...] Si '''Thaleti''' credis, etesiae descendenti ''Nilo'' resistunt et cursum eius acto contra ostia mari sustinent. Ita reuerberatus in se recurrit, nec crescit, sed exitu prohibitus resistit et quacumque mox potuit ui congestus erumpit. '''Euthymenes''' ''Massiliensis'' testimonium dicit: «Nauigaui, inquit, ''Atlanticum'' mare. Inde ''Nilus'' fluit, maior, quamdiu etesiae tempus obseruant; tunc enim eicitur mare instantibus uentis. Cum resederunt, et pelagus conquiescit minorque descendenti inde uis ''Nilo'' est. Ceterum dulcis mari sapor est et similes ''Niloticis'' beluae». Quare ergo, si ''Nilum'' etesiae prouocant, et ante illos incipit incrementum eius et post eos durat? Praeterea non fit maior quo illi flauere uehementius, nec remittitur incitaturque, prout illis impetus fuit; quod fieret, si illorum uiribus cresceret. Quid quod etesiae litus ''Aegyptium'' uerberant et contra illos ''Nilus'' descendit, inde uenturus unde illi, si origo ab illis esset? Praeterea ex mari purus et caeruleus efflueret, non, ut nunc, turbidus ueniret. Adde quod testimonium eius testium turba coarguitur. Tunc erat mendacio locus; cum ignota essent externa, licebat illis fabulas mittere. Nunc uero tota exteri maris ora mercatorum nauibus stringitur, quorum nemo narrat initium ''Nili'' aut mare saporis alterius: quae natura credi uetat, quia dulcissimum quodque et leuissimum sol trahit. Praeterea quare hieme non crescit? Et tunc potest uentis concitari mare, aliquanto quidem majoribus; nam etesiae temperati sunt. Quod si e mari ferretur ''Atlantico'', semel oppleret ''Aegyptum''. At nunc per gradus crescit.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n1/mode/2up <u>L. Annaei Senecae, Natvrales Qvaestiones</u>], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n7/mode/2up ''Liber Qvartvs A.''], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n41/mode/2up ''chap. 2.''], texte établi par Carmen Codoñer Merino [[w:es:Carmen_Codoñer_Merino|(es)]], Consejo Superior de Investigaciones Científicas, Madrid, 1979</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''II.''' [...] Si '''Thaleti''' credis, Etesiæ descendenti ''Nilo'' resistunt, et cursus ejus acto contra ostia mari sustinent : ita reverberatus in se recurrit : nec crescit, sed exitu prohibitus resistit, et quacumque mox potuit, inconcessus erumpit.<br /><p style="text-align: justify; text-indent: 15px;">'''Euthymenes''' ''Massiliensis'' testimonium dicit : « Navigavi, inquit, ''Atlanticum'' mare. Inde ''Nilus'' fluit major, quamdiu Etesiæ tempus observant : tunc enim ejicitur mare instantibus ventis. Quum resederint, et pelagus conquiescit, minorque descendenti inde vis ''Nilo'' est. Ceterum dulcis maris sapor est, et similes ''Niloticis'' belluæ. » Quare ergo, si ''Nilum'' Etesiæ provocant, et ante illos incipit incrementum ejus, et post eos durat ? Præterea non fit major, quo illi flavere vehementius. Nec remittitur, incitaturque, prout illis impetus fuit : quod fieret, si illorum viribus cresceret. Quid, quod Etesiæ littus ''ægyptium'' verberant, et contra illos ''Nilus'' descendit, inde venturus, unde illi, si origo ab illis esset ? Præterea ex mari purus et cæruleus efflueret, non ut nunc turbidus venit. Adde, quod testimonium ejus testium turba coarguitur. Tunc erat mendacio locus, quum ignota essent externa. Licebat illis fabulas mittere. Nunc vero tota exteri maris ora mercatorum navibus stringitur : quorum nemo narrat nunc cæruleum ''Nilum'', aut mare saporis alterius ; quod et natura credi vetat, quia dulcissimum quodque et levissimum sol trahit. Præterea quare hieme non crescit ? et tunc potest ventis concitari mare, aliquando quidem majoribus ; nam Etesiæ temperati sunt. Quod si e mari ferretur ''Atlantico'', semel oppleret ''Ægyptum''. At nunc per gradus crescit.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA371#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Quatrième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA385#v=onepage&q&f=true ''chap. II.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''II.''' [...] À en croire '''Thalès''', les vents étésiens repoussent le ''Nil'' à sa descente dans la mer, et suspendent son cours en poussant la mer contre ses embouchures. Ainsi refoulé, il revient sur lui-même, sans pour cela grossir ; mais l’issue lui étant barrée, il s’arrête, et bientôt, partout où il le peut, force le passage qui lui est refusé. [[w:Euthymènes|'''Euthymène''']] [[#Euthymènes|<span id="Euthymènes_back"><sup>'''I'''</sup></span>]], de ''Marseille'', en parle comme témoin : « J’ai navigué, dit-il, sur la mer ''Atlantique''. Elle cause le débordement du ''Nil'', tant que les vents étésiens se soutiennent ; car c’est leur souffle qui alors pousse cette mer hors de son lit. Dès qu’ils tombent, la mer aussi redevient calme, et le ''Nil'' à sa descente déploie moins de puissance. Du reste, l’eau de cette mer est douce, et nourrit des animaux semblables à ceux du ''Nil''. » Mais pourquoi, si les vents étésiens font gonfler le ''Nil'', la crue commence-t-elle avant la saison de ces vents, et dure-t-elle encore après ? D’ailleurs le fleuve ne grossit pas à mesure qu’ils soufflent plus violemment. Son plus ou moins de fougue n’est point réglé sur celle des vents étésiens, ce qui aurait lieu, si leur action le faisait hausser. Et puis ils battent la côte ''égyptienne'', le ''Nil'' descend à leur encontre : il faudrait qu’il vînt du même point qu’eux, si son accroissement était leur ouvrage. De plus, il sortirait pur et azuré de la mer, et non pas trouble comme il est. Ajoute que le témoignage d’'''Euthymène''' est réfuté par une foule d’autres. Le mensonge avait libre carrière, quand les plages étrangères étaient inconnues ; on pouvait de là nous envoyer des fables, À présent, la mer extérieure est côtoyée sur tous ses bords par des trafiquants dont pas un ne raconte qu’aujourd’hui le ''Nil'' soit azuré ou que l’eau de la mer soit douce. La nature elle-même repousse cette idée ; car les parties les plus douces et les plus légères sont pompées par le soleil. Et encore pourquoi le ''Nil'' ne croît-il pas en hiver ? Alors aussi la mer peut être agitée par des vents quelque peu plus forts que les étésiens, qui sont modérés. Si le mouvement venait de l’Atlantique, il couvrirait tout d’un coup l’Égypte : or l’inondation est graduelle.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[s:Questions_naturelles_(trad._Baillard)|<u>Sénèque le Jeune</u>]], [[s:Questions_naturelles_(trad._Baillard)/Livre_4|''Livre IV.'']] ''chap. 2.'', traduction par [[s:Auteur:Joseph_Baillard|Joseph Baillard]], Hachette, 1914<br />(également disponible [https://remacle.org/bloodwolf/philosophes/seneque/questionsnaturelles4.htm ici])</div> {{Boîte déroulante début|titre=NdA trad. par Joseph Baillard de 1914|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Euthymènes_back|<span id="Euthymènes"><sup>I</sup></span>]] Du nom propre grec ancien Εὐθυμένης / Euthuménēs [[wikt:en:Εὐθυμένης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;"> ➥ de l’adjectif εὐθύς / euthús, « 1. Droit, direct : (au sens moral) direct, ouvert, franc. »;<br /><p style="margin: 0 2em; text-indent: 15px;"> ➥ + du nom commun μενος / ménos, « 1. Esprit. 2. Désir, ardeur, souhait, but. 3. Colère. 4. Courage, esprit, vigueur. 5. Pouvoir, force. 6. Violence. »;<br /><p style="margin: 0 2em; text-indent: 15px;"> ➥ + du suffixe nominal‎ propre -ης / -ēs [[wikt:en:-ης#Suffix_2|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;"> Navigateur et explorateur de la mer Extérieure le long des côtes africaines (actuelle Atlantique sud).<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:VIeme_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]], [[w:Marseille_antique#Massalia,_une_cité_grecque|''Massalia'']], actuelle Marseille)'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''II.''' [...] Selon '''Thalès''', le phénomène a pour cause les vents Étésiens, qui s’opposent au cours du ''Nil'' et font rebrousser ses eaux en sens inverse du mouvement qui le porte vers la mer. Refoulés sur eux-mêmes, les flots refluent sans pour cela grossir ; mais l’issue leur étant fermée, ils s’arrêtent, et bientôt ils s’ouvrent partout où ils peuvent le passage qui leur est refusé.<br /><p style="text-align: justify; text-indent: 15px;">'''Euthymène''' de ''Marseille'' en parle comme témoin : « J’ai navigué, dit-il, sur la mer ''Atlantique''. Le ''Nil'' roule des eaux plus abondantes, tant que durent les vents Étésiens ; car alors ils refoulent la mer sur le fleuve. Dès qu’ils se sont abattus et que la mer est devenue calme, le ''Nil'', qui peut redescendre vers celle-ci, diminue. Au reste, les eaux de cette mer sont douces et contiennent des animaux semblables à ceux du ''Nil''. » Dans cette hypothèse, qui donne les vents Étésiens pour cause des crues du ''Nil'', qu’on me dise pourquoi ces crues précèdent les vents, persistent quand les vents ne sont plus, enfin n’augmentent plus d’intensité et de violence, et ne diminuent pas selon la violence et l’impétuosité du vent même ; c’est pourtant ce qui devrait arriver, si les vents déterminaient la hausse des eaux. De plus, les vents Étésiens battent directement la côte ''égyptienne'' : pourquoi donc le ''Nil'' descend-il contre le souffle de ces vents, tandis qu’il devrait couler dans la même direction, s’il leur devait ses débordements ? Enfin, pourquoi, au lieu d’être diaphanes et azurés, ces flots, qu’on fait venir de la mer, sont-ils chargés de limon ? Ajoutez qu’une foule de témoignages réfutent '''Euthymène'''. On pouvait mentir, quand les plages étrangères étaient inconnues : c’était alors le temps des fables ; mais aujourd’hui mille vaisseaux marchands côtoient la mer extérieure ; personne ne dit que le ''Nil'' ait des flots d’azur ; personne ne donne à la mer une saveur douce, que la nature refuse à ses eaux : car le soleil en pompe sans cesse la partie la plus douce et la plus légère ; ensuite pourquoi le ''Nil'' ne croîtrait-il point pendant l’hiver ? la mer alors peut être battue par les vents, par des vents plus violents que les Étésiens, qui sont modérés. Enfin, si le mouvement venait de l’Atlantique, l’Égypte entière serait inondée tout d’un coup : or, l’inondation est graduelle.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA371#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Quatrième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA385#v=onepage&q&f=true ''chap. II.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''Chap. II.'''<br />''En quelle fai[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki>ó</nowiki> {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait l’accroi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement du Nil.''<br /><p style="text-align: justify; text-indent: 15px;">[...] Si vous en croyez '''Thales''' , les vents Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tent au ''Nil'' en de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cendant dans la mer; & arre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tent {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on cours, en pou{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ant la mer contre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ept emboucheures. Si bien qu’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tant repou{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é de la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte il retourne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oy-me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me , & ne croi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas comme l’on pen{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e , mais par ce qu’il trouue vn ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tacle qui l’empe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}che de pa{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}er outre , il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t contraint de s’arre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ter , & ne pouuant plus pour{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uiure {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a cour{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e , il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pand par où il peut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e répandre. '''Euthimenes''' de ''Mar{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eille'' en rend ce te{{Info|ſ|forme ancienne longue de la lettre s minuscule}}moignage. I’ay nauigé, dit il, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la mer ''Atlantique'' , & c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t par elle que le ''Nil'' deuient plus grand, lors que les vents Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent ; car alors cette mer {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ort pour ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i dire d’elle-me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me par la force & par la violence de ces vents. Mais lors qu’ils ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent plus la mer demeure tranquille, & le Nil ne trouue plus rien qui l’empe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}che de de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cendre , Au re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te l’eau de la mer e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t douce en ce temps-là , & l’on y void des be{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}emblables à celles du Nil. Mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i les Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont enfler le Nil, pourquoy {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on débordement commence il auant qu’ils {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent & pourquoy dure - il encore lors qu’ils ont ce{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouffler. Dauantage ils ne s’enfle pas plus que de cou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tume , quand ces vents {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent auecque plus de violence qu’ils ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont ordinairement. Enfim il ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e hau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e & ne s’abai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon que leur impetuo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ité e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t plus ou moins grande , ce qui arriveroit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans doute s’il s’enfloit par la force de ces véts. Mais comme les Ete{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens battent directement les bords de l’Egypte, & que le Nil de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cend contre eux ; il faudroit s’ils e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toient cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on accroi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement , qu’il commença{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t par l’endroit d’où ils viennent. Outre cela il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortiroit tout pur de la mer, & de la couleur de la mer, & ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit pas trouble & limonneux , comme il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t. Et apres tout le te{{Info|ſ|forme ancienne longue de la lettre s minuscule}}moignage d’'''Euthimene''' , e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t condamné par le plus grand nombre. Il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toit permis de mentir quand on n’auoit point de connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ance des pays e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trangers ; & alors on pouuoit facilement nous en enuoyer des fables. Mais aujourd’huy tous les riuages des mers les plus e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}loignées {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont remplis de vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eaux de marchands, & pas vn ne nous apporte que le ''Nil'' {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit de la couleur de la mer, ou que la mer ait vn autre gou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t. Quand nous aurions des rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons pour nous la per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uader , la nature nous empe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cheroit de le croire par ce que le Soleil en attire ce qu’il y a de plus leger & de plus doux. Dauantage pourquoy ne croi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-il pas en Hyuer , puis que la met en ce temps là peut e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre agitée par des vents plus violents, que les Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours moderez. Que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i le ''Nil'' venoit de la mer ''Atlantique'' , il couuriroit l’Egypte tout d’vn coup, & neantmoins il ne la couure que peu à peu.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA1#v=onepage&q&f=true <u>Seneque Des Qvestions Natvrelles</u>], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA3#v=onepage&q&f=true ''Livre Qvatriesme. De la Nege, de la Greſle, & de la Pluye.''], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA37#v=onepage&q&f=true ''chap. II.''], traduction par [[w:Pierre_Du_Ryer|Pierre Du Ryer]], A Lyon, Chez Christofle Fovrmy, 1663</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ==== Livre VI — Des tremblements de terre ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">En prologue, '''Sénèque''' énonce le plan du livre, des causes des tremblements de terre et des peurs qu’ils provoquent, en s’appuyant sur celui de ''Campanie'' qui a récemment causé d’importants dégâts à ''Pompéi'' et à ''Herculanum''. Des chapitres IV à XX, de nombreuses théories sismiques sont présentées, la plupart liées au nom d’un philosophe qui les prône. Le feu, l’eau et l’air sont cités comme causes, et plusieurs d’entre-elles les combinent. À partir du chapitre XXIV, '''Sénèque''' développe sa propre opinion : l’air pénétrant, qui remplit complètement les cavités souterraines sous une forte pression, en est la cause. En épilogue, il explique à '''Lucilius''' quel comportement adopté en de telles situations, à savoir être courageux en ne craignant pas la mort</div> ===== <div style="text-align: center;">Chapitre VI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réfutation d’une théorie de '''Thalès''' de la Terre flottant sur l’eau, et témoignage d’une de ses preuves portant sur les tremblements de terre.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''6.''' In aqua causam esse nec ab uno dictum est nec uno modo. '''Thales''' ''Milesius'' totam terram subiecto iudicat umore portari et innare, siue illud oceanum uocas, siue magnum mare, siue alterius naturae simplicem adhuc aquam et umidum elementum. Hac, inquit, unda sustinetur orbis uelut aliquod grande nauigium et graue his aquis quas premit. Superuacuum est reddere causas propter quas existimat grauissimam partem mundi non posse spiritu tam tenui fugacique gestari; non enim nunc de situ terrarum sed de motu agitur. Illud argumenti loco ponit aquas esse in causa quibus hic orbis agitetur, quod in omni maiore motu erumpunt fere noui fontes, sicut in nauigiis quoque euenit ut, si inclinata sunt et abierunt in latus, aquam sorbeant, quae in omni eorum onere quae uehit, si immodice depressa sunt, aut superfunditur aut certe dextra sinistraque solito magis surgit. Hanc opinionem falsam esse non est diu colligendum. Nam, si terra aqua sustineretur et ea aliquando concuteretur, semper moueretur, nec agitari illam miraremur sed manere; deinde tota concuteretur, non ex parte; numquam enim nauis dimidia iactatur. Nunc uero terrarum non uniuersarum sed ex parte motus est. Quomodo ergo fieri potest ut, quod totum uehitur, totum non agitetur, si eo quo uehitur agitatum est? — At quare aquae erumpunt? — Primum omnium saepe tremuit terra et nihil umoris noui fluxit. Deinde, si ex hac causa unda prorumperet, a lateribus terrae circumfunderetur, sicut in fluminibus ac mari uidemus incidere ut incrementum aquarum, quotiens nauigia desidunt, in lateribus maxime appareat. Ad ultimum non tam exigua fieret quam tu dicis eruptio nec uelut per rimam sentina subreperet, sed fieret ingens inundatio ut ex infinito liquore et ferente uniuersa.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n1/mode/2up <u>L. Annaei Senecae, Natvrales Qvaestiones</u>], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n135/mode/2up ''Liber Qvintvs - De terrae motv''], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n155/mode/2up ''chap. 6.''], texte établi par Carmen Codoñer Merino [[w:es:Carmen_Codoñer_Merino|(es)]], Consejo Superior de Investigaciones Científicas, Madrid, 1979</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''VI.''' In aqua causam esse, nec ab uno dictum est, nec uno modo. '''Thales''' ''Milesius'' totam terram subjecto judicat humore portari et innatare : sive illud Oceanum vocas, sive magnum mare, sive alterius naturæ simplicem adhuc aquam et humidum elementum. Hac, inquit, unda sustinetur orbis, velut aliquod grande navigium et grave his aquis, quas premit. Supervacuum est reddere causas, propter quas existimat, gravissimam partem mundi non posse spiritu tam tenui fugacique gestari ; non enim nunc de situ terrarum, sed de motu agitur. Illud argumenti loco ponit, aquas esse in causa, quibus hic orbis agitatur, quod in omui majore motu erumpunt fere novi fontes : sicut in navigiis quoque evenit, ut, si inclinata sunt et abiere in latus, aquam sorbeant, quæ in omni onere eorum quæ vehit, si immodice depressa sunt, aut superfunditur, aut certe dextra sinistraque solito magis surgit. Hanc opinionem falsam esse, non est diu colligendum ; nam, si terram aqua sustineret, et ea aliquando concuteretur : semper moveretur, nec agitari illam miraremur, sed manere. Tum tota concuteretur, non ex parte : nunquam enim navis dimidia jactatur. Nunc vero non terrarum universarum, sed ex parte motus est. Quomodo ergo fieri potest, ut quod totum vehitur, totum non agitetur, si eo quo vehitur, agitatum est ? At quare aquæ erumpunt ? Primum omnium sæpe tremuit terra, et nihil humoris novi fluxit. Deinde si ex hac causa unda prorumperet, a lateribus terræ circumfunderetur : sicut in fluminibus ac mari videmus accidere, ut incrementum aquarum, quoties navigia desidunt, in lateribus maxime appareat. Ad ultimum non tam exigua fieret quam dicit eruptio, nec velut per rimam sentina subreperet, sed fieret ingens inundatio, ut ex infinito liquore, et ferente universa.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA420#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Sixième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA429#v=onepage&q&f=true ''chap. VI.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''VI.''' Que l’eau soit cause des tremblements de terre, c’est ce qu’affirment divers auteurs et avec divers arguments. '''Thalès''' de ''Milet'' estime que le globe entier a pour support une masse d’eaux sur laquelle il flotte, et qu’on peut appeler Océan ou grande mer, ou élément jusqu’ici de nature simple, l’élément humide. Cette eau, dit-il, soutient la terre ; et l’immense navire pèse sur le liquide qu’il comprime. Il est superflu d’exposer les motifs qui font croire à '''Thalès''' que la partie de l’univers la plus pesante ne saurait porter sur une substance aussi ténue, aussi fugace que l’air : il ne s’agit pas maintenant de l’assiette du globe, mais de ses secousses. '''Thalès''' apporte en preuve de son système, que presque toujours les grandes secousses font jaillir des sources nouvelles, comme il arrive dans les navires qui, lorsqu’ils penchent et s’inclinent sur le flanc, sont envahis par l’eau ; toujours, s’il y a surcharge, l’eau vient couvrir le bâtiment, ou du moins s’élève à droite et à gauche plus que de coutume. La fausseté de cette opinion se démontre sans longs raisonnements. Si la terre était soutenue par l’eau, elle tremblerait quelquefois dans toute sa masse et toujours serait en mouvement ; ce ne serait pas son agitation qui étonnerait, mais son repos. Elle s’ébranlerait tout entière, non partiellement ; car ce n’est jamais la moitié seulement d’un navire qui est battue des flots. Or, les tremblements de notre terre ne sont pas universels, mais partiels. Comment serait-il possible qu’un corps porté tout entier par l’eau ne fût pas agité tout entier, quand ce fluide est agité ? « Mais d’où viennent les eaux qu’on a vues jaillir ? » D’abord, souvent la terre tremble, sans qu’il en sorte de nouvelles eaux. Ensuite, si telle était la cause de ces éruptions, elles n’auraient lieu qu’autour des flancs du globe ; ce que nous voyons arriver sur les fleuves et en mer : l’exhaussement de l’onde, à mesure que s’enfonce le navire, se remarque surtout aux flancs du bâtiment. Enfin l’éruption dont on parle ne serait pas si minime, et comme une voie d’eau qui s’infiltre par une fente légère ; l’inondation serait immense en raison de l’abîme infini sur lequel flotterait le monde.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[s:Questions_naturelles_(trad._Baillard)|<u>Sénèque le Jeune</u>]], [[s:Questions_naturelles_(trad._Baillard)/Livre_6|''Livre VI.'']] ''chap. 6.'', traduction par [[s:Auteur:Joseph_Baillard|Joseph Baillard]], Hachette, 1914<br />(également disponible [https://remacle.org/bloodwolf/philosophes/seneque/questionsnaturelles6.htm ici])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''VI.''' Plusieurs philosophes ont prétendu que l’eau est la cause de ces secousses : ce que chacun explique à sa manière. '''Thalès''' de ''Milet'' prétend que le globe entier a pour support une masse d’eau sur laquelle il flotte ; peu importe qu’on donne à cet amas le nom d’Océan, de grande mer ou d’eau élémentaire, eau simple. Cette eau, dit-il, soutient la terre comme un grand vaisseau pesant sur le liquide qu’il comprime. Il est inutile d’exposer les raisons qui font croire à '''Thalès''' que le corps le plus pesant de la nature ne peut être soutenu par un fluide aussi délié et aussi rare que l’air : car il s’agit ici des tremblements de terre et non de l’assiette du globe. La grande raison de '''Thales''' pour faire de l’eau la cause des secousses de la terre, c’est que, dans tout tremblement considérable, jaillissent des eaux nouvelles ainsi les vaisseaux se remplissent d’eau quand ils penchent d’un côté ; chargés à l’excès, ou ils sont submergés, ou ils s’enfoncent à droite et à gauche plus profondément dans la mer. Il ne faut pas longtemps discuter pour voir la fausseté de cette opinion. Si la terre était soutenue par les eaux, elle serait quelquefois fortement ébranlée, mais de plus elle serait toujours flottante, et il faudrait s’étonner non de son agitation , mais de son repos ; enfin, au lieu d’être ébranlée en partie, elle le serait tout entière : car jamais la moitié d’un vaisseau n’est battue des flots. Or, on sait que les secousses de la terre sont partielles et non universelles : comment se ferait-il donc que ce qui est entièrement porté par les eaux ne fût pas entièrement agité, tandis que les eaux mêmes le sont en totalité ? Mais, dit-on, qui fait jaillir les eaux ? D'abord, souvent la terre tremble sans qu’il se produise des eaux nouvelles ; ensuite, si telle était la cause de ces éruptions, les eaux se répandraient latéralement autour de la terre. Ainsi, par exemple, quand un vaisseau s’enfonce ou dans la mer ou dans les fleuves, c’est vers les bords surtout que l’accroissement devient sensible. Enfin les sources qui jaillissent ne seraient pas si peu considérables ; on ne pourrait pas les comparer à une voie d’eau qui pénètre par les fentes du fond de cale : ce serait une inondation immense comme l’abîme infini sur lequel flotterait le monde.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA420#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Sixième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA429#v=onepage&q&f=true ''chap. VI.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''Chap. VI.'''<br />''Si l’eau e[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki>t</nowiki> la cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e des tréblemés de terre.''<br /><p style="text-align: justify; text-indent: 15px;">Ce n'e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas vn homme {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eul qui a dit , que l’eau e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toit cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e du tremblement de la terre ; & l’on ne l’a pas dit d’vne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eule façó. '''Thales''' ''Mile{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ien'' a crû que toute la terre e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toit portée {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’eau , & qu’elle y nageoit, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit que vous appelliez cette eau Ocean, ou que vous l’appelliez grade mer, ou vne eau d’vne autre nature , eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}imple , element humide. C’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur cette eau, dit-il, que le monde e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenu, comme quelque vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau d’vne grandeur deme{{Info|ſ|forme ancienne longue de la lettre s minuscule}}urée , qui charge les eaux qui le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiennent. Il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit inutile de rapporter les rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons qui luy {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont croire que la plus pe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ante partie du móde ne peut e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenuë par l’air qui e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ubtil, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i fluide & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i delié ; & d’ailleurs, il ne s’agit pas icy de l’a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}iete de la terre , mais du tremblement de la terre. Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i pour preuue que les eaux {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e que la terre tremble , il dit qu’il ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que point de grands tremblemens de terre, qu’on n’en voye {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uitte de nouuelles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ources; que la terre re{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}emble en cela aux vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eaux qui ne peuuent pancher d’vn co{{Info|ſ|forme ancienne longue de la lettre s minuscule}}té, qu’ils ne pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ent de l’eau, qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pand {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur toutes les cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es qu’ils portent , {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i elles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont trop enfoncées; ou qui s’éleue de part & d’autre à la gauche , & à la droite. Il n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas besoin d’vn long di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cours pour montrer la fau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eté de cette opinion ; car {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenoit la terre, quelquesfois elle trembleroit toute entiere, & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours en mouuement; & nous ne nous e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tonnerions point de la voir remuer, mais de la voir ferme & inébranlable. Elle trembleroit toute entiere , & non pas en partie , car vn vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t iamais agité par vne moitié {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement ; & apres tout nous voyons que le tremblement ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait pas de toute la terre , mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement d’vne partie. Comment donc {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e peut-il faire que ce qui e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t porté tout entier ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit pas entierement agité , {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i la cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me qui porte e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}meuë & agitée ? Mais pourquoy {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ort-il de l’eau apres vn tremblement de terre ? Premierement la terre a {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouuent tremblé {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans qu’on en ayt veu {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir de nouuelles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ources. D’ailleurs {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortoit par cette rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on elle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pandroit par les co{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tez de la terre , comme nous voyons dans les fleuues & dans la mer , où lors que le vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau s’enfonce on remarque que l’eau s'éleue , principalement par les co{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tez. Enfin ces eaux ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortiroient pas en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i petite quantité, ny par vne fi petite ouuerture , mais il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit vne grande inondation, comme procedant de cette abondance d’eaux qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiennent tout l’vniuers.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA1#v=onepage&q&f=true <u>Seneque Des Qvestions Natvrelles</u>], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA141#v=onepage&q&f=true ''Livre Sixiesme. Des tremblemens de terre.''], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA164#v=onepage&q&f=true ''chap. VI.''], traduction par [[w:Pierre_Du_Ryer|Pierre Du Ryer]], A Lyon, Chez Christofle Fovrmy, 1663</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Pline_l%27Ancien|'''Pline l’Ancien''']] [[#Pline|<span id="Pline_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:23|23]]/[[w:24|24]], à [[w:Côme|''Novum Comum'']] ou [[w:Vérone|Vérone]] — [[w:79|79]], à [[w:Stabies|Stabies]], [[w:Mort_de_Pline_l%27Ancien|mort]] par asphyxie près de [[w:Pompéi|Pompéi]], lors de l’éruption du [[w:Vésuve|Vésuve]], en voulant observer le phénomène au plus près et en désirant porter secours aux victimes, alors en poste à [[w:Misène|''Misène'']] en tant que Préfet commandant la flotte militaire ''romaine'') <sup>[[w:Ier_siècle|⏳]]</sup> [[s:Auteur:Pline_l’Ancien|<sup>📚</sup>]] [https://books.google.fr/books?id=tRsuD3WJT-UC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA876#v=onepage&q&f=true {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume Va, §204 - Plinius Secundus (Caius —)}}] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Haut fonctionnaire militaire et civique, issu de l’[[w:Chevalier_romain|''orde équestre'']], et écrivain prolifique dans de très nombreux domaines.</div> {{Boîte déroulante début|titre=NdA Pline l’Ancien|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Pline_back|<span id="Pline"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Caius|praenomen, nom individuel du citoyen romain}} {{Info|Plinius|nomen, nom de famille}} {{Info|Secundus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}'''<br/><br/></div> {{Boîte déroulante fin}} === [[w:Histoire_naturelle_(Pline_l'Ancien)|Histoire naturelle]] === <p style="text-align: right;">[[s:Histoire_naturelle_(Pline)|📚]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Ouvrage de 37 livres dédié à l’empereur [[w:Titus_(empereur_romain)|'''Titus''']] [[#Titus|<span id="Titus_back"><sup>'''I'''</sup></span>]], dont il a été le ''{{Lang|la|contubernium}}'' pendant son service en tant que commandant des armées du ''Rhin'' en ''Germanie'' en [[w:47|47]]. '''Pline''' définit lui-même son enquête [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Histoire/Enquête_I|<sup>🔄</sup>]] sur la nature comme une reproduction de la vie — ''{{Lang|la|rerum natura, hoc est uita narratur}}'' (Livre I, Préface, 10), qu’il inscrit dans la tradition encyclopédique [[#encyclopédie_back|<sup>⤴️</sup>]] grecque mais s’en différencie par son exhaustivité : ''{{Lang|la|Jam omnia attingenda, quæ Græci}}'' ''{{Lang|grc|τάς έγχυχλοπαιδείας}}'' ''{{Lang|la|vocant : et tamen ignota aut incerta ingeniis facta; alia vero ita multis prodita, ut in fastidium sint adducta}}'' (Préface, 11). Il a, dans ce but, compilé « vingt mille faits dignes d’intérêt, tirés de la lecture d’environ deux mille volumes, [...] provenant de cent auteurs de choix » — ''{{Lang|la|Viginti millia rerum dignarum cura ex lectione voluminum circiter duum millium, [...] ex exquisitis auctoribus centum}}'' (Préface, 13).</div> {{Boîte déroulante début|titre=NdA Titus|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Titus_back|<span id="Titus"><sup>I</sup></span>]] Du nom propre latin Titus [[wikt:en:Titus#Latin|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">Commandant militaire, notamment pendant la [[w:Premi%C3%A8re_guerre_jud%C3%A9o-romaine|''première guerre judéo-romaine'']], au cours de laquelle il prend ''Jérusalem'' que ses troupes mettent à sac et fait détruire le [[w:Second_temple_de_Jérusalem#Destruction|''Second Temple'']], et empereur ''romain'', de la dynastie des [[w:Flaviens|''Flaviens'']], de [[w:79|79]] à [[w:81|81]].<br /><p style="text-align: right; margin: 0 2em;">(30 décembre [[w:39|39]] , ''Rome'' — 13 septembre [[w:81|81]], mort par fièvre selon [[w:Suétone|Suétone]] [http://remacle.org/bloodwolf/historiens/suetone/titus.htm <sup>VdDC, Titus</sup>] ou par empoisonnement avec du venin de [[w:Aplysia|''lièvre marin'']] par son propre frère [[w:Domitien|Domitien]] selon [[w:Philostrate_d%27Ath%C3%A8nes|Philostrate]] [https://remacle.org/bloodwolf/roman/philiostrate/apollonius6.htm <sup>AdT, l. VI, chap. 32</sup>])<sup>[[w:Ier_siècle|⏳]]</sup>'''<br/><br/></div> {{Boîte déroulante fin}} ==== Livre II ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Enquête sur l’astronomie et la physique du monde, basée sur les quatre éléments : air, terre, eau et feu.</div> ===== <div style="text-align: center;">Chapitre IX.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la première prédiction grecque d’une éclipse solaire (ou lunaire selon les traductions) par '''Thalès'''.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IX.''' Et rationem quidem defectus utriusque primus ''Romani'' generis in vulgus extulit '''Sulpicius Gallus''', qui consul cum '''Marcello''' fuit, sed tum tribunus militum, sollicitudine exercitu liberato, pridie quam '''Perseus''' rex superatus a '''Paulo''' est, in concionem ab imperatore productus ad prædicendam eclipsim, mox et composito volumine. Apud Græcos autem investigavit primus omnium '''Thales''' ''Milesius'', Olympiadis XLVIII anno quarto, prædicto solis defectu, qui '''Alyatte''' rege factus est, Urbis conditæ; anno CLXX. Post eos utriusque sideris cursum in sexcentos annos præcinuit '''Hipparchus''', menses gentium, diesque et horas, ac situs locorum, et visus populorum complexus, ævo teste, haud alio modo, quam consiliorum naturæ particeps. Viri ingentes supraque mortalium naturam, tantorum numinum lege deprehensa, et misera hominum mente absoluta, in defectibus scelera aut mortem aliquam siderum pavente (quo in metu fuisse '''Stesichori''' et '''Pindari''' vatum sublimia ora palam est deliquio Solis), et in Luna veneficia arguente mortalitate, et ob id crepitu dissono auxiliante. Quo pavore, ignarus causæ, '''Nicias''' ''Atheniensium'' imperator, veritus classem portu educere, opes eorum afflixit. Macti ingenio este, cæli interpretes, rerumque naturæ capaces, argumenti repertores, quo deos hominesque vinxistis. Quis enim hæc cernens, et statos siderum (quoniam ita placuit appellare) labores, non suæ necessitati mortalis genitus ignoscat ? Nunc confessa de iisdem breviter atque capitulatim attingam, ratione admodum necessariis locis strictimque reddita : nam neque instituti operis talis argumentatio est : neque omnium rerum afferri posse causas, minus mirum est, quam consfare in aliquibus.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/98/mode/2up ''Livre II.''], [https://archive.org/details/b24875958_0001/page/106/mode/2up ''chap. IX.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(également disponible une édition 1848 [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/130|ici]] et 1829 [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f45.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IX.''' Le premier ''Romain'' qui exposa publiquement la théorie des éclipses du soleil et de la lune est [[w:Caius_Sulpicius_Gallus|'''Sulpicius Gallus''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Caius_Sulpicius_Gallus_back|<sup>🔄</sup>]], qui fut consul avec [[w:Marcus_Claudius_Marcellus_(consul_en_-166)|'''Marcellus''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Marcellus-166_back|<sup>🔄</sup>]], mais qui alors était tribun militaire. La veille du jour où [[w:Persée_(roi)|'''Persée''']] [[#Persée_(roi)|<span id="Persée_(roi)_back"><sup>'''I'''</sup></span>]] fut défait par [[w:Lucius_Æmilius_Paullus_Macedonicus|'''Paul-Emile''']] [[#Lucius_Æmilius_Paullus_Macedonicus|<span id="Lucius_Æmilius_Paullus_Macedonicus_back"><sup>'''II'''</sup></span>]] il parut par ordre du général, afin de prévenir les alarmes de l’armée, devant les troupes assemblées pour annoncer l’éclipse qui allait survenir; peu de temps après, il composa un livre sur ce sujet. Le premier qui s’en occupa chez les ''Grecs'' fut '''Thalès''' de ''Milet'', dans la quatrième année de la quarante-huitième olympiade (an 585 av. J. C. [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#éclipse_back|<sup>🔄</sup>]]), l’an 170 de la fondation de ''Rome'', et prédit une éclipse de lune qui arriva sous le roi [[w:Alyatte_II|'''Alyatte''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Alyatte_back|<sup>🔄</sup>]]. Après eux, [[w:Hipparque_(astronome)|'''Hipparque''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Hipparque_back|<sup>🔄</sup>]] dressa pour six cents ans la table du cours du soleil et de la lune, déterminant les mois des divers calendriers, les jours, les heures, les localités et les aspects, suivant les contrées. Le cours des ans ne lui a donné aucun démenti, et il semble avoir été admis aux conseils de la nature. Génies puissants et élevés au dessus de l’humanité, ils ont découvert la loi qui régit ces grandes divinités, et ils ont délivré de ses craintes l’esprit misérable des hommes, qui dans les éclipses, tantôt croyaient voir une influence malfaisante ou une espèce de mort des astres, crainte qui, comme on sait, a, pour l’éclipse du soleil, troublé [[w:Stésichore|'''Stésichore''']] [[#Stésichore|<span id="Stésichore_back"><sup>'''III'''</sup></span>]] et [[w:Pindare|'''Pindare''']] [[#Pindare|<span id="Pindare_back"><sup>'''IV'''</sup></span>]], poètes sublimes, et tantôt attribuaient l’obscurcissement de la lune à des maléfices, et lui venaient en aide par un bruit dissonnant. Redoutant ce phénomène, dont il ignorait la cause, [[w:Nicias|'''Nicias''']] [[#Nicias|<span id="Nicias_back"><sup>'''V'''</sup></span>]], général des ''Athéniens'', n’osa pas faire sortir la flotte du port de [[w:Syracuse#Antiquité|''Syracuse'']], et ruina la puissance de sa patrie. Redoublez de génie, interprètes du ciel, vous dont l’intelligence, embrassant la nature, a inventé des théories qui ont créé un lien entre les dieux et les hommes [[#Vicistis_JH|<span id="Vicistis_JH_back"><sup>'''1'''</sup></span>]] ! A la vue de ce spectacle, à la vue des labeurs (puisque c’est le nom qu’on a voulu donner aux éclipses), des labeurs réguliers auxquels les astres sont soumis, quel mortel ne pardonnerait à la nécessité sous laquelle il est né ? Maintenant je vais parler, d’une manière brève et sommaire, des points sur lesquels on est d’accord en cette matière. Je ne donnerai que de courtes explications, et là où il sera tout à fait nécessaire; car les explications n’entrent pas dans le plan de cet ouvrage, et il n’y a pas moins de mérite à énumérer les causes de toutes choses qu’à s’appesantir sur quelques-unes.</div> <table cellspacing=15 align=center style="margin: 0 4em; font-size:85%;"> <tr> <td style="text-align: justify; margin: 0 4em;">'''[[#Vicistis_JH_back|<span id="Vicistis_JH"><sup>1</sup></span>]] Vicistis Vulg. — Vinxistis cod. Dalech. — Vinxistis me parait meilleur. Comp. ce que dit Pline plus loin, ch. 24, sur l’affinité de l’esprit humain avec les astres.'''</td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/98/mode/2up ''Livre II.''], [https://archive.org/details/b24875958_0001/page/106/mode/2up ''chap. IX.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(édition 1848 également disponible [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/130|ici]])</div> {{Boîte déroulante début|titre=NdA de trad. Jean Hardouin 1883|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Persée_(roi)_back|<span id="Persée_(roi)"><sup>I</sup></span>]] Du nom propre grec ancien Περσεύς / Perseús[[wikt:en:Περσεύς#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Dernier roi de [[w:Royaume_de_Mac%C3%A9doine|''Macédoine'']] de la dynastie des [[w:Antigonides|''Antigonides'']], vaincu en [[w:-168|-168]] à la [[w:bataille de Pydna|bataille de ''Pydna'']] à l’issue de la [[w:troisième guerre macédonienne|''troisième guerre macédonienne'']], causant la disparition du ''Royaume de Macédoine''.<br /><p style="text-align: right; margin: 0 2em;">([[w:Années_212_av._J.-C.|-212]]<sup>[[w:IIIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Pella_(cité_antique)|''Pella'']], au nord de l’actuelle ''Grèce'' — [[w:Années_166_av._J.-C.|-166]]<sup>[[w:IIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Alba_Fucens|''Alba Fucens'']], au centre de l’actuelle ''Italie'') <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Lucius_Æmilius_Paullus_Macedonicus_back|<span id="Lucius_Æmilius_Paullus_Macedonicus"><sup>II</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Lucius|praenomen, nom individuel du citoyen romain}} {{Info|Æmilius|nomen, nom de famille}} {{Info|Paullus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, surnommé [[wikt:Macedonicus#Latin|Macedonicus]] par le [[w:Sénat_romain|''Sénat'']] à la suite de sa victoire;<br /><p style="margin: 0 2em; text-indent: 15px">Homme politique ''romain'', consul à 2 reprises en [[w:Années_182_av._J.-C.|-182]] et [[w:Années_169_av._J.-C.|-169]]. Il remporta la victoire contre le ''royaume de Macédoine'' à ''Pydna'' en battant le roi Persée [[#Persée_(roi)|<sup>I</sup>]], ce qui mit fin à la dynastie des ''Antigonides''.<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:Années_230_av._J.-C.|-230]]<sup>[[w:IIIe_siècle_av._J.-C.|⏳]]</sup>, ''Rome'' — ''ca.'' [[w:Années_160_av._J.-C.|-160]]<sup>[[w:IIe_siècle_av._J.-C.|⏳]]</sup>, ''Rome'') <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Stésichore_back|<span id="Stésichore"><sup>III</sup></span>]] Du nom propre grec ancien Στησίχορος /Stēsíkhoros [[wikt:en:Στησίχορος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du verbe ἵστημι /hístēmi, « 1. (voix transitive, active des temps présent, imparfait, futur et 1er aoriste) : • Faire se tenir debout, se tenir debout; • Arrêter, rester, vérifier; • Mettre en place : - Faire monter, élever, réveiller, remuer; - Nommer, désigner; - Établir, instituer; • Mettre dans la balance, peser. 2. (voix intransitive, moyenne et passive, voix active du 2e aoriste, parfait et plus-que-parfait) : • Se tenir debout; • Se tenir immobile : (au sens figuré) Rester ferme; • Être dressé ou debout, se lever, s’élever : - (en général) Se lever, commencer; - (en marquant le pas) Être; - Être désigné. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du nom commun χορός / khorós, « 1. Danse en rond. 2. Danse accompagnée de chant, danse chorale. 3. Chœur, chorale, groupe de chanteurs et de danseurs. 4. Groupe, troupe. 5. Rangée. 6. Lieu de danse. 7. (théâtre) Chœur »;<br /><p style="margin: 0 2em; text-indent: 15px">Poète lyrique grec, considéré comme l’un des [[w:Neuf_lyriques_grecs|''neuf poètes lyriques'']] de la Grèce antique.<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:Années_630_av._J.-C.|-630]]<sup>[[w:VIIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Metauria|''Metauria'']], colonie de la [[w:Grande-Grèce|''Grande-Grèce'']], au sud de la région de [[w:Calabre|''Calabre'']], au sud de l’Italie — ''ca.'' [[w:Années_555_av._J.-C.|-555]]<sup>[[w:VIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Catane|''Catane'']], colonie de la ''Grande-Grèce'', à l’est de la [[w:Sicile|''Sicile'']]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Pindare_back|<span id="Pindare"><sup>IV</sup></span>]] Du nom propre grec ancien Πίνδᾰρος /Píndaros [[wikt:en:Πίνδαρος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Poète lyrique grec, considéré comme l’un des [[w:Neuf_lyriques_grecs|''neuf poètes lyriques'']] de la Grèce antique.<br /><p style="text-align: right; margin: 0 2em;">([[w:Années_518_av._J.-C.|-518]]<sup>[[w:VIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Cynocéphales|''Cynocéphales'']], cité grecque située près de [[w:Thèbes_(Grèce)|''Thèbes'']], en [[w:Béotie|''Béotie'']] — [[w:Années_438_av._J.-C.|-438]]<sup>[[w:Ve_siècle_av._J.-C.|⏳]]</sup>, [[w:Árgos|''Árgos'']], cité grecque de la région de l’[[w:Argolide|''Argolide'']], à l’est de la [[w:Péloponnèse|''péninsule du Péloponnèse'']]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Nicias_back|<span id="Nicias"><sup>V</sup></span>]] Du nom propre grec ancien Νῑκίᾱς /Nīkíās [[wikt:en:Νικίας#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du nom commun νίκη / níkē [[wikt:en:νίκη#Ancient_Greek|(en)]], « 1. Le fait de gagner : la victoire, le succès [avec le génitif "sur, dans quelque chose"] : • Les choses gagnées dans la victoire, les fruits de la victoire; • La supériorité, l’avantage. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du suffixe nominal masculin -ίας / -ías [[wikt:en:-ίας#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Homme politique et général ''athénien'' durant la [[w:Guerre_du_Péloponnèse|''guerre du Péloponnèse'']], qui oppose la [[w:Ligue_de_Délos|''ligue de Délos'']], menée par ''Athènes'', et la [[w:Ligue_du_Péloponnèse|''ligue du Péloponnèse'']], sous l’[[w:Hégémonie|hégémonie]] de ''Sparte'' de [[w:Années_431_av._J.-C.|-431]] à [[w:Années_404_av._J.-C.|-404]]. Sa supersition liée à une éclipse lunaire, s’étant produite lors de l’[[w:Expédition_de_Sicile|''expédition de Sicile'']], est également relatée par [[w:Thucydide|Thucydide]] [http://remacle.org/bloodwolf/historiens/thucydide/livre7.htm#L <sup>{{Info|HdlgdP|Histoire de la guerre du Péloponnèse}} l.VII, §.L</sup>] et [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]] [http://remacle.org/bloodwolf/historiens/Plutarque/supestition.htm#23 <sup>{{Info|DlS|De la Superstition}} l.I</sup>].<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:Années_470_av._J.-C.|-470]], ''Athènes'' — ''ca.'' [[w:Années_413_av._J.-C.|-413]], ''Syracuse'')<sup>[[w:Ve_siècle_av._J.-C.|⏳]]</sup>'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">Des découvertes astronomiques : part de chaque observateur dans la science.<br /><p style="text-align: justify; text-indent: 15px;">'''IX.''' '''Sulpicius Gallus''' [[#Sulpicius_Gallus_AdG|<span id="Sulpicius_Gallus_AdG_back"><sup>'''1'''</sup></span>]] fut le premier ''Romain'' qui expliqua au vulgaire la raison des éclipses de soleil et de lune. Il fut consul avec '''Marcus Marcellus''' ; mais il n’était que tribun militaire lorsque la veille de la victoire que '''Paul Emile''' remporta sur '''Persée''' [[#Pridie_quam_Perses_rex_AdG|<span id="Pridie_quam_Perses_rex_AdG_back"><sup>'''2'''</sup></span>]], son général le fit paraître devant l’armée assemblée, pour lui annoncer l’éclipse qui allait arriver, et la délivrer de l’alarme qu’elle aurait pu en concevoir. Il composa bientôt après un volume sur ce sujet. Parmi les ''Grecs'', '''Thalès''' de ''Milet'' [[#Primus_omnium_Thales_AdG|<span id="Primus_omnium_Thales_AdG_back"><sup>'''3'''</sup></span>]] dirigea le premier ses recherches sur ce phénomène, et la quatrième année de la 48e olympiade, qui répond à l’an 170 [[#Anno_CLXX_AdG|<span id="Anno_CLXX_AdG_back"><sup>'''4'''</sup></span>]] de ''Rome'', il prédit l’éclipse de soleil qui eut lieu sous le règne d’'''Alyatte''' [[#Alyatte_rege_AdG|<span id="Alyatte_rege_AdG_back"><sup>'''5'''</sup></span>]]. Après eux, '''Hipparque''' dressa des tables du cours de ces deux astres pour six cents ans [[#In_sexcentos_annos_AdG|<span id="In_sexcentos_annos_AdG_back"><sup>'''6'''</sup></span>]] : mois, heures, jours, situations respectives des lieux, aspects du ciel selon les diverses nations [[#Menses_gentium_etc_AdG|<span id="Menses_gentium_etc_AdG_back"><sup>'''7'''</sup></span>]], tout y est compris, tout a été vérifié par le temps [[#Aevo_teste_AdG|<span id="Aevo_teste_AdG_back"><sup>'''8'''</sup></span>]]; on croirait l’astronome admis au conseil de la nature. Génies vastes et plus qu’humains, d’avoir ainsi surpris la loi de ces deux grandes divinités [[#Numinum_AdG|<span id="Numinum_AdG_back"><sup>'''9'''</sup></span>]], et affranchi d’effroi la malheureuse espèce humaine, qui tremblait en voyant dans chaque éclipse l’annonce de quelque grand crime, ou craignait la mort des astres [[#In_defectibus_scelera_etc_AdG|<span id="In_defectibus_scelera_etc_AdG_back"><sup>'''10'''</sup></span>]] (effroi dont '''Stésichore''' et '''Pindare''' [[#Pindari_AdG|<span id="Pindari_AdG_back"><sup>'''11'''</sup></span>]], ces poètes sublimes, ne furent point exempts dans les éclipses de soleil), ou qui attribuait à des enchantemens celles de la lune, et venait à son secours en faisant un bruit discordant [[#Crepitu_dissono_AdG|<span id="Crepitu_dissono_AdG_back"><sup>'''12'''</sup></span>]]. C’est pour en avoir ignoré la cause, que, frappé de cette même terreur, '''Nicias''' [[#Nicias_AdG|<span id="Nicias_AdG_back"><sup>'''13'''</sup></span>]], général des ''Athéniens'', n’osa pas faire sortir sa flotte du port, et causa la ruine de leur puissance. Gloire à vous, interprètes du ciel, génies aussi étendus que la nature, inventeurs d’une science qui enchaîne à une même destinée les dieux et les mortels ! Quel est donc l’homme qui, voyant les astres en travail (pour me servir du nom qu’il a plu de donner aux crises qu’ils, subissent périodiquement), ne se soumettra pas à sa destinée?<br /><p style="text-align: justify; text-indent: 15px;">Je vais maintenant toucher brièvement et sommairement les points sur lesquels on est d’accord dans cette matière, et j’en rendrai raison en passant, lorsque cela sera tout-à-fait nécessaire; car un développement de preuves n’est pas le but de l’ouvrage que j’ai entrepris, et il n’y a pas, je pense, moins de mérite à pouvoir rendre raison de toutes choses, qu’à s’arrêter à en prouver quelques-unes.</div> {{Boîte déroulante début|titre=Notes du traducteur|alignT=center}} <div style="text-align: justify; border: 2px; border-radius:15px; font-size:85%;"><br/> <table cellspacing=15 align=center style="margin: 0 4em;"> <tr> <td style="text-align: justify; margin: 0 4em; text-indent: 15px">'''[[#Sulpicius_Gallus_AdG_back|<span id="Sulpicius_Gallus_AdG"><sup>1</sup></span>]] [[w:Tite-Live|Tite-Live]], XLIV, 37, [[w:Quintilien|Quintilien]], I, 10, [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]], [[w:Vies_parallèles|''Vie de Paul Emile'']], [[w:Frontin|Frontin]], I, etc., prétendent, comme Pline, que Sulpicius Gallus prédit l’éclipse anx soldats romains. [[w:Cicéron|'''Cicéron''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cicéron_back|<sup>🔄</sup>]] ([[w:De_Republica|''Répub.'']], I, 15 , page 44, ''édit. Maj.'') dit au contraire que l’éclipse était déjà arrivée lorsque Sulpicius Gailus commençait à s’efforcer d’ôter aux soldats romains la terreur qu’ils avaient conçue de cet événement, en leur expliquant les causes des éclipses.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pridie_quam_Perses_rex_AdG_back|<span id="Pridie_quam_Perses_rex_AdG"><sup>2</sup></span>]] Selon Tite-Live (XLIV, 37), l’éclipse eut lieu dans la soirée du 3 septembre, cent huit ans avant J.-C., entre sept et dix heures (''ab hora secunda usque ad quartam noctis, quam pridie nonas sept, secula est dies''). M. [[w:Christian_Ludwig_Ideler|Ideler]] (''Chronologie'', II, 104) a calculé cette éclipse. Il a trouvé, comme M. de Nauze, que, selon le calendrier Julien, elle arriva dans la soirée du 21 juin de l’an 168 avant J.-C. à Rome, la lune commença à s’éclipser vers 5h.44’ du soir ; depuis 6h.51’ jusqu’à 8h.18’, la lune fut totalement éclipsée, ; à 9h.,24’, la lune ne fut plus obscurcie du tout. En Macédoine, tous ces phénomènes arrivèrent 39 minutes plus tard. Le 21 juin, le soleil se coucha à Rome et en Macédoine vers 7h.33’, et s’y montra alors à 44 1/2’ h. équatoriales. Ainsi, la première heure de la nuit finissait vers 8h.17’, la seconde vers 9h.2’, la troisième vers 9h.46’, la quatrième vers 10h.31’. La lune fut donc éclipsée totalement au moment où elle se leva dans la Macédoine, et cette éclipse totale y finit dans la seconde heure de la nuit ; au milieu de la quatrième, la lune ne fut plus obscurcie du tout. S’il est vrai, que cette éclipse lunaire, comme Pline, Tite-Live et d’autres le disent, fut prédite par Sulpicius Gallus, l’on devrait avouer que ce Romain s’entendait très-bien au calcul des éclipses lunaires. Mais les récits de Cicéron et de [[w:Valère_Maxime|Valère-Maxime]] ne seraient-ils pas plus vrais que ceux de Pline et de Tite-Live ?''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Primus_omnium_Thales_AdG_back|<span id="Primus_omnium_Thales_AdG"><sup>3</sup></span>]] Le même fait est rapporté par [[w:Hérodote|Hérodote]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Hérodote_back|<sup>🔄</sup>]], I, 74, par [[w:Diogène_Laërce|Diogène Laërce]] [[#Diogène_Laërce_back|<sup>⤵️</sup>]], I, 6 , par [[w:Clément_d'Alexandrie|Clément d’Alexandrie]] [[#Clément_d'Alexandrie_back|<sup>⤵️</sup>]], ''Strom.'', I, page 302 , par Plutarque, ''Opinions des Philosophes'', II, 24, par [[w:Jean_Tzétzès|Tzetzès]], ''Chil.'' II, v. 869, et par Hardouin.<br /><p style="text-align: justify; text-indent: 15px;">Oltmann a publié une dissertation dans laquelle, à l’aide des tables astronomiques les plus modernes, il est arrivé à ce résultat, que l’éclipse solaire dont il est question ici eut lieu le 3o septembre 610 ans avant J.-C. L’éclipse était totale pour les environs de la ville d’[[w:Erzurum|Érzerum]] sur le [[w:Kızılırmak_(fleuve)|Halys]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Halys_back|<sup>🔄</sup>]], où [[w:Volney|Volney]] place le champ de bataille des rois [[w:Alyatte_II|Halyattes]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Alyatte_back|<sup>🔄</sup>]] et [[w:Cyaxare|Cyaxare]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cyaxare_back|<sup>🔄</sup>]]. La quatre-vingtième partie du disque solaire seule ne fut pas éclipsée pour le lieu de la terre où Oltmann place le champ de bataille, qui est situé, selon lui, sous 36° long. à l’est de Terro et sous 40° lat. sept. Dans le pays des Ioniens où Thalès prédit l’éclipse, selon Hérodote, l’éclipse se monta à 11 1/2’. M. [[w:Alphonse_Des_Vignoles|Desvignolles]] (''Chronologie de l’histoire sainte'', t. II, pag. 245 et suiv.) fixe l’éclipsé prédite par Thales au 38 mai de l’an 585 avant J.-C. ; son opinion a été adoptée depuis par presque tous les chronologistes et historiens, et par [[w:Gabriel_Brotier|Brotier]] et M. Alexandre. Elle a été réfutée avec succès par Oltmann, qui s’est servi de tables astronomiques bien plus exactes que celles de M. Desvignolles ; en effet, celui-ci a démontré par ses calculs que l’éclipse totale du soleil du 28 mai de l’an 585 avant J.-C., ne fut pas totale dans les lieux où les troupes du roi lydien Halyatte combattirent contre celles du roi Cyaxare ; que, dans ces régions, elle ne se monta pas à plus de 7 1/2 pouces, et que, d’ailleurs, le soleil ne s’était pas encore levé lorsque Féclipse était le plus forte pour les habitans des pays nommés. Mais Hérodote dit positivement que l’éclipse prédite par Thalès fut totale dans ces contrées, et qu’elle eut lieu en plein jour. (Voyez IDELER, ''Chronologie'', t. I, pag. 209 et 210.) Nous remarquerons pourtant avant de finir cette note que la date de Desvignolles est plus conforme que celle d’Oltmann à l’année dans laquelle l’éclipse prédite par Thalès, arriva selon Pline. En effet, le naturaliste romain dit que cette année est la six cent quatre-vingt-cinquième avant J.—C., et c’est justement le 28 mai de cette année que l’éclipse prédite par Thalès arriva, selon M. Desvignolles.<br /><p style="text-align: justify; text-indent: 15px;">Volney pense que l’éclipse en question arriva le 3 février de de l’an 626. Oltman a démontré, dans son Mémoire sur l’éclipse de Thalès, que celle de Volney était déjà passée lorsque le soleil se leva sur le champ de bataille des rois Halyattes et Cyaxare.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Anno_CLXX_AdG_back|<span id="Anno_CLXX_AdG"><sup>4</sup></span>]] L’an 170. C’est ainsi que l’on doit lire, et non CLX, comme l’ont fait Hardouin et Poinsinet; la quatrième année de la quarante-huitième olympiade, correspondant à l’an 170 de Rome, si l’on suppose avec [[w:Varron_(écrivain)|Varron]] que cette ville a été fondée dans la deuxième année de la 6e olympiade.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Alyatte_rege_AdG_back|<span id="Alyatte_rege_AdG"><sup>5</sup></span>]] Le nom de ce roi est écrit avec un esprit rude dans Hérodote, ce qui a donné lieu à [[w:Louis_Poinsinet_de_Sivry|Poinsinet]] et à d’autres traducteurs de Pline de substituer le mot Halyatte à celui d’Alyatte.<br /><p style="text-align: justify; text-indent: 15px;">Alyatte ou Halyatte fut roi de la Lydie et père de Crésus. Il faisait la guerre à Cyaxare, roi des Mèdes, lorsque l’éclipse solaire en question interrompit le combat.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#In_sexcentos_annos_AdG_back|<span id="In_sexcentos_annos_AdG"><sup>6</sup></span>]] On lit dans [[w:Georges_le_Syncelle|le Syncelle]] (''Chronolog.'', pag. 17) que les Chaldéens ont connu une période de six cents années solaires. [[w:Flavius_Josèphe|Josèphe]] [[#Flavius_Josèphe_back|<sup>⤵️</sup>]] ([[w:Antiquités_judaïques|''Ant. jud.'']], I, page 17 et 18, édit. Havercamp) dit que Dieu donna une longue vie aux patriarches pour qu’ils pussent cultiver avec succès les sciences astronomiques et géométriques, ce qu’ils n’auraient pu faire s’ils n’avaient pas vécu au moins six cents ans ; car la grande année ne finit pas plus tôt. Ainsi, il est certain qu’avant Hipparque les Chaldéens et d’autres peuples asiatiques ont connu une période de six cents années solaires. Mais [[w:Jean-Dominique_Cassini|Cassini]] ([[w:Jean-Dominique_Cassini#Mémoires_de_l’Académie_royale_des_sciences|''Anciens mém. de l’Acad.'']], t. VIII, pag. 4 et 5) et [[w:Jean_Sylvain_Bailly|Bailly]] (''Hist. de l’astr. ancienne'', t. II, liv. 3, Eclairciss.) ont prouvé que tous les six cents ans les nouvelles et pleines lunes n’arrivent pas seulement au même jour et à la même heure qu’auparavant, mais encore à la même minute. Ne serait-il donc pas probable qu’Hipparque, comme le dit Ideler (''Historische untersuchungen uber die astronomischen beobachtungen der alten'', Berlin 1806, page 417) a connu cette période chaldéenne, et que delà résulte l’étendue de six cents ans donnée à son calendrier selon Pline.<br /><p style="text-align: justify; text-indent: 15px;">[[w:Abel_Burja|Abel-Burja]] de Leipzig a tâché d’expliquer d’une autre manière la durée du calendrier d’Hipparque (''Astronomisches Jahrbuch'', 1797, pag. 233 et 234). [[w:Claude_Ptolémée|Ptolémée]] et [[w:Censorin_(grammairien)|Censorin]] racontent qu’Hipparque est auteur d’une période soli-lunaire de trois cent quatre années solaires. En la prenant deux fois, on obtient une période de six cent huit ans. Celle-ci fut abrégée par Hipparque de huit ans, afin d’obtenir un nombre entier de siècles pour son calendrier. Ideler a fait une objection très-juste contre cette opinion de Burja ; c’est que la période de six cent huit ans n’a aucun avantage sur celle de trois cent quatre ans. On ne voit donc pas ce qui a pu engager Hipparque à préférer le nombre de six cents ans à celui de trois cents, lorsqu’il composait son calendrier.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Menses_gentium_etc_AdG_back|<span id="Menses_gentium_etc_AdG"><sup>7</sup></span>]] C’est-à-dire il écrivit des éphémérides dans lesquelles il avait calculé d’avance les néomenies et les pleines lunes. Il fit aussi entrer dans son calendrier les longueurs des jours et des heures variables, [[w:ὧραι|ὧραι]] καιρικαι, ainsi que les aspects du ciel, ''visus populorum'', tels qu’ils eurent lieu chez les habitans de différentes contrées de la terre. Il ajouta une table des longitudes et des latitudes des principaux pays et villes du globe. Ptolémée (''Géogr.'', I, ch. 4) en dit autant d’Hipparque.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Aevo_teste_AdG_back|<span id="Aevo_teste_AdG"><sup>8</sup></span>]] Les tables d’Hipparque étaient dressées pour six cents ans. Cet astronome florissait vers cent cinquante ans avant J.-C. Ainsi, du temps de Pline, on avait encore à jouir de ces tables pour quatre cents ans environ. POINSINET.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Numinum_AdG_back|<span id="Numinum_AdG"><sup>9</sup></span>]] Pline donne souvent l’épithète de divinités aux planètes, à la lune, au soleil, à la terre et aux étoiles fixes.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#In_defectibus_scelera_etc_AdG_back|<span id="In_defectibus_scelera_etc_AdG"><sup>10</sup></span>]] Nous transcrivons ici ce beau passage de l’Uranographie de M. [[w:Louis-Benjamin_Francœur|Francoeur]], qui mérite d’être mis en parallèle avec celui de Pline pour l’élégance du style et les pensées, et qui renferme le meilleur commentaire que nous puissions donner de tout ce que Pline dit des terreurs que les éclipses causaient autrefois aux hommes ignorans. « L’histoire, dit M. Francoeur (page 93), est pleine des exemples de l’effroi causé par les éclipses, et des dangers que produisent l’ignorance et la superstition. Nicias avait résolu de quitter la Sicile avec son armée ; effrayé par une éclipse de lune, et voulant temporiser plusieurs jours pour s’assurer si l’astre n’avait rien perdu après cet évènenement, il manqua ainsi l’occasion de sa retraite; son armée fut détruite ; Nicias périt, et ce malheur commença la ruine d’Athènes.<br /><p style="text-align: justify; text-indent: 15px;">« Souvent on a vu des hommes adroits tirer parti de la frayeur du peuple pour l’amener à remplir leurs desseins. Christophe Colomb, réduit à faire subsister ses soldats des dons volontaires d’une nation sauvage et indigente, était prêt à voir tarir cette ressource et à périr de faim ; il annonce qu’il va priver le monde de la lumière de la lune. L’éclipse commence et la terreur s’empare des Indiens, qui reviennent apporter aux pieds de Colomb les tributs accoutumés.<br /><p style="text-align: justify; text-indent: 15px;">« Drusus (TACITE , Annales, I, 28) apaisa une sédition dans son armée, en prédisant une éclipse de lune, et, selon Tite-Live, Sulpicius Gallus, dans la guerre de Paul-Emile contre Persée, usa du même stratagème. Periclès, [[w:Agathocle_de_Syracuse|Agathocles de Syracuse]], [[w:Dion_de_Syracuse|Dion]], roi de Sicile, ont failli être victimes de l’ignorance de leurs soldats. [[w:Alexandre_le_Grand|Alexandre]], près d’[[w:Bataille_de_Gaugamèles|Arbelles]], est réduit à user de toute son adresse pour calmer la terreur qu’une éclipse avait jetée parmi ses troupes. Les hommes supérieurs, plutôt que de plier sous les circonstances qui les maîtrisent, mettent leur art à les tourner à leur profit.<br /><p style="text-align: justify; text-indent: 15px;">« Combien de fables établies d’après l’opinion que les éclipses sont l’effet du courroux céleste qui se venge des iniquités de l’homme en le privant de la lumière! Tantôt [[w:Diane_(mythologie)|Diane]] va trouver [[w:Endymion|Endymion]] dans les montagnes de Carie; tantôt les magiciennes de Thessalie font descendre la lune sur les herbes qu’elles destinent aux enchantemens. »<br /><br /><p style="text-align: center;">''Carmina vel cælo possunt deducere lunam.''<br /><p style="text-align: right; text-indent: 15px;">Virg., ''Eclog.'' VIII.<br /><br /><p style="text-align: justify; text-indent: 15px;">« Ici c’est un dragon qui dévore l’astre, et qu’on cherche à épouvanter par des cris ; le dieu tient le soleil enfermé dans un tuyau, et nous ôte ou nous rend la vue de cet astre à l’aide d’un volet, etc. Les progrès des sciences ont fait connaître le ridicule de ces opinions et de ces craintes, depuis qu’on a vu qu’il était possible de calculer par les tables astronomiques, et de prévoir long-temps d’avance l’instant où la colère du ciel devait éclater.<br /><p style="text-align: justify; text-indent: 15px;">« Cependant, naguère encore, l’épouvante a causé les revers des armées de Louis XIV, près de Barcelone, lors de l’éclipse totale de l’an 1706 [[w:en:Solar_eclipse_of_May_12,_1706|(en)]], et la devise, ''nec pluribus impar'', a prêté aux allusions injurieuses ! »''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pindari_AdG_back|<span id="Pindari_AdG"><sup>11</sup></span>]] Pindare était le plus fameux poète de la Grèce après Homère. Il vint au monde l’an 134 avant l’ère chrétienne. POINSINET.<br /><p style="text-align: justify; text-indent: 15px;">Plutarque (''De la face de la lune'', pag. 931) dit aussi que Stésichore et Pindare craignaient beaucoup les éclipses. Le dernier poète a peint les terreurs que lui causaient ces phénomènes dans son poëme sur le soleil. HARDOUIN et DALECHAMP.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Crepitu_dissono_AdG_back|<span id="Crepitu_dissono_AdG"><sup>12</sup></span>]] Cet usage superstitieux dont Plutarque parle au long dans sa vie de Paul-Émile, a fourni un vers fort plaisant à Juvénal, lorsqu’après avoir épuisé toute sorte d’exagération pour représenter le bruit qu’une femme fait en criant, il finit par dire :<br /><br /><p style="text-align: center;">''Una laboranti poterit succurrere lunæ.''<br /><br /><p style="text-align: justify; text-indent: 15px;">« Elle seule, au besoin, décharmerait la lune. » POINSINET.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Nicias_AdG_back|<span id="Nicias_AdG"><sup>13</sup></span>]] Le même fait est raconté par Plutarque dans la vie de Nicias, par Quintilien, I, 10, et par d’autres écrivains anciens. HARDOUIN.''' </td> </tr> </table><br/><br/></div>{{Boîte déroulante fin}} <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f10.item <u>Histoire Naturelle de Pline. Tome Second</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f14.item ''Livre II.''], [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f46.item ''chap. IX.''], traduction nouvelle par M. [[w:Stéphane_Ajasson_de_Grandsagne|Ajasson de Grandsagne]] [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f311.item <sup>NOTES</sup>], C. L. F. Panckoucke, Paris, 1829</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">''Des inventions a[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />tronomiques, & de leurs Auteurs.''<br /><p style="text-align: justify; text-indent: 15px;">'''L'''E PREMIER d’entre les ''Romains'' qui rendit publique la théorie des éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil & de lune, fut '''Sulpicius Gallus''' [[#Sulpicius_Gallus_LPdS|<span id="Sulpicius_Gallus_LPdS_back"><sup>'''1'''</sup></span>]], celui que '''Marcus Marcellus''' eut pour Collegue au Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ulat : mais il n’étoit que Tribun Militaire [[#Tribun_Militaire_LPdS|<span id="Tribun_Militaire_LPdS_back"><sup>'''2'''</sup></span>]], lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il di{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ipa l’allarme qu’auroient pu prendre nos troupes la veille de la victoire remportée {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur '''Per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ée''' par '''Paul Emile''' ; car ce Général l’ayant produit devant les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oldats a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}emblés, il leur prédit une éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e qui devoit arriver [[#éclipse_LPdS|<span id="éclipse_LPdS_back"><sup>'''3'''</sup></span>]] ; il compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}a même en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite un Ouvrage {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur ce {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ujet. Parmi les ''Grecs'', '''Thalès''' de ''Milet'' prédit l’an quatrieme de la quarante-huitieme olympiade l’éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil qui arriva {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le regne de '''Halyattes''' [[#Halyattes_LPdS|<span id="Halyattes_LPdS_back"><sup>'''4'''</sup></span>]], l’an cent {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oixante de la fondation de [[#cent_soixante_LPdS|<span id="cent_soixante_LPdS_back"><sup>'''5'''</sup></span>]] ''Rome''. Après eux, Hipparque [[#Hipparque_LPdS|<span id="Hipparque_LPdS_back"><sup>'''6'''</sup></span>]] dre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}a des Tables en vers [[#En_vers_LPdS|<span id="En_vers_LPdS_back"><sup>'''7'''</sup></span>]] du cours de ces deux aftres pour fix cents ans. Dans ces Tables , de l’exactitude deſquelles notre âge rend encore témoignage [[#témoignage_LPdS|<span id="témoignage_LPdS_back"><sup>'''8'''</sup></span>]], il embra{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e les éphémérides propres à chaque nation [[#chaque_nation_LPdS|<span id="chaque_nation_LPdS_back"><sup>'''9'''</sup></span>]], les jours, les heures, le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ite re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pectif de chaque lieu, & les divers a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pects du ciel relativement aux divers peuples, comme {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i la Nature l’eût admis à {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eil intime. Per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}onnages vraiment grands! génies plus qu’humains, d’avoir ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urpris les loix qui font mouvoir ces va{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes pui{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ances du ciel ; & d’avoir guéri de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es allarmes l’imagination malade des hommes, qui ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’alors, ou avoient toujours vu dans les éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es l’annonce effrayante de quelque grand crime & de quelque mort (terreur dont Sté{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ikhore [[#Stésikhore_LPdS|<span id="Stésikhore_LPdS_back"><sup>'''10'''</sup></span>]] & Pindare [[#Pindare_LPdS|<span id="Pindare_LPdS_back"><sup>'''11'''</sup></span>]], ces Poètes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ublimes, ne furent point exempts à l’égard des éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olaires), ou attribuoient les ténebres dont {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e couvre la lune à des maléfices opérés par le mêlange de certaines herbes magiques ; & croyoient devoir la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ecourir par un bruit di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cordant [[#bruit_discordant_LPdS|<span id="bruit_discordant_LPdS_back"><sup>'''12'''</sup></span>]]. Cette même terreur fut cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e que le Général Nicias [[#Nicias_LPdS|<span id="Nicias_LPdS_back"><sup>'''13'''</sup></span>]], peu au fait des cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es phy{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iques, & n’o{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant pas, par {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uper{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tition, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a flotte du Port, mit Athenes à deux doigts de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a perte. Honneur [[#Honneur_LPdS|<span id="Honneur_LPdS_back"><sup>'''14'''</sup></span>]] à vous, Interpretes du Ciel ! E{{Info|ſ|forme ancienne longue de la lettre s minuscule}}prits [[#Esprits_LPdS|<span id="Esprits_LPdS_back"><sup>'''15'''</sup></span>]] dont l’étendue {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urpa{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e celle de la Nature ; Inventeurs d’une méthode qui a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ujettit les dieux comme les hommes, à une même de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tinée ! Eh! qui pourroit, en voyant les a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres même ''en cri{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e'' (pour me {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervir de l’expre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ion commune), ne pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oumettre à la néce{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ité où {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a condition mortelle l’enchaîne.<br /><p style="text-align: justify; text-indent: 15px;">Pré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}entement je vais toucher par articles fort courts & fort précis les points {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le{{Info|ſ|forme ancienne longue de la lettre s minuscule}}quels on s’accorde le plus. Je ré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}oudrai, chemin fai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant, quelques que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tions, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que le cas l’exigera, mais toujours d’une maniere très {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ommaire ; car une analy{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e en forme d’arguments {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivis excéderoit le but de cet Ouvrage : & puis, je pen{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e qu’il n’y a pas moins de mérite à rendre une rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on plau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ible de toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es, qu’à rendre une rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on bien {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olide de deux ou trois cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement.</div> {{Boîte déroulante début|titre=Notes du traducteur|alignT=center}} <div style="text-align: justify; border: 2px; border-radius:15px; font-size:85%;"><br/> <table cellspacing=15 align=center style="margin: 0 4em;"> <tr> <td style="text-align: justify; margin: 0 4em; text-indent: 15px">'''[[#Sulpicius_Gallus_LPdS_back|<span id="Sulpicius_Gallus_LPdS"><sup>1</sup></span>]] Son premier prénom étoit Caïus. Voyez à {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ujet Tite-Live, l. 44. Valere maxime, l. 8. Quintilien, l. I. ch. 10. Plutarque, vie de Paul-Emile, &c.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Tribun_Militaire_LPdS_back|<span id="Tribun_Militaire_LPdS"><sup>2</sup></span>]] Ce grade répond à celui de Major-général des Troupes.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#éclipse_LPdS_back|<span id="éclipse_LPdS"><sup>3</sup></span>]] Cette éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Tite-Live, fut annoncée aux {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oldats pour la nuit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivante. Sulpicius Gallus leur prédit que la lune s’éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit entre la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econde heure de la nuit & la quatrieme. Plutarque ajoute qu’on étoit alors à l’i{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ue de l’été (''{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ub exitum a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tatis''). [[w:Paulin_II_d'Aquilée|Paul d’Aquilée]] écrit que cette éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e arriva aux nones de Septembre (''nonas Septembris''), c’est-à-dire au 4 Septembre : c’étoit l’an 168 avant J.C. {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon le calcul d’[[w:James_Ussher|U{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}erius]].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Halyattes_LPdS_back|<span id="Halyattes_LPdS"><sup>4</sup></span>]] Il paroît que Ciceron & Eu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ebe {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trompent lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’ils placent cet événement {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous ''A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiages'' : [[w:Hermolaos_(Macédoine)|Hermolaüs]] s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t trompé d’après eux, en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ub{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tituant ''A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiages'' à ''Halyattes'' dans le texte de Pline, contre la foi des manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crits, & contre le témoignage d’Herodote qui place cet événement dans une guerre entre Halyattes, Roi de Sardes, & Cyaxare, Roi des Medes, pere d’A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiages.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#cent_soixante_LPdS_back|<span id="cent_soixante_LPdS"><sup>5</sup></span>]] Les deux manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crits royaux portent ''anno CLX'' : c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t la leçon qu’il faut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivre. En effet, Rome, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Varron, fut fondée l’an 2 de la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ixieme olympiade, c’est-à-dire, dans l’année olympiadique 22. Mais comme chaque olympiade, depuis leur premiere in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titution, commençoit après le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ol{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tice d’été, & comme l’année Romaine avoit toujours commencé au plus tard en Mars {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous Romulus, & depuis en Janvier {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous Numa, il s’en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uit que la premiere année de Rome, qui répondoit à l’année olympiadique 22, répondoit en même-tems, de quatre mois au moins, à l’année olympíadique 23. Selon ce calcul, la quatrieme année de la quarante-huitieme olympiade, répond en partie à l’an 160, & en partie à l’an 161 de la fondation de Rome, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que 48 olympiades font cent quatre-vingt-douze années, de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}quelles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i vous ôtez 22 ans écoulés, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Varron, entre la premiere olympiade & la fondation de Rome, il re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tera 160 ans, & 161 ans {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’on a égard à l’enjambement réciproque des années olympiadiques {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les années Romaines, & des années Romaines {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les années olympiadiques. Il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t donc évident que le calcul de Pline (''anno CLX'') e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te, en admettant l’hypothe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e chronologique de Varron, à laquelle on voit bien que notre Auteur s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t conformé en cette occa{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ion particuliere encore qu’en plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs autres rencontres il paroi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e affecter de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivre le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}y{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tême de Caton : vici{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}itude pardonnable dans un ouvrage de compilation où Pline a dû, comme malgré lui, adopter tantôt le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tyle d’un Auteur, tantôt celui d’un autre, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ource où il pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit pour l’heure. Si Pline eût {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivi l’hypothe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de Caton qui place la fondation de Rome deux ans plus tard que Varron, il eût fait tomber le rapport {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’année 157 ou 158 de la fondation de Rome. C’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le parti que prend le Pere Hardouin, & c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t de là qu’il part pour propo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}er une correction dans le texte. Mais encore une fois, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t commettre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oi-même une faute que d’en trouver une chez Pline en cette occa{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ion ; pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que cet Auteur a été en droit de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervir du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}y{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tème Varronien, ou ce qui revient au même, de con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erver la date Varronienne dont s’étoit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervi l’Auteur de qui il emprunte le fait hi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}torique en que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Hipparque_LPdS_back|<span id="Hipparque_LPdS"><sup>6</sup></span>]] Voyez les notes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le premier livre au mot ''Hipparque'' : HIPPARCHUS (de Nicée, en Bithinie comme l’ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erve [[w:Souda|Suidas]]), flori{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}oit dans la quatre-vingt-quatorzieme olympiade. Nous avons {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es trois livres d’Enarrations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les Phénomenes d’[[w:Aratos_de_Soles|Aratus]] & d’[[w:Eudoxe_de_Cnide|Eudoxe]], traduits par le [[w:Paul_Petau|P. Petau]]. Il avoit compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é un autre livre ''De {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tellarum inerrantium Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titutione'', {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Suidas. Son livre du mois lunaire e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t cité par [[w:Claude_Galien|Galien]].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#En_vers_LPdS_back|<span id="En_vers_LPdS"><sup>7</sup></span>]] ''En Vers.'' Je préfume que c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-là le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ens de ''præcinere'', qui ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ignifie pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement prédire, mais prédire en chant, c’est-à-dire en Vers. Sur ce pied-là, ce {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit d’un Poëme dans le genre de celui d’[[w:Aratos_de_Soles|Aratus]], dont il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit ici que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion. Si par hazard Pline n’a point prétendu parler d’un Poëme, au-moins s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervi d’une expre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ion propre à dé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igner ce genre d’écrire. Pour décider la que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion, il faudroit avoir tous les ouvrages d’Hipparque, & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur-tout celui-ci.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#témoignage_LPdS_back|<span id="témoignage_LPdS"><sup>8</sup></span>]] Ces tables étoient dre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ées pour {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix cents ans. Or Hipparque flori{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}oit 150 ans avant J.C. Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i du tems de Pline, on avoit encore à jouir de ces tables pour quatre cents ans ou environ.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#chaque_nation_LPdS_back|<span id="chaque_nation_LPdS"><sup>9</sup></span>]] La lune ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e levant pas & ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e couchant pas à la même heure pour toutes les nations, les diver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es époques & pha{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es qu’elle forme n’appartiennent pas non plus au même point de tems pour tous les peuples, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que les uns ont la nuit quand les autres ont le jour; & que même lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que la lune s’éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e, la partie de l’heure où ce phénomene e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ible, n’a pas la même évaluation pour tous les climats qui l’apperçoivent. Hipparque avoit donc eu égard à cette différence d’époques, relativement aux diver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es longitudes, &par-con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}équent aux diver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es nations, tellement que les tables de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es éphémérides étoient accommodées à l’u{{Info|ſ|forme ancienne longue de la lettre s minuscule}}age de tous les peuples : ouvrage dont on ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}auroit trop regretter la perte, & qui jetteroit le plus grand jour {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’ancienne géographie.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Stésikhore_LPdS_back|<span id="Stésikhore_LPdS"><sup>10</sup></span>]] Ste{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ikhore, l’un des plus fameux Poètes de la Grece, dont, par malheur, nous avons perdu tous les ouvrages, à l’exception d’une vingtaine de lignes décou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ues. Il vivoit dans la quarante-deuxieme olympiade, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-à-dire, vers l’an {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix cents dix avant J.C.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pindare_LPdS_back|<span id="Pindare_LPdS"><sup>11</sup></span>]] Pindare, le plus fameux Poète de la Grece après Homere. Il vint au monde l’an 134 avant l’ere chrétienne.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#bruit_discordant_LPdS_back|<span id="bruit_discordant_LPdS"><sup>12</sup></span>]] Cet u{{Info|ſ|forme ancienne longue de la lettre s minuscule}}age {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uper{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titieux a fourni un Vers fort plai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant à Juvenal, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’après avoir épui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é toute {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte d’exagération pour repré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}enter le bruit qu’une femme fait en criant, il finit par dire :<br /><p style="text-align: justify; text-indent: 15px;">''Una laboranti poterit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uccurrere luna.''<br /><p style="text-align: justify; text-indent: 15px;">Elle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eule au be{{Info|ſ|forme ancienne longue de la lettre s minuscule}}oin décharmeroit la lune.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Nicias_LPdS_back|<span id="Nicias_LPdS"><sup>13</sup></span>]] C’étoit un Général Athénien, qui fut malheureux dans pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que toutes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es expéditions. Les Athéniens finirent par le condamner à mort. Il étoit contemporain d’[[w:Alcibiade|Alcibiade]] & de [[w:Lamachos|Lamachus]], & leur collegue dans le commandement. Voyez {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le fait dont parle ici Pline, Quintilien, l. I. ch. 10, & Plutarque à l’article Nicias.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Honneur_LPdS_back|<span id="Honneur_LPdS"><sup>14</sup></span>]] Au lieu de ''macte ingenio'', le Pere Hardouin lit ''macti'' ; mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon les meilleurs Latini{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes ''macte'' e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t indéclinable, ou pour mieux dire, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t un adverbe qui répond au ''bravò'' des Italiens. Fe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tus prétend que ''macte'' e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t un compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é de ''magis auctus''.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Esprits_LPdS_back|<span id="Esprits_LPdS"><sup>15</sup></span>]] Cette apo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trophe de Pline aux A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomes rappelle ces beaux Vers d'Ovide {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le même {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ujet :<br />Felices animos quibus hæc cogno{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cere primise<br /><p style="text-align: justify; text-indent: 15px;">Inque Domos {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uperas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}candere cura fuit!<br />Credibile e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t illos pariter vitli{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que joci{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que<br /><p style="text-align: justify; text-indent: 15px;">Altius humanis ex{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eruifle caput,<br />Non Venus aut Vinum {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ublimia pectora fregit<br /><p style="text-align: justify; text-indent: 15px;">Officiumve {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ori, militiæve labor :<br />Nec levis ambitio, perfu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}aque gloria fuco,<br /><p style="text-align: justify; text-indent: 15px;">Magnarumve fames {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ollicitavit opum.<br />Admovere oculis di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tantia {{Info|ſ|forme ancienne longue de la lettre s minuscule}}idera no{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tris,<br /><p style="text-align: justify; text-indent: 15px;">Ætheraque ingenio {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uppo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uere {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uo.<br />Sic petitur cœlum: non ut ferat O{{Info|ſ|forme ancienne longue de la lettre s minuscule}}lan Olympus<br /><p style="text-align: justify; text-indent: 15px;">Summaque Peliacus {{Info|ſ|forme ancienne longue de la lettre s minuscule}}idera tangat apex, &c.<br /><p style="text-align: right; text-indent: 15px;">Ovid. {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t. l. I.''' </td> </tr> </table><br/><br/></div> {{Boîte déroulante fin}} <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=UnhluychtF8C&newbks=1&newbks_redir=0&dq=Histoire%20naturelle%20Pline&hl=fr&pg=PP7#v=onepage&q&f=true <u>Histoire Naturelle de Pline. Tome Premier</u>], [https://books.google.fr/books?id=UnhluychtF8C&newbks=1&newbks_redir=0&dq=Histoire%20naturelle%20Pline&hl=fr&pg=RA1-PA3#v=onepage&q&f=true ''Livre Second.''], [https://books.google.fr/books?id=UnhluychtF8C&newbks=1&newbks_redir=0&dq=Histoire%20naturelle%20Pline&hl=fr&pg=RA1-PA59#v=onepage&q&f=true ''Des inventions astronomiques, & de leurs Auteurs.''], traduction en françois, avec le texte latin rétabli d’après les meilleures leçons manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crites ; accompagnée de Notes critiques pour l’éclairci{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement du texte, & d’Ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ances des Anciens comparées avec les découvertes des Modernes, par M. [[w:Louis_Poinsinet_de_Sivry|Louis Poinsinet de Sivry]], Chez la veuve Desaint, Paris, 1771</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ==== Livre XVIII ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Enquête sur l’agriculture</div> ===== <div style="text-align: center;">Chapitre LVII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une théorie astronomique de '''Thalès''', du [[w:Lever_héliaque|''coucher matinal'']] des [[w:Pléiades_(astronomie)|''Pléiades'']] 25 jours après l’[[w:Équinoxe_de_septembre|''équinoxe d’automne'']].</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''LVII.''' Primum omnium dierum ipsorum anni solisque motus prope inexplicabilis ratio est. Ad CCCLXV adjiciunt etiamnum intercalarios diei noctisque quadrantes. Ita fit, ut tradi non possint certa siderum tempora. Accedit confessa rerum obscuritas, nunc præcurrenle, nec paucis diebus, tempestatum significatu, quod προϰειμασιν Græci vocant : nunc postveniente, quod ἐπιϰεἰμασιν : et plerumque alias citius, alias tardius cæli effectu ad terram deciduo : vulgo serenitate reddita, confectum sidus audimus. Præterea quum omnia hæc statis sideribus cæloque affixis constent, interveniunt motu stellarum grandines, imbres, et ipsi non levi effectu, ut docuimus, turbantque conceptæ spei ordinem. ldque ne nobis tantum putemus accidere, et reliqua fallit animalia sagaciora circa hoc, ut quo vita eorum constet : æstivasque alites præposteri aut præproperi rigores necant, hibernas æstus. Ideo '''Virgilius''' errantium quoque siderum rationem ediscendam præcipit, admonens observandum frigidæ Saturni stellæ transitum. Sunt qui certissimum veris indicium arbitrentur ob infirmitatem animalis, papilionis proventum. Id eo ipso anno, quum commentaremur hæc, notatum est, proventum eorum ter repetito frigore exstinctum, advenasque volucres a. d. VI kalendas februarii spem veris attulisse, mox sævissima hieme conflictatas. Res anceps : primum omnium a cælo peti legem : deinde eam argumentis esse quærendam. Super omnia est mundi convexitas, terrarumque globi differentia, eodem sidere alio tempore aliis aperiente se gentibus : quo fit ut causa ejus non lisdem diebus ubique valeat. Addidere difficultatem et auclores diversis in locis observando, mox etiam in iisdem diversa prodendo. Très autem fuere sectæ : ''Chaldæa'', ''Ægyptia'', ''Græca''. His addidit apud nos quartam Cæsar dictator, annos ad solis cursum redigens singulos, '''Sosigene''' perito scientiæ ejus adhibito. Et ea ipsa ratio postea comperto errore correcta est : ita ut XII annis continuis non intercalaretur, quia cœperat sidera annus morari, qui prius antecedebat. Et '''Sosigenes''' ipse trinis commentationibus, quanquam diligentior cæteris, non cessavit tamen addubitare, ipse semet corrigendo. Auctores prodidere ea, quos prætexuimus volumini huic, raro ullius sententia cum alio congruente. Minus hoc in reliquis mirum, quos diversi excusaverint tractus. Eorum qui in eadem regione dissedere, unam discordiam ponemus exempli gratia : occasum matutinum Vergiliarum '''Hesiodus''' (nam hujus quoque nomine exstat Astrologia) tradidit fieri, quum æquinoctium autumni conficeretur, '''Thales''' vigesimo quinto die ab æquinoctio, '''Anaximander''' vigesimo nono, '''Euctemon''' XLVIII. Nos sequemur observationem Cæsaris : maximeque hæc erit ''Italiæ'' ratio. Dicemus tamen et aliorum placita : quoniam non unius terræ, sed totius naturæ interpretes sumus, non auctoribus positis (id enim verbosum est), sed regionibus : legentes tantum meminerint, brevitatis gratia, quum ''Altica'' nominata fuerit, simul intelligere ''Cycladas'' insulas ; quum ''Macedonia'', ''Magnesiam'', ''Thraciam'' ; quum ''Ægyptus'', ''Phœnicen'', ''Cyprum'', ''Ciliciam'' ; quum ''Bœotia'', ''Locridem'', ''Phocidem'', et finitimos semper tractus ; quum ''Hellespontus'', ''Cherronesum'', et continentia usque ''Atho'' montem ; quum ''Ionia'', ''Asiam'', et insulas ''Asiæ'' ; quum ''Peloponnesus'', ''Achaiam'', et ad ''Hesperum'' jacentes terras. ''Chaldæi Assyriam'' et ''Babyloniam'' demonstrabunt. ''Africam'', ''Hispanias'', ''Gallias'' sileri non erit mirum. Nemo enim observavit in iis, qui siderum proderet exortus. Non tamen difficili ratione dignoscentur in illis quoque terris digestione circulorum, quam in sexto volumine fecimus : qua cognatio cæli, non gentium modo, verum urbium quoque singularum intelligitur, nota ex his terris, quas nominavimus, sumta convexitate circuli, pertinentis ad quas quisque quæret terras, et ad earum siderum exortus, per omnium circulorum pares umbras. Indicandum et illud, tempestates ipsas ardores suos habere quadrinis annis : et easdem non magna differentia reverti ratione solis : octonis vero augeri easdem, centesima revolvente se luna.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/652/mode/2up ''Livre XVIII.''], [https://archive.org/details/b24875958_0001/page/684/mode/2up ''Chap. LVII.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(également disponible une édition de 1831 [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f339.item ici] et de 1848 [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/708|là]])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''LVII.''' Avant tout, le calcul des jours même de l’année et du mouvement solaire est d’une difficulté presque insurmontable. Aux trois cent soixante-cinq jours on ajoute des jours intercalaires, produits de quarts de jour et de nuit ; de là vient qu’on ne peut indiquer des époques fixes pour les astres. Ajoutez une obscurité des choses avouée de tous : tantôt en effet la mauvaise saison, s’annonçant, anticipe même de plusieurs jours, ce que les Grecs appellent προϰεἰμασις (avant-hiver), et la belle saison retarde, ce qui est nommé ἐπιϰεἰμασις (arriere-hiver) : l’effet du ciel tombe sur la terre tantôt plus vite, tantôt plus tardivement ; et d’ordinaire c’est quand la sérénité est rétablie que nous entendons dire que l’action de l’astre est accomplie. En outre, car tous ces phénomènes dépendent d’astres réglés et fixés au ciel, le mouvement des étoiles amène intercurremment des grêles, des pluies qui ne sont pas non plus d’une faible action, comme nous l’avons enseigné (XVII, 2), et qui troublent l’ordre espéré. Et ne pensons pas que ces méprises n’arrivent qu’à nous; les autres animaux s’y trompent, bien que plus sagaces que nous sur ce point, vu que leur vie en dépend : l’on voit les oiseaux d’été tués par des froids hâtifs ou tardifs, et les oiseaux d’hiver par des chaleurs hâtives ou tardives. Aussi [[w:Virgile|'''Virgile''']] [[#Virgile|<span id="Virgile_back"><sup>'''I'''</sup></span>]] ([[w:Géorgiques|''Georg.'']], I, 335) recommande-t-il d’étudier encore le cours des astres errants, avertissant d’observer le passage de Saturne, planète froide. Il en est qui regardent comme l’indice le plus sûr du printemps l’apparition des papillons, à cause de la délicatesse de cet insecte. Or, l’année même où nous écrivions ceci (an 830 de ''Rome''), il a été noté que les papillons, ayant éclos, furent détruits à trois reprises par le froid, et que les oiseaux étrangers, ayant apporté l’espérance du printemps avant le 6 des calendes de février (27 janvier), eurent bientôt après à essuyer un hiver très-rigoureux. La double difficulté est d’abord d’avoir à demander au ciel la règle de toute chose, puis d’être obligé de contrôler cette règle par des faits apparents. Avant tout signalons la convexité du monde et les différences du globe terrestre, qui font que le même astre se montre à des temps divers suivant les nations, de sorte que l’influence ne s’en fait pas sentir partout aux mêmes jours. La difficulté a été encore accrue par les auteurs qui ont observé en des lieux différents, ou même qui, ayant observé dans les mêmes lieux, ont publié des résultats divergents. Il y a eu trois écoles, la ''Chaldéenne'', l’Égyptienne, la ''Grecque''. Une quatrième a été formée chez nous par le dictateur [[w:Jules_César|'''César''']], qui ramena l’année à la révolution solaire avec l’aide de [[w:Sosigène_d'Alexandrie|'''Sosigène''']] [[#Sosigène|<span id="Sosigène_back"><sup>'''II'''</sup></span>]], astronome habile. Et ce calcul même, où l’on découvrit une erreur, a été corrigé : pendant douze années consécutives on ne fit pas d’intercalation, attendu que l’année, qui auparavant anticipait, maintenant retardait sur les astres. '''Sosigène''' lui-même, quoique plus exact que les autres, n’a pas cessé, dans trois mémoires, de témoigner de ses doutes en se corrigeant lui-même. Les auteurs que nous avons indiqués au commencement de ce livre [[#auteurs_JH|<span id="auteurs_JH_back"><sup>'''1'''</sup></span>]] ont révélé ces discordances, l’avis de l’un s’accordant rarement avec l’avis de l’autre. Cela est moins étonnant dans ceux qui s’excuseront par la différence des lieux. Parmi ceux qui dans le même pays sont en désaccord, nous choisirons un exemple de dissidence : [[w:Hésiode|'''Hésiode''']] [[#Hésiode|<span id="Hésiode_back"><sup>'''III'''</sup></span>]] (car nous avons aussi sous son nom un livre sur les astres) a rapporté que le [[w:Lever_héliaque|''coucher matinal'']] des [[w:Pléiades_(astronomie)|''Pléiades'']] se faisait au moment de l’[[w:Équinoxe_de_septembre|''équinoxe d’automne'']] ; '''Thalès''', qu’il se faisait vingt-cinq jours après cet équinoxe; [[w:Anaximandre|'''Anaximandre''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Anaximandre_back|<sup>🔄</sup>]], vingt-neuf; [[w:Euctémon|'''Euctémon''']] [[#Euctémon|<span id="Euctémon_back"><sup>'''IV'''</sup></span>]], quarante-huit. Quant à nous, nous suivrons les calculs de '''César''' : ils se rapportent spécialement à l’Italie. Toutefois, nous relaterons aussi les opinions des autres ; car nous sommes les interprètes, non d’un seul pays, mais de la nature entière. Nous nommerons, non pas les auteurs, ce qui serait trop long, mais les pays. Les lecteurs auront seulement à se souvenir que, pour abréger, sous le nom d’[[w:Attique|''Attique'']] nous entendons aussi les [[w:Cyclades|''Cyclades'']]; sous celui de [[w:Macédoine_(province_romaine)|''Macédoine'']], la [[w:Magnésie_antique|''Magnésie'']] et la [[w:Thrace_(province_romaine)|''Thrace'']]; sous celui d’[[w:Égypte_romaine_et_byzantine|''Égypte'']], la [[w:Syrie-Phénicie_(province_romaine)|''Phénicie'']], [[w:Chypre_(province_romaine)|''Chypre'']] et la [[w:Cilicie|''Cilicie'']]; sous celui de [[w:Béotie#Antiquité|''Béotie'']], la [[w:Locride_(Grèce)|''Locride'']], la [[w:Phocide#Antiquité_et_période_byzantine|''Phocide'']] et les contrées limitrophes ; sous celui d’[[w:Hellespontique|''Hellespont'']], la [[w:Chersonèse_(cité_grecque)|''Chersonèse'']] et le continent jusqu’au [[w:Mont_Athos|''mont Athos'']]; sous celui d’[[w:Ionie|''Ionie'']], l’Asie et les îles ''Asiatiques'' ; sous celui de [[w:Péloponnèse#Antiquité|''Péloponnèse'']], l’[[w:Achaïe|''Achaïe'']] et les terres situées à l’occident; la [[w:Chaldée|''Chaldée'']] indiquera la [[w:Histoire_de_la_Syrie#Antiquité|''Syrie'']] et la [[w:Babylone_(civilisation)|''Babylonie'']]. On ne s’étonnera pas que je passe sous silence l’[[w:Afrique_romaine|''Afrique'']], l’[[w:Hispanie_romaine|''Espagne'']] et les [[w:Gaule|''Gaules'']], car personne dans ces contrées n’a laissé d’observations sur le lever des astres. Toutefois, il ne sera pas difficile de le calculer, même dans ces contrées, en étudiant la disposition des cercles que nous avons présentés dans le sixième livre (VI, 39). Grâce à cette étude, on connaît les relations astronomiques nou-seulement des nations, mais encore des villes en particulier : étant donnés les cercles déterminés par l’égalité des ombres, on choisit, dans les terres que nous avons nommées, le cercle qui a rapport à la localité objet du problème, et qui détermine en même temps le lever des astres pour cette localité. Il faut encore remarquer (II, 48) que tous les quatre ans les saisons ont leurs excès, et qu’elles reviennent les mêmes sans grande différence, en raison du soleil ; mais que tous les huit ans elles ont un redoublement, à la révolution de la centième lune.</div> <table cellspacing=15 align=center style="margin: 0 4em; font-size:85%;"> <tr> <td style="text-align: justify; margin: 0 4em;">'''[[#auteurs_JH_back|<span id="auteurs_JH"><sup>1</sup></span>]] Ce passage porte à croire que les auteurs dont Pline s’était servi pour composer chacun des livres de son ouvrage avaient été placés en tête du livre auquel ils se rapportaient. Les éditions mettent cette liste d’auteurs à la suite de la table de chaque livre, dans la table générale dressée par Pline lui-même.'''</td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/652/mode/2up ''Livre XVIII.''], [https://archive.org/details/b24875958_0001/page/684/mode/2up ''Chap. LVII.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]] [https://archive.org/details/b24875958_0001/page/708/mode/2up <sup>NOTES</sup>], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(également disponible une édition 1848 [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/708|ici]])</div> {{Boîte déroulante début|titre=NdA de trad. Jean Hardouin 1883|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Virgile_back|<span id="Virgile"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Publius|praenomen, nom individuel du citoyen romain}} {{Info|Vergilius|nomen, nom de famille}} {{Info|Maro|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}};<br /><p style="margin: 0 2em; text-indent: 15px">Poète latin renommé dans les styles [[w:Épopée|''épique'']] (l’[[w:Énéide|''Énéide'']]), [[w:Poésie_pastorale|''pastorale'']] (les [[w:Bucoliques|''Bucoliques'']]) et [[w:Poésie_didactique|''didactique'']] (les [[w:Géorgiques|''Géorgiques'']]).<br /><p style="text-align: right; margin: 0 2em;">(15 octobre [[w:Années_70_av._J.-C.|-70]], [[w:Virgilio_(Lombardie)#Histoire|''Andes'']], au sud-est de l’actuelle [[w:Lombardie#Histoire|''Lombardie'']], au nord de l’Italie — 21 septembre [[w:Années_19_av._J.-C.|-19]], [[w:Brindisi#Histoire|''Brundisium'']], au sud-est des actuelles [[w:Pouilles#Domination_romaine|''Pouilles'']], au sud-est de l’Italie)<sup>[[w:Ier_siècle_av._J.-C.|⏳]]</sup> <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Sosigène_back|<span id="Sosigène"><sup>II</sup></span>]] Du nom propre grec ancien Σωσῐγένης / Sōsigénēs [[wikt:en:Σωσιγένης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du verbe σῴζω / sṓizō, « 1. Sauver : • Guérir ; • (rare chez Homère) Garder en sécurité, préserver ; • Garder, observer, maintenir ; • (généralement au milieu) Garder à l’esprit, se souvenir ; • Conduire en toute sécurité (à) ; • Secourir ; • Conserver pour. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du nom commun‎ γένος / génos [[wikt:en:γένος#Ancient_Greek|(en)]], « 1. Race, souche, parenté : Descendance directe, par opposition à une relation collatérale. 2. Progéniture, descendant : (collectif) progéniture, postérité. 3. (en général) Race d’êtres : • Famille, clan, maison ; • Tribu, nation, race, en tant que subdivision de ἔθνος / éthnos [[wikt:en:ἔθνος#Ancient_Greek|(en)]] ; • Caste ; • Race d’animaux. 4. Âge, génération, période de la vie. 5. Sexe, genre : (grammaire) Genre grammatical. 6. Classe, sorte, genre : • (logique) L’opposé de εἶδος / eîdos [[wikt:en:εἶδος#Ancient_Greek|(en)]] ; • (taxonomie) Classe : • (taxonomie) Genre ; • Espèce de plante ; culture, produit ; matériau ; • Élément. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du suffixe nominal propre -ης / -ēs [[wikt:en:-ης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;"> Astronome grec, connu pour avoir participer à la conception du [[w:Calendrier_julien|''calendrier julien'']] (instauré par Jules César en [[w:Années_46_av._J.-C.|-46]]/[[w:Années_45_av._J.-C.|-45]], lorsqu’il était [[w:Pontifex_maximus|''pontifex maximus'']]), avec une année commune de 365 jours divisée en 12 mois, et un jour intercalaire ajouté tous les 4 ans, lors des années bissextiles.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ier_siècle_av._J.-C.|I<sup>er</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Hésiode_back|<span id="Hésiode"><sup>III</sup></span>]] Du nom propre grec ancien Ἡσῐ́οδος / Hēsíodos;<br /><p style="margin: 0 2em; text-indent: 15px">Poète ''grec'', renommé pour 2 ouvrages :<br /><p style="margin: 0 2em; text-indent: 15px;">• [[w:Théogonie_(Hésiode)|''la Théogonie'']], une généalogie des dieux (dans laquelle il présente la multitude des dieux célébrés par les mythes grecs où trois générations divines se succèdent : celle d’Ouranos, celle de Cronos, celle de Zeus qui sort triomphant) et une cosmogonie (qui retrace la création du monde à partir du Chaos) ;<br /><p style="margin: 0 2em; text-indent: 15px;">• et [[w:Les_Travaux_et_les_Jours|''les Travaux et les Jours'']], un almanac sur l’agriculture à destination de son frère Perses.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup>]] — [[w:VIIe_siècle_av._J.-C.|VII<sup>ème</sup>]] siècles {{Info|AEC|Avant l’Ère Commune}}) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Euctémon_back|<span id="Euctémon"><sup>IV</sup></span>]] Du nom propre grec ancien Ευκτήμων / Euktémōn;<br /><p style="margin: 0 2em; text-indent: 15px;">Astronome ''athénien'', contemporain et collègue de l’astronome [[w:Méton|Méton]], avec qui, il a fait une série d’observations des [[w:Solstice|''solstices'']] afin de déterminer la durée de l’[[w:Année_tropique|''année tropique'']] [https://ecliptiqc.ca/Almageste_Livre3.php#III1 <sup>Ptolémée, Almageste, liv. III, chap. 1</sup>].<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ve_siècle_av._J.-C.|V<sup>ème</sup>]] siècle {{Info|AEC|Avant l’Ère Commune}})'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">Des découvertes astronomiques : part de chaque observateur dans la science.<br /><p style="text-align: justify; text-indent: 15px;">'''LVII.''' D’abord, il est presque impossible de déterminer d’une manière précise le nombre des jours de l’année et le cours du soleil [[#Primum_omnium_dierum_AdG|<span id="Primum_omnium_dierum_AdG_back"><sup>'''1'''</sup></span>]]. Aux trois cent soixante-cinq jours qui composent l’année, on ajoute le quart d’un jour et d’une nuit, pour en faire ensuite un jour intercalaire ; de là il suit qu’on ne saurait indiquer avec précision le moment du lever et du coucher des astres. On convient qu’il y a encore dans cette théorie beaucoup d’obscurité ; en effet, les saisons quelquefois commencent plusieurs jours avant le terme qui leur a été fixé, ce que les ''Grecs'' appellent ''procheimasis'' ; d’autres fois, plusieurs jours après, ce qu’ils appellent ''épicheimasis'' [[#Accedit_confessa_rerum_obscuritas_AdG|<span id="Accedit_confessa_rerum_obscuritas_AdG_back"><sup>'''2'''</sup></span>]]. Presque toujours l’action des astres se fait sentir sur la terre ou plus tôt ou plus tard qu’il ne devrait ; aussi dit-on communément, lorsque le beau temps est revenu, que tel astre a produit son effet. Ces phénomènes dépendent des astres fixés à la voûte des cieux, ainsi que des étoiles, dont les mouvemens particuliers excitent des grêles et des pluies qui sont d’une très-grande conséquence pour les biens de la terre, comme nous l’avons observé, et amènent dans la température des changemens sur lesquels le laboureur ne pouvait compter. Non-seulement les hommes y sont trompés, mais aussi les animaux, bien plus habiles que nous à prévoir ces vicissitudes, puisque d’ailleurs leur vie en dépend ; en effet, on a vu des oiseaux d’été périr par des froids arrivés trop tôt ou trop tard, et des oiseaux d’hiver par des chaleurs également imprévues. Aussi '''Virgile''' veut-il qu’on étudie aussi le cours des ''planètes'', et qu’on observe avec soin le passage du froid ''Saturne'' [[#Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG|<span id="Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG_back"><sup>'''3'''</sup></span>]].<br /><p style="text-align: justify; text-indent: 15px;">Quelques-uns fixent le commencement du printemps à l’apparition des papillons, parce que ces insectes sont fort délicats. Néanmoins on a observé, dans l’année même où j’écris cette partie de mon ouvrage, que le froid, ayant repris trois fois, a fait périr autant de fois les papillons, et que les hirondelles qui, s’étaient montrées dès le 6 des [[w:Calendes|''kalendes'']] de février, et semblaient annoncer le retour du printemps, ont eu à essuyer un rigoureux hiver.<br /><p style="text-align: justify; text-indent: 15px;">C’est donc une science très-problématique que celle de l’influence des astres, et les inductions qu’elle fournit sont fort douteuses [[#Res_anceps_AdG|<span id="Res_anceps_AdG_back"><sup>'''4'''</sup></span>]]. Ce qui augmente la difficulté, c’est la convexité du ciel et la différence des climats de la terre : le même astre se montre ici dans un temps, et là dans un autre ; d’où il suit que son influence ne se fait pas sentir en même temps partout. Pour surcroît d’embarras, les observations recueillies par les auteurs ont été faites dans des lieux différens, et ceux du même pays ne s’accordent pas même entre eux. On compte trois écoles astronomiques, la ''chaldéenne'', l’égyptienne et la ''grecque''. Le dictateur '''César''' en a fondé, chez les ''Romains'', une quatrième, lorsqu’aidé de '''Sosigène''', habile astronome, il fixa la longueur de l’année à une révolution du soleil. On trouva dans la suite que son calendrier était défectueux, parce que l’année, auparavant plus courte, se trouvait alors plus longue que le cours du soleil. Pour y remédier, il fallut, pour douze années consécutives, supprimer les jours intercalaires. '''Sosigène''' lui-même, le mathématicien le plus exact de son temps, après avoir revu jusqu’à trois fois ses calculs, sembla toujours douter de leur justesse, et ne cessa jamais de se corriger lui-même. De tous les auteurs qui ont traité ce sujet, et que nous avons cités au commencement de ce livre, il en est rarement deux qui soient de même avis. Cette divergence d’opinions est moins surprenante et plus excusable chez ceux qui écrivaient en des pays différens. Mais que dire de ceux qui, habitant le même pays, sont néanmoins d’avis différens ? En voici un exemple : '''Hésiode''', qui nous a laissé aussi un ouvrage sur le cours des astres, fixe le coucher matutinal des ''Pléiades'' au moment de l’équinoxe d’automne ; '''Thales''' prétend qu’il n’arrive que vingt-cinq jours après ; '''Anaximandre''' en met vingt-neuf ; '''Euctémon''', quarante-huit.<br /><p style="text-align: justify; text-indent: 15px;">Quant à nous, nous suivrons les calculs de '''César''', qui se rapportent spécialement à l’Italie ; mais nous rapporterons aussi les observations étrangères, car notre plan n’est pas de traiter d’un seul pays, mais de la nature entière. Pour être moins longs, nous citerons les pays, et non les auteurs ; et, pour abréger davantage encore, les lecteurs se souviendront que, sous le nom d’Attique, il faut aussi entendre les ''Cyclades'' ; sous le nom de ''Macédoine'', la ''Magnésie'' et la ''Thrace'' ; sous le nom d’Égypte , la ''Phénicie'', l’île de ''Cypre'' et la ''Cilicie'' ; sous celui de ''Béotie'', la ''Locride'', la ''Phocide'' et les contrées voisines ; sous le nom d’Hellespont, la ''Chersonèse'' et partie du continent jusqu’au mont ''Athos'' ; sous le nom de l’Ionie, l’Asie et les îles ''Asiatiques'' ; sous le nom du ''Péloponnèse'', l’Achaïe et les pays adjacens au couchant ; enfin sous le nom de ''Chaldée'', l’Assyrie et la ''Babylonie''. On ne sera pas étonné que nous ne parlions ni de l’Afrique, ni de l’Espagne, ni des ''Gaules''. Aucun auteur dans ces contrées n’a laissé d’observations sur le lever ou le coucher des astres. Il ne sera pas difficile néanmoins de déterminer l’époque de ces phénomènes dans ces contrées, en étudiant la disposition des cercles, telle que nous l’avons présentée dans le sixième livre. Par ce moyen, on déterminera la position astronomique, non-seulement de chaque pays, mais encore de chaque ville dont nous avons pu parler, en prenant par les ombres égales de tous les cercles, une portion du cercle de telle contrée qu’on voudra choisir, et en calculant son rapport avec le lever des astres. Il faut faire observer encore que tous les quatre ans les chaleurs reviennent à peu près les mêmes pour chaque saison, en raison du mouvement du soleil, et que toutes les huitièmes années elles sont plus fortes, à cause de la centième lunaison.</div> <table cellspacing=15 align=center style="margin: 0 4em; font-size:85%;"> <tr> <td style="text-align: justify; margin: 0 4em;">'''[[#Primum_omnium_dierum_AdG_back|<span id="Primum_omnium_dierum_AdG"><sup>1</sup></span>]] Cf. sur la plupart des difficultés que le texte de notre auteur révèle, les notes relatives à l’astronomie, au livre II. L’année romaine fut d’abord celle des [[w:Albe_la_Longue|''Albains'']], c’est-à-dire lunaire ; dix mois la composaient, mars en était le premier : elle avait cinquante jours de moins que l’année lunaire réelle, et soixante-un de moins que l’année solaire, c’est-à-dire trois cent quatre jours seulement ; c’était là l’[[w:Calendrier_romain|{{Info|''année de Romulus''|le calendrier dit romuléen}}]]. [[w:Calendrier_romain|{{Info|''Numa''|le calendrier dit pompilien}}]] ajouta deux mois à cette année, janvier et février, et elle se trouva être composée de trois cent cinquante-cinq jours. Elle demeura ainsi jusqu’à Jules César, où commence l’[[w:Calendrier_julien|''année julienne'']], qui se compose de trois cent soixante-cinq jours, huit heures, auxquels [[w:Calendrier_grégorien|''Grégoire le Grand'']] ajouta onze minutes, pour arriver à la plus grande exactitude possible.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Accedit_confessa_rerum_obscuritas_AdG_back|<span id="Accedit_confessa_rerum_obscuritas_AdG"><sup>2</sup></span>]] L’entrée du soleil dans tel ou tel signe du zodiaque, son passage à l’équateur, etc., ne sont pas toujours le signal d’un changement dans la température. [[w:Végèce|Végèce]] a parlé des jours prokéimasiques et épikéiniasiques :''' {{Info|''Aut enim circa diem statutum, aut ante, vel postea, tempestates fieri, compertum est : unde præcedentes, ωροϰεἰμασιν : nascentes die solenni, επιϰεἰμασιν : subsequentes, μεταϰεἰμασιν, græco vocabulo nuncuperaverunt''|Car on a constaté que les tempêtes se produisent soit vers le jour fixé, soit avant, soit après : d’où les précédents, ωροϰεἰμασιν : nés le jour solennel, επιϰεἰμασιν : les suivants, μεταϰεἰμασιν, étaient appelés par le mot grec. TdA.}} '''(IV, 40).''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG_back|<span id="Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG"><sup>3</sup></span>]] <p style="margin: 0 6em; text-indent: 0px">'''{{Info|Hoc metuens, cæli menses et sidera serva,<br />Frigida Saturni sese quo stella receptet.|Craignant cela, gardez les lunes et les étoiles du ciel, le froid de Saturne lui-même, où l’étoile les recevra. TdA.}}'''<p style="text-align: right; margin: 0 6em; text-indent: 0px">''Georg.'', I, 335.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Res_anceps_AdG_back|<span id="Res_anceps_AdG"><sup>4</sup></span>]] Voici enfin quelques idées philosophiques qui se trouvent sous la plume de Pline ; malheureusement la cause par laquelle notre auteur explique l’influence des astres est problématique, et montre que les sciences astronomiques des anciens laissaient beaucoup à désirer. Les Grecs croyaient qu’il y avait autant de cieux que de planètes ; le huitième ciel, ou le firmament, était celui dès étoiles fixés.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Occasum_matutinum_Vergiliarum_Hesiodus_AdG_back|<span id="Occasum_matutinum_Vergiliarum_Hesiodus_AdG"><sup>5</sup></span>]] L’ouvrage auquel Pline fait allusion a été mentionné par [[w:Théon_d'Alexandrie|Théon]] qui le nomme Αστριϰὴ βίϐλος [[w:en:Astronomia_(poem)|(en)]]. Cet ouvrage est perdu.'''</td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k5804072n <u>Histoire Naturelle de Pline. Tome Onzième</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f196.item ''Livre XVIII.''], [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f340.item ''chap. LVII.''], traduction nouvelle par M. [[w:Stéphane_Ajasson_de_Grandsagne|Ajasson de Grandsagne]] [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f453.item <sup>NOTES</sup>], C. L. F. Panckoucke, Paris, 1829</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">''Divi[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />ion des jours & des nuits [[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />uivant le cours du Soleil ; lever & coucher des étoiles ; ordre des [[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />ai[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />ons ; tems où l’on [[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />eme les bleds d’hiver.''<br /><p style="text-align: justify; text-indent: 15px;">'''D'''’ABORD il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que impo{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ible de déterminer au ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te le nombre des jours de l’année, & le cours du Soleil ; car comme aux trois cents {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oixante & cinq jours dont l’année e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ée, on ajoute le quart d’un jour & d’une nuit, autrement {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, qui, au bout de quatre ans, font un jour intercalaire [[#jour_intercalaire_LPdS|<span id="jour_intercalaire_LPdS_back"><sup>'''1'''</sup></span>]], il arrive qu’on ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}auroit a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}igner avec certitude le tems du lever & du coucher des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres. En {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econd lieu, l’on convient qu’il y a dans cette théorie beaucoup d’ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}curité ; car quelquefois les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons [[#quelques_les_saisons_LPdS|<span id="quelques_les_saisons_LPdS_back"><sup>'''2'''</sup></span>]] commencent plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs jours avant le terme qui leur a été fixé, ce que les Grecs appellent ''prokheïma{{Info|ſ|forme ancienne longue de la lettre s minuscule}}is'' ; & d’autres fois plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs jours après, ce que ces mêmes Grecs expriment par le mot ''epikheïma{{Info|ſ|forme ancienne longue de la lettre s minuscule}}is'' : & l’on éprouve très {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouvent que l’action des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ait {{Info|ſ|forme ancienne longue de la lettre s minuscule}}entir {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la terre, tantôt plutôt, tantôt plus tard. Au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i dit-on communément, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que le beau tems e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t revenu, que tel a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre a produit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on effet. D’ailleurs comme tout cela dépend des globes céle{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes, leur mouvement relatif excite quelquefois des grêles & des pluies, qui, comme nous l’avons déja [[#déjà_fait_observer_LPdS|<span id="déjà_fait_observer_LPdS_back"><sup>'''3'''</sup></span>]] fait ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erver, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont de la plus grande con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}équence pour les biens de la terre, & qui renver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ent l’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pérance qu’on avoit du beau tems. Et non {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement les hommes y {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont trompés, mais au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i les animaux, quoiqu’ils aient bien plus de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}agacité que nous pour pre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}entir ces vici{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}itudes du ciel, d’autant que leur vie en dépend. En effet, on voit quelquefois les oi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eaux d’été mourir par des froids qui viennent trop tard ou trop tôt, & les oi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eaux d’hiver par des chaleurs qui arrivent de même. C’est pourquoi '''Virgile''' veut qu’on étudie au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i le cours des planetes, & qu’on ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erve à quelle partie du zodiaque répond la planete du froid Saturne [[#Saturne_LPdS|<span id="Saturne_LPdS_back"><sup>'''4'''</sup></span>]]. Quelques-uns croient que le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}igne le plus certain du printems commencé, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’on voit des papillons, & cela parceque ces in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ectes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont fort délicats. Néanmoins on a remarqué que dans l’année même [[#lAnnée_dÉcriture_LPdS|<span id="lAnnée_dÉcriture_LPdS_back"><sup>'''5'''</sup></span>]] où j’écris ceci, le froid ayant recommencé ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’à trois fois, a fait mourir autant de fois les papillons ; & que les hirondelles, qui, s’étant montrées dès le vingt-{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ept de Janvier, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}embloient annoncer le retour du printems, ont en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite e{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}uyé un très cruel hiver.<br /><p style="text-align: justify; text-indent: 15px;">C’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t donc une {{Info|ſ|forme ancienne longue de la lettre s minuscule}}cience très problématique que celle de l’influence des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres, & les inductions que l’on en tire {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont fort douteuses. Mais ce qui cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e le plus d’incertitude, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t cette convexité du ciel & la différence des climats de la terre, parceque le même a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e montre ici dans un tems, & là dans un autre, d’où il ré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ulte que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on influence ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}entir en même tems par-tout. Un autre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urcroît de difficulté, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t que les ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations recueillies par les Auteurs ont été faites en différents lieux, & que ceux même qui ont écrit dans le même endroit ne s’accordent nullement entre eux dans ce qu’ils écrivent. On compte ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’à trois différentes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortes de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ectes en A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomie ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}avoir, celle des Chaldéens [[#secte_des_Chaldéens_LPdS|<span id="secte_des_Chaldéens_LPdS_back"><sup>'''5*'''</sup></span>]], celle des Egyptiens & celle des Grecs. On peut même dire que le Dictateur Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar [[#Dictateur_César_LPdS|<span id="Dictateur_César_LPdS_back"><sup>'''6'''</sup></span>]] en produi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}it, chez les Romains, une quatrieme, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il rédui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}it chaque année au cours du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervant à cet effet du travail de So{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igene, très habile A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronome. Néanmoins on découvrit en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite que le calendrier de Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar étoit défectueux [[#calendrier_César_défectueux_LPdS|<span id="calendrier_César_défectueux_LPdS_back"><sup>'''7'''</sup></span>]], parceque l’année qui auparavant étoit plus courte que le cours du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trouvoit alors plus longue : & pour corriger cette erreur, on ordonna que pendant douze années de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite, il n’y auroit point de jour intercalaire [[#correction_erreur_LPdS|<span id="correction_erreur_LPdS_back"><sup>'''8'''</sup></span>]]. So{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igene lui-même, quoique Mathématicien plus exact que les autres, ne lai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}a pas de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e conduire con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tamment en homme qui doutoit de la ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on propre calcul, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il en fit ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’à trois différentes corrections. De tous les Auteurs [[#Auteurs_calendrier_LPdS|<span id="Auteurs_calendrier_LPdS_back"><sup>'''9'''</sup></span>]] qui ont écrit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur cette matiere, & que nous avons allégués au commencement de ce livre, il s’en trouve rarement deux qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oient de même {{Info|ſ|forme ancienne longue de la lettre s minuscule}}entiment. Cette variété e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t moins {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urprenante, comme au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i plus excu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}able, chez ceux qui écrivoient en des pays différents. Mais que dire de ceux qui, écrivant dans le même pays, n’ont pas lai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é d’être partagés d’opinion ? En voici un exemple. '''Hé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iode''', dont il y a au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i un ouvrage [[#ouvrage_astronomique_Hésiode_LPdS|<span id="ouvrage_astronomique_Hésiode_LPdS_back"><sup>'''10'''</sup></span>]] {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le cours des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres, dit que les Pléiades {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e couchent le matin dans le tems même de l’équinoxe d’automne. '''Thalès''' [[#opinion_Thalès_Hésiode_Anaximandre_LPdS|<span id="opinion_Thalès_Hésiode_Anaximandre_LPdS_back"><sup>'''11'''</sup></span>]] dit que cela arrive vingt-cinq jours après. '''Anaximandre''' en met vingt-neuf ; '''Euctémon''' [[#Euctémon_LPdS|<span id="Euctémon_LPdS_back"><sup>'''12'''</sup></span>]] quarante-huit.<br /><p style="text-align: justify; text-indent: 15px;">Quant à nous, nous {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivrons le calcul de Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, ayant principalement égard à l’Italie. Nous ne lai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}erons néanmoins de rapporter les opinions étrangeres, parceque notre objet n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas de traiter d’un {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eul pays, mais de la Nature entiere. Seulement, pour éviter les longueurs, nous n’indiquerons que les pays où chaque opinion a lieu, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans faire mention des auteurs de ces a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ertions : & pour abréger encore davantage, les Lecteurs voudront bien {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouvenir que quand il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t parlé de l’Attique, il faut, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous ce nom, entendre au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i les Cyclades ; que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de Macédoine, il faut entendre au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i la Magné{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ie & la Thrace ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de l’Egypte, la Phénicie, l’i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}le de Chypre & la Cilicie; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous celui de la Béotie, la Locride, la Phocide & les contrées voi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ines ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de l’Hel le{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pont, la pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}le de Thrace & le pays de terre ferme, ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’au mont Athos ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de l’Ionie, l’A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ie & les i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}les A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iatiques ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom du Péloponne{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e, l’Achaïe & les contrées [[#contrées_adjacentes_ouest_Péloponnese_LPdS|<span id="contrées_adjacentes_ouest_Péloponnese_LPdS_back"><sup>'''13'''</sup></span>]] adjacentes qu’elle a à {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on couchant ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom des Chaldéens, l’Assyrie & la Babylonie. Il ne faudra pas s’étonner {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i je ne parle ici ni de l’Afrique, ni de l’Espagne, ni des Gaules, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que ces pays n’ont eu aucun Auteur qui ait écrit du cours des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres, ni de leur lever. Toutefois il ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}era pas difficile de connoître le tems où ils {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e levent dans ces pays-là même, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’on e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}truit de l’arrangement des cercles céle{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes, tel que nous l’avons expliqué au {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ixieme livre de cet ouvrage ; car, par ce moyen, & par les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eules notions que nous avons expo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ées en donnant une nomenclature des lieux, on {{Info|ſ|forme ancienne longue de la lettre s minuscule}}aura la po{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ition, non {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement de chaque pays, mais encore de chaque ville, en prenant par les ombres égales de tous les cercles, un {{Info|ſ|forme ancienne longue de la lettre s minuscule}}egment du cercle de tel pays qu’on voudra choi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ir, & en cherchant {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on rapport avec le lever des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres. Il faut remarquer au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i que de quatre [[#Columelle_LPdS|<span id="Columelle_LPdS_back"><sup>'''14'''</sup></span>]] en quatre ans les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons & les chaleurs reviennent à peu près les mêmes, & cela à cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e du mouvement du Soleil ; & que de huit en huit ans ces mêmes chaleurs reviennent plus con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}idérables, en vertu de la centieme lunai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on.</div> {{Boîte déroulante début|titre=Notes du traducteur|alignT=center}} <div style="text-align: justify; border: 2px; border-radius:15px; font-size:85%;"><br/> <table cellspacing=15 align=center style="margin: 0 4em;"> <tr> <td style="text-align: justify; margin: 0 4em; text-indent: 15px">'''[[#jour_intercalaire_LPdS_back|<span id="jour_intercalaire_LPdS"><sup>1</sup></span>]] Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur toute cette que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion, nos notes 13 & 14 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le huitieme chapitre du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econd livre de Pline, tome 1, p. 41 & 42 :<br /><p style="text-align: justify; text-indent: 15px; margin: 0 5em;">(13) [[w:Suétone|Suétone]] s’exprime mieux, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il écrit : chaque quatrieme année ''quarto quoque anno''. Il est vrai que, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon le [[w:Jean_Hardouin|Pere Hardouin]], il faut comprendre dans la période de cinq ans, dont parle Pline, la premiere & la cinquieme année comme Bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extiles ; ce qui revient aux quatre années de Suétone, dont la quatrieme avoit un ''bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ex'' ; mais en vérité cette explication est des plus forcées. Je {{Info|ſ|forme ancienne longue de la lettre s minuscule}}erois donc d’avis qu’il faudroit lire dans Pline comme dans Suétone, ''quarto anno'', {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i nous n’apprenions d’ailleurs de cet Hi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}torien, que dès le regne d’Augu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te il s’étoit déja gli{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs abus & altérations dans l’année Julienne. On voit du moins qu’il y réforma plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es, sous prétexte de la remettre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le pied où Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar l’avoit in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tituée. Cela me donneroit à pen{{Info|ſ|forme ancienne longue de la lettre s minuscule}}er qu’on fit dès-lors attention à la fau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eté & à l’excédence du calcul Julien ; mais qu’Augu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te, par respect pour la mémoire de Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, affecta d’imputer la faute à la négligence des Prêtres chargés à Rome de l’in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pection du Calendrier ; qu’au demeurant, on découvrit l’abus, & qu’on e{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}aya d’y remédier, en n’ajoûtant un jour entier à l’année ordinaire que chaque ''cinquieme année'' comme Pline paroît l’articuler ici expre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement. Mais d’ailleurs il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t évident qu’à la longue le période bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extile de quatre années en quatre années prévalut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur celui de chaque cinquieme année, dont parle Pline ; & même il paroît que ceux qui, par la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite, voulurent {{Info|ſ|forme ancienne longue de la lettre s minuscule}}upputer les tems, récapitulerent, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans exception, toutes les bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extiles quartenaires écoulées depuis l’in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titution Julienne ; car en 1582, on trouva par ce moyen que l’année étoit reculée de dix jours & plus; d’autant que l’excédence du calcul Julien, qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uppo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e à l’année révolue 365 jours & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, au lieu de 365 jours 5 heures 49 minutes, 8 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econdes 17 tierces & 13 quarts qu’elle a réellement, forme tous les ans environ 11 minutes de trop, & tous les cent trente-quatre ans un jour entier d’excès. Le Pape Grégoire XIII trouvant donc l’année reculée de plus de dix jours ; ce qui dérangeoit l’économie annuelle des {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olemnités, remédia à cet inconvénient en retranchant de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on autorité dix jours au mois d’Octobre de l’année 1582, où l’on étoit alors ; & en réglant qu’à l’avenir tous les quatre cents ans on omettroit trois années bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extiles. Ce réglement devint une loi pour pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que toute l’Europe chrétienne. L’autre maniere de compter fut appellée l’ancien {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tyle. La Grande-Bretagne a long-tems per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}té à s’en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervir malgré {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on abus manife{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te. Enfin le Parlement d’Angleterre, par acte du mois de Septembre 1752, a adopté la réforme Grégorienne.<br /><p style="text-align: justify; text-indent: 15px; margin: 0 4em;">(14) Le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, en fai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant le tour du cercle oblique, parcourt réellement 360 degrés ou {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ections ; pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que tout cercle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e divi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e en 360 parties appellées degrés : mais la me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ure de chaque degré du cercle parcouru annuellement par le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, excede tant {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit peu, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-à-dire de quelques légeres fractions de tems, la durée de chacun de nos jours révolus ; durée qui n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t, comme on {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ait, que de 24 heures préci{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es ; le{{Info|ſ|forme ancienne longue de la lettre s minuscule}}quelles, comparées à un degré, en produi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ent, au bout de l’année, 365 & plus pour le cercle, au lieu de 360 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement que le cercle requerroit. D’après une connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ance con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}u{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de ces principes, Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e voyant Dictateur, Grand-Pontife, & maître du monde, entreprit, l’an 140 avant J. C. de réformer les abus qui s’étoient gli{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}és, tant dans l’année Pompilienne, ou de Numa, que dans celle des Pontifes, encore plus irréguliere que celle de Numa. A cet effet, il fit venir d’Alexandrie le Philo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ophe So{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igenes. Celui-ci décida fau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement que le cercle des jours de l’année révolue excédoit du nombres 5 joint au quart de 1 les 360 degrés du cercle oblique parcouru par le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil : expo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é faux, auquel le Dictateur, occupé d’autres {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oins, déféra {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans autre examen. Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar régla donc, de l’avis de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronome, que l’année {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit divisée en 365 jours ; & quant au quart de jour re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tant, qui produit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, il ordonna qu’on n’y auroit aucun égard pour chaque année particuliere ; mais que chaque quatrieme année on réuniroit la totalité de quatre fois {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, qui en font vingt-quatre, pour en compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}er un jour entier; & qu’ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i cette quatrieme année auroit 366 jours. Il régla de plus, que ce jour intercalaire, ou ajoûté à chaque quatrieme année, seroit le 24 Février. Les Romains nommoient ce jour-là ''bis {{Info|ſ|forme ancienne longue de la lettre s minuscule}}exto calendas Martii'', c’est-à-dire, le ''{{Info|ſ|forme ancienne longue de la lettre s minuscule}}econd {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ixieme avant les calendes de Mars'' ; d’où il arriva que l’année où tomboit ce jour intercalaire fut appellée bis-{{Info|ſ|forme ancienne longue de la lettre s minuscule}}extile.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#quelques_les_saisons_LPdS_back|<span id="quelques_les_saisons_LPdS"><sup>2</sup></span>]] Végece dit pareillement, liv. 4, chap. 40 : ''Aut enim circa diem {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tatutum, aut ante, vel po{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tea, tempe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tates fieri compertum e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t : unde præcedentes, ωροϰεἰμασιν : na{{Info|ſ|forme ancienne longue de la lettre s minuscule}}centes die {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olenni, επιϰεἰμασιν : {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ub{{Info|ſ|forme ancienne longue de la lettre s minuscule}}equentes, μεταϰεἰμασιν, Græco vocabulo nuncuperaverunt'' [[#Accedit_confessa_rerum_obscuritas_AdG_back|<sup>⤴️</sup>]]. On lit au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i chez [[w:Columelle|Columelle]], dans {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a Préface :''' {{Info|''Neque enim ſemper eumdem, cælum & annus, velut ex præſcripto habitum gerunt : nec omnibus annis eodem vultu venit aſtas, aut hyems, &c.''|Car le ciel et l’année ne portent pas toujours le même habit, comme par un précepte : ni l’automne n’arrive chaque année avec la même apparence, ni l’hiver, etc. TdA}} </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#déjà_fait_observer_LPdS_back|<span id="déjà_fait_observer_LPdS"><sup>3</sup></span>]] Au liv. 17, chap. 2.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Saturne_LPdS_back|<span id="Saturne_LPdS"><sup>4</sup></span>]] Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i qu’il l’in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}inue dans {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es ''Géorg.'' liv. I, v. 335 :'''<br /><p style="margin: 0 6em; text-indent: 0px">{{Info|Hoc metuens, cæli menses et sidera serva,<br />Frigida Saturni sese quo stella receptet.|Craignant cela, gardez les lunes et les étoiles du ciel, le froid de Saturne lui-même, où l’étoile les recevra. TdA.}} </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#lAnnée_dÉcriture_LPdS_back|<span id="lAnnée_dÉcriture_LPdS"><sup>5</sup></span>]] Pline, au quatorzieme livre, chap. 4, comptoit deux cents trente ans depuis la mort de [[w:Cicéron|Cicéron]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cicéron_I|<sup>🔄</sup>]], arrivée l’an de Rome 600. L’année qu’il indique ici, & où il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trouvoit avoir compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é quatre livres de plus, e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t probablement la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivante, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-à-dire l’année 831 de la fondation de Rome.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#secte_des_Chaldéens_LPdS_back|<span id="secte_des_Chaldéens_LPdS"><sup>5*</sup></span>]] Sur l’année Chaldéenne, qui étoit la même que la Judaïque, con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez [[w:Eusèbe_de_Césarée|Eu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ebe]], ''Præpar. Evang.'' liv. 9, chap. 17, où il fait Abraham inventeur de l’a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomie chez les Chaldéens. Les A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trologues Chaldéens étoient ordinairement des Prêtres des Dieux, tels que [[w:Bérose|Béro{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e]], auquel les Athéniens éleverent dans leur Gymna{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e une {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tatue à langue dorée. Sur quoi voyez Pline, liv. 7, chap. 37. Ce Béro{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e étoit un Prêtre de [[w:Bēl|Belus]] ; il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t cité par [[w:Clément_d'Alexandrie|Clément d’Alexandrie]], & par [[w:Flavius_Josèphe|Jo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eph]] [[#Flavius_Josèphe_I|<sup>⤵️</sup>]], contre Apion, liv. 1. Sur l’année Egyptienne, & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’ancienne année Grecque, con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez [[w:Hérodote|Hérodote]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Hérodote_I|<sup>🔄</sup>]] liv. 2, n°. 4. Cicéron rend ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tice à l’étude que firent des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres les Egyptiens & les Babyloniens, liv. 1, de ''Divinat.'' n°. 16 :''' {{Info|''Ægyptii, & Babylonii, in camporum patentium aquoribus habitantes, cùm ex terra nihil emineret, quod contemplationi cæli officere poſſet, omnem curam in ſiderum cognitione poſuerunt''|Les Égyptiens et les Babyloniens, vivant dans les eaux des plaines découvertes, alors que rien ne dépassait de la terre qui pût gêner la contemplation du ciel, mettaient tous leurs soins dans la connaissance des étoiles. TdA}}. </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Dictateur_César_LPdS_back|<span id="Dictateur_César_LPdS"><sup>6</sup></span>]] Voyez les notes 13 & 14 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le chap. 8 du liv. 2, tome 1, p. 41 & 42.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#calendrier_César_défectueux_LPdS_back|<span id="calendrier_César_défectueux_LPdS"><sup>7</sup></span>]] Voyez les notes indiquées dans la note précédente ; & joignez-y les ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivantes, qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont de M. De{{Info|ſ|forme ancienne longue de la lettre s minuscule}}places, p. 339 : « Le calendrier chrétien, ayant {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivi la réformation de Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trouva qu’en l’année 1582, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le Pape Grégoire XIII, l’équinoxe étoit remontée ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’au 11 de Mars, au lieu du 21, où elle devoit être. Ce Pape, après avoir con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ulté Clavius & Ciaconius, les plus habiles A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomes du tems, ordonna qu’en cette même année 1582, on compteroit le 5 du mois d’Octobre, au lieu du 15, afin de retrancher les dix jours qui s’étoient gli{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}és de trop, en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivant la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}upputation Julienne, depuis le Concile de Nicée, tenu en 325 : on convint encore de continuer l’intercalation d’un jour tous les quatre ans ; & qu’en outre, pour éviter dans la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite pareille erreur, il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit fait un retranchement de trois jours intercalaires, dans l’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pace de quatre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}iecles, à cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e des onze minutes qui manquent aux {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures des années, dont on compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e l’année intercalaire, ou bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extile ; ces trois jours {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e retranchent en l’année qui finit les trois premiers {{Info|ſ|forme ancienne longue de la lettre s minuscule}}iecles. De célebres A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomes modernes ont fait voir que, malgré cette précaution, il y auroit encore, au bout de quatre cents ans, plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs jours de variation dans l’équinoxe ».''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#correction_erreur_LPdS_back|<span id="correction_erreur_LPdS"><sup>8</sup></span>]] Etabli par Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, & qui revenoit tous les quatre ans. Ecoutons Suétone, vie de ce Dictateur, chap. 40 : {{Info|''Faſtos correxit, jampridem vitio Pontiſicum, per intercalandi licentiam adeo turbatos, ut neque meſſium feria aſtati, neque vindemiarum autumno competerent, annumque ad curſum ſolis accommodevit, ut CCCLXV dierum eſſet, & intercalario menſe ſublato, unus dies quarto quoque anno intercalaretur, &c''|Il corrigea les jeûnes, qui avaient toujours été une faute pontique, si perturbés par la permission de l’intercalation, que ni les fêtes du mois ne tenaient, ni les récoltes ne correspondaient à l’automne, et il ajusta l’année à la course du soleil, de sorte que c’était 365 jours, et après le mois intercalaire, un jour était intercalé tous les quatre ans, etc. TdA}}. On s’apperçut que cette correction de Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar étoit elle-même fautive. On tenta de nouveau de remédier au vice du calendrier ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur quoi con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez Solin, chapitre 1, p. 5 ; le P. Petau, ''de Doctr. temp.'' chap. 3 ; mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur-tout [[w:Macrobe|Macrobe]], qui s’exprime ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i, liv. 1, ''Saturn.'' chap. 14, p. 255 :''' {{Info|''Sacerdotes ſibi errorem novum ex ipſa emendatione ſecerunt. Nam cùm oporteret diem, qui ex quadrantibus conſit, quarto quoque anno conſecto, antequam quintus inciperet, intercalare, illi quarto non peracto ſed incipiente, intercalabant. Hic error ſex & triginta annis permanſit : quibus annis intercalati ſunt dies duodecim, cùm deberent intercalari novem. Sed hunc quoque errorem ſerò deprehenſum correxit Auguſtus, qui annos duodecim ſine intercalari die tranſigi juſſit : ut illi tres dies, qui per annos triginta & ſex vitio ſacerdotalis ſeſtinationis excreverant, ſequentibus annis duodecim, nullo die intercalato, devorarentur. Poſt hoc unum diem, ſecundùm ordinationem Caſaris, quinto quoque incipiente anno intercalari juſſit : & omnem hunc ordinem area tabula ad aternam cuſtodiam inciſione mandavit.''|Les prêtres retranchèrent une nouvelle erreur de leur correction. Car lorsqu’il fallait intercaler le jour qui est composé de quadrants, la quatrième année consécutive, avant que la cinquième ne commence, on intercalait ceux lorsque la quatrième n’était pas terminée mais commençait. Cette erreur a duré trente-six ans : années au cours desquelles douze jours ont été intercalés, alors qu’il aurait fallu en intercaler neuf. Mais cette erreur fut également détectée par Auguste, qui ordonna que douze années s’écoulèrent sans jour intercalaire : afin que ces trois jours, qui avaient été excrétés pendant les trente-six années du vice sacerdotal de cessation, soient dévorés dans le douze années suivantes, sans jour intercalaire. Après ce jour, selon l’ordonnance de César, il décréta que la cinquième année serait également intercalée : et tout l’ordre fut ordonné d’être gravé par le conseil du domaine pour la garde éternelle. TdA}}. </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Auteurs_calendrier_LPdS_back|<span id="Auteurs_calendrier_LPdS"><sup>9</sup></span>]] Ces Auteurs {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont Hiéron, Philomêtor, Attale, Archelaüs, Xénophon, Magon, Caton, Silanus, Varron, &c. dont Pline a fait mention {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la fin du chapitre 3.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#ouvrage_astronomique_Hésiode_LPdS_back|<span id="ouvrage_astronomique_Hésiode_LPdS"><sup>10</sup></span>]] Nous apprenons de Théon que cet ouvrage {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e nommoit l’A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trique, Ἀςριϰὴ ϐίϐλος. Voyez au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur ce même ouvrage, une Epigramme de [[w:Callimaque_de_Cyr%C3%A8ne|Callimaque]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Callimaque_I_de_Cyrène_II|<sup>🔄</sup>]], citée dans la vie d’Aratus, qui fait partie de l’Uranologie de [[w:Denis_Pétau|Petau]], liv. 2, ''Var. Di{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ert.'' chap. 9, p. 97.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#opinion_Thalès_Hésiode_Anaximandre_LPdS_back|<span id="opinion_Thalès_Hésiode_Anaximandre_LPdS"><sup>11</sup></span>]] Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur cette opinion de Thalès, ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur celles d’Hé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iode & d’Anaximandre, l’Uranologie citée note précédente.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Euctémon_LPdS_back|<span id="Euctémon_LPdS"><sup>12</sup></span>]] ''Euctemon'' ; ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i portent les manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crits, & non pas ''Eudemon''. J’ai traité d’Euctêmon (en Grec Εὐϰτημον) dans les notes alphabétiques du premier livre, & plus récemment dans la note 21 du chapitre précédent.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#contrées_adjacentes_ouest_Péloponnese_LPdS_back|<span id="contrées_adjacentes_ouest_Péloponnese_LPdS"><sup>13</sup></span>]] Telles que l’Elide, l’Arcadie, la Me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}lénie.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Columelle_LPdS_back|<span id="Columelle_LPdS"><sup>14</sup></span>]] Columelle, liv. 3, chap. 6 :''' {{Info|''Quo tempore ſol in eamdem partem ſigniſeri per eoſdem numeros redit, per quos cursus ſui principium cæperat : quem circuitum meatus dierum integrorum mille quadringentorum ſexaginta unius [[w:Apocatastase|ὰ τοκατάςασιν]] vocant ſtudioſi rerum cæleſtium''|A ce moment-là, le soleil revient dans la même direction au moyen des mêmes nombres par lesquels il a commencé sa course : laquelle course de mille quatre cent soixante et un jours entiers est appelée ὰ τοκατάςασιν par ceux qui étudient les choses célestes. TdA}}.</td> </tr> </table><br/><br/></div> {{Boîte déroulante fin}} <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=JeyFTzG771cC&newbks=1&newbks_redir=0&dq=Louis%20Poinsinet%20de%20Sivry%20Pline%20l'ancien&hl=fr&pg=PP9#v=onepage&q&f=true <u>Histoire Naturelle de Pline. Tome Sixieme</u>], [https://books.google.fr/books?id=JeyFTzG771cC&newbks=1&newbks_redir=0&dq=Louis%20Poinsinet%20de%20Sivry%20Pline%20l'ancien&hl=fr&pg=PA257#v=onepage&q&f=true ''Livre Dix-huitieme.''], [https://books.google.fr/books?id=JeyFTzG771cC&newbks=1&newbks_redir=0&dq=Louis%20Poinsinet%20de%20Sivry%20Pline%20l'ancien&hl=fr&pg=PA455#v=onepage&q&f=true ''Diviſion des jours & des nuits ſuivant le cours du Soleil ; lever & coucher des étoiles ; ordre des ſaiſons ; tems où l’on ſeme les bleds d’hiver.''], traduction en françois, avec le texte latin rétabli d’après les meilleures leçons manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crites ; accompagnée de Notes critiques pour l’éclairci{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement du texte, & d’Ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ances des Anciens comparées avec les découvertes des Modernes, par M. [[w:Louis_Poinsinet_de_Sivry|Louis Poinsinet de Sivry]], Chez la veuve Desaint, Paris, 1771</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Flavius_Josèphe|'''Flavius Josèphe''']] [[#Flavius_Josèphe|<span id="Flavius_Josèphe_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:37|37]]/[[w:38|38]], à [[w:Histoire_de_Jérusalem#Période_romaine_et_byzantine_(63_av._J.-C._-_638)|''Jérusalem'']] — vers [[w:100|100]], à [[w:Rome_antique|''Rome'']]) [[w:Ier_siècle|<sup>⏳</sup>]] [[s:Auteur:Flavius_Josèphe|<sup>📚</sup>]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">[[w:historiographe|Historiographe]] ''romain'' [[w:Juifs|''juif'']] d’origine [[w:Judée_(province romaine)|''judéenne'']], il participe activement au début de la ''première guerre judéo-romaine'' en tant que commandant militaire de ''Galilée'' contre les Romains, avant de se rendre à [[w:Vespasien|'''Vespasien''']] [[#Vespasien|<span id="Vespasien_back"><sup>'''II'''</sup></span>]] lors de la prise de la garnison juive de la forteresse de [[w:Jotapata|''Jotapata'']] en juillet 67, et de devenir intermédiaire, interprète et négociateur entre les ''romains'' et les ''Juifs'' lors du siège de ''Jérusalem'' conduit par '''Titus''' [[#Titus_back|<sup>⤴️</sup>]] en 70. Après la fin de la grande révolte ''judéenne'', en 71, il s’établit auprès de son protecteur à ''Rome'' où il obtient la [[w:citoyenneté_romaine|''citoyenneté romaine'']].</div> {{Boîte déroulante début|titre=NdA Flavius Josèphe|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Flavius_Josèphe_back|<span id="Flavius_Josèphe"><sup>I</sup></span>]] De son nom de naissance Joseph ben (fils de) Matthatias, de l’hébreu יוסף בן מתתיהו / Yossef [[wikt:en:יוסף#Hebrew|(en)]] ben [[wikt:en:בן#Noun|(en)]] Matityahou [[wikt:en:מתתיהו#Hebrew|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">• de la troisième personne du singulier [[w:Jussif|''jussive'']], signifiant ainsi « peut-il ajouter », du verbe הוֹסִיף / hosíf [[wikt:en:הוסיף#Hebrew|(en)]], « 1. Ajouter (quelque chose) à (quelque chose d'autre). 2. (littéraire) Continuer (à faire quelque chose). 3. (archaïque) Coordonné avec un autre verbe pour indiquer que l’action de ce verbe "ajoute" d’une manière ou d’une autre. »;<br /><p style="margin: 0 2em; text-indent: 15px;">• du nom commun בֵּן / bén, « 1. Fils. 2. (ne produit plus de mot ou d’expression) Un descendant mâle direct. 3. Un mec, un garçon. 4. (n’est plus productif, état de construction) Possesseur de (connaissance, capacité, etc.). 5. (État construit) Utilisé pour exprimer l’âge d’un homme, d’un garçon ou le référent d’un nom masculin : âge, âgé. »;<br /><p style="margin: 0 2em; text-indent: 15px;">• de la contraction du nom commun מַתָּנַת / mataná [[wikt:en:מתנה#Hebrew|(en)]], « cadeau, présent, don »;<br /><p style="margin: 0 2em; text-indent: 30px;">➥ du verbe נתן / natán [[wikt:en:נתן#Verb|(en)]], « 1. Donner. 2. Autoriser, permettre, laisser. 3. (archaïque) Mettre, placer. 4. (archaïque, hébreu biblique) Se transformer en. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ et du nom propre יהוה / YHWH [[wikt:en:יהוה#Hebrew|(en)]], « (Judaïsme) Tétragramme : mot en quatre lettres hébraïques utilisé comme nom [[wikt:ineffable#Français|''ineffable'']] de Dieu dans la Bible hébraïque, diversement rendu par Yahweh ou Jéhovah. »;<br /><p style="margin: 0 2em; text-indent: 15px;">Son tria nomina à l’obtention de sa ''citoyenneté romaine'' est {{Info|Titus|praenomen, nom individuel du citoyen romain}} {{Info|Flavius|nomen, nom de famille}} {{Info|Josephus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, prenant ainsi le nom de son bienfaiteur :<br /><br /><p style="margin: 0 2em; text-indent: 15px;">[[#Vespasien_back|<span id="Vespasien"><sup>II</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Titus|praenomen, nom individuel du citoyen romain}} {{Info|Flavius|nomen, nom de famille}} {{Info|Vespasianus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}};<br /><p style="margin: 0 2em; text-indent: 15px;">[[w:L%C3%A9gat_(Rome_antique)|''Légat'']] lors de la [[w:Conqu%C3%AAte_romaine_de_la_Grande-Bretagne|''conquête de la Bretagne en 43'']] et lors de la [[w:Premi%C3%A8re_guerre_jud%C3%A9o-romaine|''rébellion juive de 66'']] en [[w:Jud%C3%A9e_(province_romaine)|''Judée'']]. Fin décembre 69, il est couronné empereur par le [[w:S%C3%A9nat_romain|''Sénat'']] après la guerre civile de l’[[w:Ann%C3%A9e_des_quatre_empereurs|''année des quatre empereurs'']], et fonde la dynastie des [[w:Flaviens|''Flaviens'']].<br /><p style="text-align: right; margin: 0 2em;">(17 novembre [[w:9|9]], près de [[w:Reate|''Reate'']] dans la région centrale italienne du [[w:Latium|''Latium'']] — 23/24 juin [[w:79|79]], à la station thermale de [[w:Aquae_Cutiliae|''Aquae Cutiliae'']], à l’est de ''Reate'')<sup>[[w:Ier_siècle|⏳]]</sup><br/><br/></div> ''' {{Boîte déroulante fin}} === [[w:Contre_Apion|Contre Apion]] === <p style="text-align: right;">[[s:Contre_Apion|📚]] {| cellpadding="0" align="{{{align|right}}}" style="margin-left: 2em; width:40%; border-spacing:3px; text-align:center; background-color:#F8F9FA; border:2px solid #C8CCD1" |- | style="border:solid 1px #F8F9FA" | [https://archive.org/details/contreapiontexte0000jose/page/n156/mode/1up {{Info|'''Éditions & Manuscrits'''|Flavius Josèphe Contre Apion, Théodore Reinach & Léon Blum, 1930}}] |- style="font-size:8pt; line-height:10pt; vertical-align:middle" | align="center" | <div style="margin-right: 1em; padding:0 0 4px 0; text-align:justify;">{{{légende| * La traduction ''latine'' a été imprimée dès 1480 à [[w:Vérone#Époque_moderne|''Vérone'']] par '''Pierre Maufer''' [[w:en:Petrus_Maufer|(en)]]. L’édition de cette traduction, due à [[w:Sigismund_Gelenius|'''Sigismond Gelenius''']] (''Paris'', 1535), qui constitue la « [[w:Vulgate|Vulgate]] », présente un texte souvent « amélioré » de façon arbitraire. La seule édition critique est celle de '''Ch. Boysen''' (''Vienne'', 1898) qui fait partie du [[w:Corpus_scriptorum_ecclesiasticorum_latinorum|{{Info|''Corpus scriptorum ecclesiasticorum latinorum''|Le corpus des écrits ecclésiastiques latins}}]]. Elle repose principalement sur les manuscrits L(aurentianus LXVI, 2), B(odleianus Canonicianus 148), R(egius Parisinus 5049) de la I<sup>re</sup> classe, C(heltenhamensis Phillipicus 12311), P(arisinus 1615), Pa(rsinus 5054) de la seconde. * Le texte grec est édité pour la première fois dans l’édition complète de '''Josèphe''' à [[w:Bâle#XVIe_siècle|''Bâle'']], chez [[w:Johann_Froben|''Froben'']], en 1544 par [[w:Arnoldus_Arlenius|'''Arlenius''']] qui a peut-être fait usage du ''Schleusingensis'' (un des fils du Laurentianus), mais a introduit grand nombre de corrections tantôt heureuses, et tantôt arbitraires. Par la suite notre traité n’a guère été imprimé que comme partie intégrante d’éditions complètes des œuvres de '''Josèphe'''. Les plus importantes sont celles de '''E. Bernard''' (1700), de [[w:John_Hudson_(classiciste)|'''Hudson''']] (1720) — le premier qui ait utilisé L —, de [[w:Sigebert_Havercamp|'''Havercamp''']] (1726), simple compilateur, de [[w:Karl_Wilhelm_Dindorf|'''L. Dindorf''']] (1847), de [[w:Immanuel_Bekker|'''Imm. Bekker''']] (1856), tout à fait manquée. L’édition critique de '''Niese''' [[w:en:Benedikt_Niese|(en)]] (1889) est la base de tous les travaux ultérieurs, notamment des éditions de '''Naber''' (1896) et de [[w:Henry_St._John_Thackeray|'''H. St. J. Thackeray''']] (coll. Loeb, 1926 : il n’a encore paru que le ''C. Apion'', la ''Vita'' et le commencement de la ''Guerre'') qui ont pu profiter aussi des conjectures de '''Cobet''', de '''Holwerda''', et de '''Herwerden'''.}}}</div> |} <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Dernière œuvre écrite par '''Flavius Josèphe''', vers [[w:93|93]], dont l’objectif est de répondre aux critiques qu’ont soulevées ses [[w:Antiquit%C3%A9s_juda%C3%AFques|''Antiquités judaïques'']], de défendre l’ancienneté du peuple ''juif'' et du [[w:Judaïsme#Judaïsme_antique|''judaïsme'']] (Livre I) et les accusations d’[[w:Apion_(grammairien)|'''Apion''']] [[#Apion|<span id="Apion_back"><sup>'''I'''</sup></span>]] (Livre II).</div> {{Boîte déroulante début|titre=NdA Apion|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Apion_back|<span id="Apion"><sup>I</sup></span>]] Du nom propre grec ancien [[wikt:Apion#Latin|Ἀπίων / Apíôn]]; <br/><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[w:Grammaticus|''Grammairien'']] [[#grammairien|<span id="grammairien_back"><sup>II</sup></span>]] et [[w:Polygraphe_(auteur)|''polygraphe'']] [[#polygraphe|<span id="Grammairien_back"><sup>III</sup></span>]] ''grec'' d’Alexandrie.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] seconde moitié du [[w:Ier_siècle_av._J.-C.|I<sup>er</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]] — première moitié du [[w:Ier_siècle|I<sup>er</sup> siècle {{Info|EC|de l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#grammairien_back|<span id="grammairien"><sup>II</sup></span>]] Du nom commun latin grammaticus [[wikt:en:grammaticus#Latin|(en)]]; du nom commun grec ancien γραμματικός / grammatikós [[wikt:en:γραμματικός#Noun|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun γρᾰ́μμᾰ / grámma [[wikt:en:γράμμα#Noun|(en)]], « 1. Ce qui est écrit, ce qui est dessiné. 2. Lettre. 3. (au pluriel) Alphabet. 4. Écriture, livre. »;<br /><p style="margin: 0 2em; text-indent: 30px">➥ du verbe γράφω / gráphō [[wikt:en:γράφω#Ancient_Greek|(en)]], « 1. (Homérique) égratigner, couper en dedans. 2. Dessiner, esquisser, peindre. 3. Écrire. 4. Écrire, proposer une loi. 5. ([[w:Diathèse#Moyen|''voix moyenne'']]) : • (''[[w:Réflexivité_(grammaire)|réflexif]] indirect'') Écrire pour soi, noter ; • Accuser, poursuivre. 6. ([[w:Conjugaison_latine|''passif parfait'']]) Être écrit, être sous forme écrite. »;<br /><p style="margin: 0 2em; text-indent: 30px">➥ + du suffixe nominal de résultat‎ -μα / -ma [[wikt:en:-μα#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du suffixe adjectival -ῐκός / -ikós, de ou se rapportant à, de la manière de ; « -ique »;<br /><p style="margin: 0 2em; text-indent: 15px">Enseignant responsable de la deuxième étape du système éducatif traditionnel, après l’apprentissage de l’alphabet, la lecture et l’écriture, et l’initiation au calcul avec un abaque chez un ''magister ludi'' [[w:en:Ludi_magister|(en)]] et avant celle de l’art du discours chez un [[w:Rhétorique#Rhétorique_dans_l'Antiquité_grecque|''rhéteur'']]. Le travail du grammairien était d’enseigner la lecture, l’analyse de textes des poètes antiques tels qu’Homère, Tite-Live et Virgile, et la grammaire [https://archive.wikiwix.com/cache/index2.php?url=http%3A%2F%2Fwww.antiquite.ac-versailles.fr%2Feducatio%2Fedrom2.htm#federation=archive.wikiwix.com&tab=url {{Info|<sup>➕</sup>|« L’école du grammaticus », ac-Versailles}}] [https://philo-lettres.fr/latin/rome_vie-quotidienne/ecole-romaine/ {{Info|<sup>➕➕</sup>|« L’École dans l’antiquité romaine, philo-lettres}}]. <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#polygraphe_back|<span id="polygraphe"><sup>III</sup></span>]] Du nom commun grec ancien [[wikt:polygraphe|πολύγραφος / polýgraphos]], « qui écrit beaucoup de sujets »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ de l’adjectif πολῠ́ς / polús [[wikt:en:πολύς#Ancient_Greek|(en)]], « (de nombre, au pluriel) Beaucoup de : • (avec des noms de multitude) Grand ; • (de quantité, avec des noms de masse) beaucoup de ; • (rare, d'une personne) Grand, puissant ; • (de son) Fort ; • (attributivement, adverbial) Fortement, pleinement ; • (d'espace) Large, grand ; • (de distance) Loin ; • (de temps) Long, en retard. »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du verbe γράφω / gráphō [[wikt:en:γράφω#Ancient_Greek|(en)]], « 1. (Homérique) égratigner, couper en dedans. 2. Dessiner, esquisser, peindre. 3. Écrire. 4. Écrire, proposer une loi. 5. (''voix moyenne'') : • (''réflexif indirect'') Écrire pour soi, noter ; • Accuser, poursuivre. 6. (''passif parfait'') Être écrit, être sous forme écrite. »;<br /><p style="margin: 0 2em; text-indent: 15px;">Le terme semble avoir été employé au cours de l’Antiquité dans un sens différent de celui que nous l’entendons aujourd’hui, pas dans le sens de diversité mais, de façon restreinte, le fait de composer un grand nombre de textes [https://eriac.univ-rouen.fr/la-polygraphie-comme-norme/ {{Info|<sup>➕</sup>|Isabelle Gassino, Université de Rouen et Dimitri Kasprzyk, université de Brest, « Colloque "La polygraphie comme norme" », 16 et 17 novembre 2017.}}].'''<br/><br/></div> {{Boîte déroulante fin}} ==== Livre I ==== ===== <div style="text-align: center;">Chapitre II.</div> ===== <div style="text-align: justify; margin: 0 1em;">Témoignage de '''Thales''' comme : * l’un des premiers ''philosophes grecs'' ayant traité des choses célestes et divines ; * disciple des ''Égyptiens'' et des ''Chaldéens'' (premier témoignage) ; * auteur de court(s)/rare(s) ouvrages (supposément unanimement admis), que les ''Grecs'' considéreraient comme les plus anciens, et douteraient, selon '''Flavius Josèphe''', de leur authenticité.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">qui autem historias apud eos conscribere temptauerunt, id est hi, qui circa '''Cadmum''' ''Milesium'', et '''Acusilaus''' ''Argiuus'' et post hunc quicumque alii fuisse referuntur, paululum tempus ''Persicam'' apud ''Helladium'' militiam praecesserunt. sed etiam eos, qui de caelestibus et diuinis primitus apud ''Graecos philosophati'' sund, id est '''Pherecydem''' ''Syrum'' et '''Pythagoram''' et '''Thaletem''' omnes concorditer confidentur ''Aegyptiorum'' et ''Chaldaeorum'' fuisse discipulos et breuiter conscripsisse quae a ''Graecis'' omnium antiquissima iudicantur ita ut uix ea credant ab illis fuisse conscripta.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[w:Corpus_scriptorum_ecclesiasticorum_latinorum|<u>Corpus scriptorum ecclesiasticorum latinorum</u>]], [https://verlag.oeaw.ac.at/produkt/flavii-iosephi-opera-ex-versione-latina-antiqua-pars-vi-de-iudaeorum-vetustate-sive-contra-apionem-libri-ii/601067?name=flavii-iosephi-opera-ex-versione-latina-antiqua-pars-vi-de-iudaeorum-vetustate-sive-contra-apionem-libri-ii&product_form=5107 <u>Tome XXXVII, Flavius Iosephus, Contra Apionem</u>], ''Livre I'', ''chap. II.'', ''l.13, 14'', p.64, 1898</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">Οἱ μέντοι τὰς ἱστορίας ἐπιχειρήσαντες συγγράφειν παρ' αὐτοῖς, λέγω δὲ τοὺς περὶ '''Κάδμον''' τε τὸν ''Μιλήσιον'' καὶ τὸν ''Ἀργεῖον'' '''Ἀκουσίλαον''' καὶ μετὰ τοῦτον εἴ τινες ἄλλοι λέγονται γενέσθαι, βραχὺ τῆς ''Περσῶν'' ἐπὶ τὴν ''Ἑλλάδα'' στρατείας τῷ χρόνῳ προύλαβον. Ἀλλὰ μὴν καὶ τοὺς περὶ τῶν οὐρανίων τε καὶ θείων πρώτους παρ' ''Ἕλλησι φιλοσοφήσαντας'', οἷον '''Φερεκύδην''' τε τὸν ''Σύριον'' καὶ '''Πυθαγόραν''' καὶ '''Θάλητα''', πάντες συμφώνως ὁμολογοῦσιν ''Αἰγυπτίων'' καὶ ''Χαλδαίων'' γενομένους μαθητὰς ὀλίγα συγγράψαι, καὶ ταῦτα τοῖς ''Ἕλλησιν'' εἶναι δοκεῖ πάντων ἀρχαιότατα καὶ μόλις αὐτὰ πιστεύουσιν ὑπ' ἐκείνων γεγράφθαι.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Flajose/Apion1gr.htm <u>Φλαίίου Ἰωσήπου, περὶ ἀρχαιότητος Ἰουδαίων</u>, ''λόγος α''], ''chap. II.'', ''l.13, 14'', 1898</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">Quant aux Grecs qui ont entrepris d’écrire l’histoire, comme [[w:Cadmos_de_Milet|'''Cadmos''' de ''Milet'']], [[w:Acousilaos|'''Acousilaos''' d’Argos]] et ceux qu’on cite après lui, ils n’ont vécu que peu de temps [[#Cadmos_NdT_LB|<span id="Cadmos_NdT_LB_back"><sup>1</sup></span>]] avant [[w:Guerres_médiques|''l’expédition des Perses contre la Grèce'']]. Mais bien certainement les premiers ''philosophes grecs'' qui aient traité des choses célestes et divines, comme [[w:Phérécyde_de_Syros|'''Phérécyde''' de ''Syros'']] [[#Phérécyde_de_Syros_NdT_LB|<span id="Phérécyde_de_Syros_NdT_LB_back"><sup>2</sup></span>]], '''Pythagore''' et '''Thalès'''[[#Thales_NdT_LB|<span id="Thales_NdT_LB_back"><sup>3</sup></span>]] furent, tout le monde s’accorde là-dessus, les disciples des ''Égyptiens'' et des ''Chaldéens'' avant de composer leurs courts ouvrages, et ces écrits sont aux yeux des ''Grecs'' les plus anciens de tous ; à peine même les croient-ils authentiques.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Cadmos_NdT_LB_back|<span id="Cadmos_NdT_LB"><sup>1.</sup></span>]] En réalité, Cadmos paraît avoir fleuri vers le milieu [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle]] [{{Info|AEC|Avant l’Ère Commune}}].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Phérécyde_de_Syros_NdT_LB_back|<span id="Phérécyde_de_Syros_NdT_LB"><sup>2</sup></span>]] Seul texte qui attribue une origine égyptienne ou chaldéenne aux doctrines de Phérécyde de Syros. Cependant [[w:Theodor_Gomperz|Gompers]], [https://archive.org/details/bub_gb_QrfVAAAAMAAJ/page/n434/mode/1up Griechische Denker, I, 430], identifie ᾿Ογηνός avec l’Ouginna babylonien.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Thales_NdT_LB_back|<span id="Thales_NdT_LB"><sup>3</sup></span>]] On retrouve chez [[w:Apollonios_de_Tyane|Apollonios de Tyane]] ([[w:Jamblique|Jamblique]] [[#Jamblique_back|<sup>⤵️</sup>]], Vit. Pyth. [[#Vie_de_Pythagore_back|<sup>⤵️</sup>]], 12) et [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]] l’idée que Thalès de Milet fut disciple des Égyptiens ; l’adjonction des Chaldéens est propre Josèphe.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/contreapiontexte0000jose/page/n6/mode/1up?view=theater <u>Flavius Josèphe, Contre Apion</u>], ''Livre I'', [https://archive.org/details/contreapiontexte0000jose/page/n49/mode/1up?view=theater&q=Thales ''chap. 2''], traduction du grec ancien par Léon Blum, agrégé des Lettres, professeur au lycée Janson-de-Sailly, texte établi et annotée par [[w:Théodore_Reinach|Théodore Reinach]] Membre de l’[[w:Institut_de_France|Institut]], professeur au Collège de France, 1930<br />(édition bilingue de 1911 également disponible [https://remacle.org/bloodwolf/historiens/Flajose/Apion1.htm ici])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">Quant aux Grecs qui ont entrepris d’écrire l’histoire, comme '''Cadmos''' de ''Milet'', '''Acousilaos''' d’''Argos'' et ceux qu’on nomme après lui, ils n’ont vécu que peu de temps[2] avant l’expédition des ''Perses'' contre la ''Grèce''. [14]. De même, les premiers ''philosophes grecs'' qui aient traité des choses célestes et divines, comme '''Phérécyde''' de ''Syros''[3], '''Pythagore''' et '''Thalès'''[4] furent, tout le monde s’accorde là dessus, les disciples des ''Égyptiens'' et des ''Chaldéens'' avant de composer leurs rares ouvrages, et ces écrits sont aux yeux des ''Grecs'' les plus anciens de tous ; à peine même les croient-ils authentiques.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Cadmos_NdT_LB_back|<span id="Cadmos_NdT_LB"><sup>1.</sup></span>]] En réalité, Cadmos paraît avoir fleuri vers le milieu [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle]] [{{Info|AEC|Avant l’Ère Commune}}].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Phérécyde_de_Syros_NdT_LB_back|<span id="Phérécyde_de_Syros_NdT_LB"><sup>2</sup></span>]] Seul texte qui attribue une origine égyptienne ou chaldéenne aux doctrines de Phérécyde de Syros. Cependant [[w:Theodor_Gomperz|Gompers]], [https://archive.org/details/bub_gb_QrfVAAAAMAAJ/page/n434/mode/1up Griechische Denker, I, 430], identifie ᾿Ογηνός avec l’Ouginna babylonien.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Thales_NdT_LB_back|<span id="Thales_NdT_LB"><sup>3</sup></span>]] On retrouve chez [[w:Apollonios_de_Tyane|Apollonios de Tyane]] ([[w:Jamblique|Jamblique]] [[#Jamblique_back|<sup>⤵️</sup>]], Vit. Pyth. [[#Vie_de_Pythagore_back|<sup>⤵️</sup>]], 12) et [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]] l’idée que Thalès de Milet fut disciple des Égyptiens ; l’adjonction des Chaldéens est propre Josèphe.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Flavius Josèphe, De l’ancienneté du peuple juif (Contre Apion)</u>, ''Livre I'', [[s:Page:Flavius_Josephe_-_Leon_Blum_-_Contre_Apion,_Leroux,_Paris,_1902.djvu/17|''Chap. 2'']], traduction de Léon Blum, agrégé des lettres, professeur au lycée du Havre, sous la direction de [[w:Théodore_Reinach|Théodore Reinach]], 1902.</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Plutarque|'''Plutarque''']] [[#Plutarque|<span id="Plutarque_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:45|45]]'' <sup>[[w:Ier_siècle|⏳]]</sup>'', à [[w:Chéronée|Chéronée]] en [[w:Béotie|Béotie]] — {{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}} [[w:125|125]]'' <sup>[[w:IIe_siècle|⏳]]</sup>)[[s:Auteur:Plutarque|<sup>📚</sup>]] [[Fichier:Plutarch at Delphi.jpg|vignette|<p style="text-align: justify; text-indent: 15px;">Buste probable de Plutarque du [[w:IIe_siècle|II<sup>ème</sup>]] ou [[w:IIIe_siècle|III<sup>ème</sup>]] siècles {{Info|EC|de l’Ère Commune}}, en marbre de [[w:Marbre_de_Paros|''Paros'']].<br /><p style="text-align: justify; text-indent: 15px;">Provenance : découvert lors de fouilles près de l’angle sud-est du [[w:Temple d'Apollon (Delphes)|''temple d’Apollon'']] de [[w:Delphes|''Delphes'']], au côté d'une [[w:Fichier:Plutarch_stele_inscription_100_AD,_AM_of_Delphi_4070060092.jpg|''stèle'']] portant une inscription gravée : ΔΕΛΦΟΙ ΧΑΙΡΩΝΕΥΣΙΝ ΟΜΟΥ ΠΛΟΥΤΑΡΧΟΝ ΕΘΗΚΑΝ ΤΟΙΣ ΑΜΦΙΚΤΥΟΝΩΝ ΔΟΓΜΑΣΙ ΠΕΙΘΟΜΕΝΟΙ — Les ''Delphiens'', avec les ''Chéronéens'', dédièrent ce(tte image de) Plutarque, suivant les préceptes de l’[[w:Amphictyonie|''Amphictyonie'']].<br /><p style="text-align: justify; text-indent: 15px;">Exposition : Salle XIV, [[w:Mus%C3%A9e_arch%C3%A9ologique_de_Delphes|''Musée archéologique de Delphes'']].]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Biographe, philosophe et moraliste grec, auteur d’une œuvre importante, comportant un ensemble varié de traités et de dialogues consacrés à des questions de philosophie morale, mais abordant aussi des sujets littéraires, politiques, scientifiques, religieux.</div> {{Boîte déroulante début|titre=NdA Plutarque|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Plutarque_back|<span id="Plutarque"><sup>I</sup></span>]] Du nom propre grec ancien πλούταρχος / ploútarkhos [[wikt:en:Πλούταρχος#Ancient_Greek|(en)]], « maître des richesses » ; <br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun πλοῦτος / ploûtos [[wikt:en:πλοῦτος#Ancient_Greek|(en)]], « richesses » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun ἀρχός / arkhós, « souverain, chef, prince »)'''<br/><br/></div> {{Boîte déroulante fin}} {{Boîte déroulante début|titre=Remarque|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>''' Dans la ''Vie de [[w:Lycurgue_(législateur)|Lycurgue]]'' et la ''Vie d’Agis et Cléomène'' (''Vies parallèles''), et le traité ''Un philosophe doit surtout converser avec les princes'' (''Œuvres morales''), il est fait mention d’un Thalès : il s’agit de [[w:Thalétas|Thalétas]], aussi appelé Thalès de [[w:Crète|''Crète'']], un musicien et poète, originaire de la cité de [[w:Gortyne|''Gortyne'']] en ''Crète'', et actif à la fin du [[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]] et au début du siècle suivant.'''<br/><br/></div> {{Boîte déroulante fin}} === [[w:Vies_parallèles|Vies parallèles]] [[#Vies_parallèles|<span id="Vies_parallèles_back"><sup>'''I'''</sup></span>]] === <div style="text-align: center; margin: 0 1em;">Recueil de 50 biographies de grands hommes de l’histoire, dont 46 présentées par paires : un ''Grec'' mis en parallèle avec un ''Romain''.</div> {{Boîte déroulante début|titre=NdA Vies parallèles|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Vies_parallèles_back|<span id="Vies_parallèles"><sup>I</sup></span>]] Du grec ancien Βίοι Παράλληλοι / Bíoi Parállêloi'''<br/><br/></div> {{Boîte déroulante fin}} ==== Vie de [[w:Solon|'''Solon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Solon|<sup>🔄</sup>]] ==== <div style="text-align: center; margin: 0 1em;">Biographie de '''Solon''', qui précède celle de [[w:Publius_Valerius_Publicola_(consul_en_-509)|'''Publicola''']] [[#Publicola|<span id="Publicola_back"><sup>'''I'''</sup></span>]], et avec laquelle '''Plutarque''' la compare.</div> {{Boîte déroulante début|titre=NdA Vie de Solon|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Publicola_back|<span id="Publicola"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Publius|praenomen, nom individuel du citoyen romain}} {{Info|Valerius|nomen, nom de famille}} {{Info|Publicola ou Poplicola|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, « celui qui prend soin de l’armée. »[https://academic.oup.com/bics/advance-article/doi/10.1093/bics/qbaf002/8117642?login=false {{Info|<sup>🔍</sup>|M. Gallo, « Misinterpreting a compound name. The origin of the agnomen Publicola in Dionysius of Halicarnassus and Plutarch », Bulletin of the Institute of Classical Studies,‎ 22 avril 2025}}].<br /><p style="margin: 0 2em; text-indent: 15px">[[w:Consul_(Rome_antique)|Consul]] de la [[w:république_romaine|''République Romaine'']], à quatre reprises : en [[w:-509|-509]], [[w:-508|-508]], [[w:-507|-507]] et [[w:-504|-504]], et l’un des instaurateurs légendaires de la ''République Romaine'' en -509, suite au viol et au suicide de [[w:Lucrèce_(dame_romaine)|Lucrèce]], une femme aristocratique ''romaine'', par [[w:Sextus_Tarquin|Sextus Tarquin]], le fils du dernier [[w:Roi_de_Rome|roi de ''Rome'']] [[w:Tarquin_le_Superbe|Tarquin le Superbe]].<br /><p style="text-align: right; margin: 0 2em;">(date et lieu de naissance inconnu.e.s — [[w:-503|-503]], soit sur le champ de bataille pendant les [[w:Guerres_romano-sabelliennes|''guerres romano-sabelliennes'']], soit de maladie)<sup>[[w:VIe_siècle_av._J.-C.|⏳]]</sup> '''<br/><br/></div> {{Boîte déroulante fin}} ===== <div style="text-align: center;">Chapitre II.</div> ===== ====== <div style="text-align: center;">Paragraphe III.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de '''Thalès''' ''commerçant''</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''III.''' Κωλύει δὲ οὐδὲν τὸν ἀγαθὸν καὶ πολιτικὸν ἄνδρα μήτε τῶν περιττῶν τὴν κτῆσιν ἐν σπουδῇ τίθεσθαι μήτε τῆς χρείας τῶν ἀναγκαίων καὶ ἱκανῶν καταφρονεῖν. Ἐν δὲ τοῖς τότε χρόνοις, καθ' Ἡσίοδον, ἔργον οὐδὲν ἦν ὄνειδος, οὐδὲ τέχνη διαφορὰν ἔφερεν, ἐμπορία δὲ καὶ δόξαν εἶχεν οἰκειουμένη τὰ βαρβαρικὰ καὶ προξενοῦσα φιλίας βασιλέων καὶ πραγμάτων ἐμπείρους ποιοῦσα πολλῶν. Ἔνιοι δὲ καὶ πόλεων οἰκισταὶ γεγόνασι μεγάλων, ὡς καὶ Μασσαλίας Πρῶτις ὑπὸ Κελτῶν τῶν περὶ τὸν Ῥοδανὸν ἀγαπηθείς. Καὶ Θαλῆν δέ φασιν ἐμπορίᾳ χρήσασθαι καὶ Ἱπποκράτην τὸν μαθηματικόν, καὶ Πλάτωνι τῆς ἀποδημίας ἐφόδιον ἐλαίου τινὸς ἐν Αἰγύπτῳ διάθεσιν γενέσθαι.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§3'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f16.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''III.''' Mais rien n’empêche l’homme de bien, le citoyen dévoué à son pays, de garder un juste milieu : il peut ne point s’attacher à la poursuite du superflu, sans pour cela mépriser le nécessaire et ce qui suffit à ses besoins.<br />Dans ce temps-là, pour parler comme [[w:Hésiode|'''Hésiode''']] [[#Hésiode|<span id="Hésiode_back"><sup>'''I'''</sup></span>]] [[#Hésiode_NdT_AP|<span id="Hésiode_NdT_AP_back"><sup>1</sup></span>]], il n’y avait pas de travail qui fût honteux; aucun art ne mettait de différence entre les hommes : le négoce surtout était honoré, qui met en possession des avantages dont jouissent les étrangers, gagne l’amitié des rois, et donne une grande expérience. On a même vu des trafiquants fonder de grandes villes : ainsi [[w:Mythe_fondateur_de_Marseille|'''Protis''']] bâtit [[w:Marseille_antique|''Marseille'']], après s'être concilié l’amitié des ''Gaulois'' qui habitent les bords du [[w:Rhône#Histoire|''Rhône'']]. '''Thales''' se livra, dit-on, au négoce, ainsi qu’[[w:Hippocrate_de_Chios|'''Hippocrate''']] [[#Hippocrate|<span id="Hippocrate_back"><sup>'''II'''</sup></span>]] le mathématicien[[#Hippocrate_NdT_AP|<span id="Hippocrate_NdT_AP_back"><sup>2</sup></span>]] ; et [[w:Platon|'''Platon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Platon|<sup>🔄</sup>]] vendit de l’huile en [[w:Basse_Époque|''Égypte'']] , pour fournir aux frais de son voyage.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Hésiode_NdT_AP_back|<span id="Hésiode_NdT_AP"><sup>1.</sup></span>]] Œuvres et Jours, vers 309.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Hippocrate_NdT_AP_back|<span id="Hippocrate_NdT_AP"><sup>2</sup></span>]] Cet Hippocrate n’est point connu d’ailleurs.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§3'', [https://archive.org/details/viesdeshommesill01plut/page/184/mode/1up?view=theater p.184], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Hésiode_back|<span id="Hésiode"><sup>I</sup></span>]] Du nom propre grec ancien Ἡσῐ́οδος / Hēsĭ́odos [[wikt:en:Ἡσίοδος#Ancient_Greek|(en)]].<br /><p style="margin: 0 2em; text-indent: 15px">Berger sur les pentes du Mont [[w:Mont_Hélicon|Hélicon]] et un des plus grands poètes grecs. Il s’agit plus précisément d’un ''aède'' (il « chante » ses vers avec sa lyre) et un ''rhapsode'' (il « coud » des chants entre eux)[https://odysseum.eduscol.education.fr/hesiode-un-des-premiers-poetes-grecs {{Info|<sup>🔍</sup>|Hésiode, un des premiers poètes grecs - Odysseum, la maison numérique des Humanités}}]. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Hippocrate_back|<span id="Hippocrate"><sup>II</sup></span>]] Du nom propre grec ancien Ῐ̔πποκρᾰ́της / Hĭppokrắtēs [[wikt:en:Ἱπποκράτης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun ῐ̔́ππος / hĭ́ppos [[wikt:en:ἵππος#Ancient_Greek|(en)]], « cheval »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ + du nom commun‎ κρᾰ́τος / krắtos [[wikt:en:κράτος#Ancient_Greek|(en)]], « 1. Puissance, force. 2. Acte de force, acte de bravoure. 3. (au pluriel) Actes de violence. 4. Domination, pouvoir. »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du suffixe nominal -ης / -ēs.<br /><p style="margin: 0 2em; text-indent: 15px"> Mathématicien (géomètre) et astronome « para-pythagoricien », dont l’œuvre ne nous est pas parvenue.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] milieu du [[w:Ve_siècle_av._J.-C.|V<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) [https://books.google.fr/books?id=DrvWAAAAMAAJ&newbks=1&newbks_redir=0&lpg=PA764&vq=Hippocrate&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA764#v=onepage&q&f=true {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume III, §151 - Hippocrate de Chios}}]'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: center; margin: 0 2em;">'''II. Dans sa jeunesse il se livre au commerce maritime; la modicité de sa fortune et son goût pour la sagesse l’y décident. Faveur du commerce à cette époque ; grands noms qui l’ont illustré.'''<br /><br /><p style="text-align: justify; text-indent: 15px;">Mais rien n’empêche qu’un homme de bien, un sage politique tienne à cet égard un juste milieu, et que sans rechercher des richesses superflues, il ne méprise pas celles qui sont nécessaires et qui suffisent. Dans ce temps-là, comme dit [[w:Hésiode|'''Hésiode''']], aucun travail n’était regardé comme honteux; aucun art ne mettait de différence entre les hommes. Le commerce maritime surtout était honorable; il ouvrait des communications utiles avec les nations étrangères, procurait des alliances avec les rois, et donnait une grande expérience. On a même vu des commerçants fonder de grandes villes. Ainsi '''Protus''' gagna l’amitié des Gaulois qui habitaient les bords du ''Rhône'', et bâtit ''Marseille''. '''Thalès''' et '''Hippocrate''' le mathématicien firent aussi le commerce ; et '''Platon''' vendit de l’huile en ''Égypte'' pour fournir aux frais de son voyage.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f16.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Mais rien n’empêche l’homme de-bien et l’homme politique ni se mettre en souci (rechercher) l’acquisition des choses superflues, ni mépriser l’usage des choses nécessaires et suffisantes. Or dans les temps d’alors, selon '''Hésiode''', aucun travail n’était sujet-de-honte, ni aucun métier n’apportait de différence entre les citoyens mais même le commerce-maritime avait de la gloire, rendant-amies les nations-barbares, et procurant des amitiés de rois, et faisant les hommes expérimentés d’affaires nombreuses. Et quelques-uns aussi sont devenus fondateurs de grandes villes, comme aussi le '''Protus''' de ''Marseille'' ayant été aimé par les ''Celtes'' ceux autour du ''Rhône''. Et on dit aussi '''Thalès''', avoir fait-usage du commerce-maritime et '''Hippocrate''' le mathématicien, et la vente d'une certaine huile en ''Égypte'' avoir été pour '''Platon''' ressource du voyage.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f16.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ====== <div style="text-align: center;">Paragraphe IV.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la sagesse de '''Thalès''' en ''philosophie naturelle''</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IV.''' Φιλοσοφίας δὲ τοῦ ἠθικοῦ μάλιστα τὸ πολιτικόν, ὥσπερ οἱ πλεῖστοι τῶν σοφῶν, ἠγάπησεν. Ἐν δὲ τοῖς φυσικοῖς ἁπλοῦς ἐστι λίαν καὶ ἀρχαῖος, ὡς δῆλον ἐκ τούτων· [...].<br /><p style="text-indent: 15px">Καὶ ὅλως ἔοικεν ἡ Θάλεω μόνου σοφία τότε περαιτέρω τῆς χρείας ἐξικέσθαι τῇ θεωρίᾳ· τοῖς δὲ ἄλλοις ἀπὸ τῆς πολιτικῆς ἀρετῆς τοὔνομα τῆς σοφίας ὑπῆρξε.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§4'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f20.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IV.''' Il s’attacha, comme presque tous les sages d’alors, à cette partie de la philosophie morale qui traite de la politique. Pour la philosophie naturelle, il en était aux rudiments, et aux notions du vieux temps sans plus; [...].<br /><p style="text-indent: 15px;">Aussi bien n’y eut-il, en somme, que '''Thalès''' dont la science dépassât alors les notions d’un usage vulgaire : tous les autres ne durent qu’à leurs connaissances politiques leur réputation de sagesse.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§4'', [https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">A l’exemple des sages de son temps, il cultiva principalement cette partie de la morale qui traite de la politique. Il n’avait en physique que des connaissances très-superficielles, et en était aux premiers éléments de cette science, [...].<br/><p style="text-indent: 15px">En général '''Thalès''' fut, de tous les sages d’alors, le seul qui porta au delà des besoins de la vie la théorie des sciences ; tous les autres ne durent qu’à leurs connaissances politiques leur réputation de sagesse.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f20.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Mais de la partie morale de la philosophie il embrassa surtout la partie politique, comme la plupart des sages d’alors. Mais dans les sciences physiques il est extrêmement simple (ignorant) et primitif, [...]. Et en-un-mot la science de '''Thalès''' seul paraît s’être avancée alors par la théorie plus loin que le besoin ; et le nom de la science a appartenu aux autres par-suite des qualités politiques.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f21.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ====== <div style="text-align: center;">Paragraphe V.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Version alternative du récit de la coupe de [[w:Bathyclès_de_Magnésie|'''Bathyclès''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Bathyclès_back|<sup>🔄</sup>]] par [[w:Callimaque_de_Cyrène|'''Callimaque''']] de [[w:Cyrène|''Cyrène'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Callimaque_back|<sup>🔄</sup>]].</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''V.''' Γενέσθαι δὲ μετ' ἀλλήλων ἔν τε Δελφοῖς ὁμοῦ λέγονται καὶ πάλιν ἐν Κορίνθῳ, Περιάνδρου σύλλογόν τινα κοινὸν αὐτῶν καὶ συμπόσιον κατασκευάσαντος. Ἔτι δὲ μᾶλλον εἰς ἀξίωμα καὶ δόξαν αὐτοὺς κατέστησεν ἡ τοῦ [[w:τρίπους#Grec_ancien|'''τρίποδος''']] περίοδος καὶ διὰ πάντων ἀνακύκλησις καὶ ἀνθύπειξις μετ' εὐμενείας φιλοτίμου γενομένη. Κῴων γάρ, ὥς φασι, καταγόντων σαγήνην, καὶ ξένων ἐκ Μιλήτου πριαμένων τὸν βόλον οὔπω φανερὸν ὄντα, χρυσοῦς ἐφάνη τρίπους ἑλκόμενος, ὃν λέγουσιν Ἑλένην πλέουσαν ἐκ Τροίας αὐτόθι καθεῖναι χρησμοῦ τινος ἀναμνησθεῖσαν παλαιοῦ. Γενομένης δὲ τοῖς ξένοις πρῶτον ἀντιλογίας πρὸς τοὺς ἁλιέας περὶ τοῦ τρίποδος, εἶτα τῶν πόλεων ἀναδεξαμένων τὴν διαφορὰν ἄχρι πολέμου προελθοῦσαν, ἀνεῖλεν ἀμφοτέροις ἡ Πυθία τῷ σοφωτάτῳ τὸν τρίποδα ἀποδοῦναι. Καὶ πρῶτον μὲν ἀπεστάλη πρὸς Θαλῆν εἰς Μίλητον, ἑκουσίως τῶν Κῴων ἑνὶ δωρουμένων ἐκείνῳ περὶ οὗ πρὸς ἅπαντας ὁμοῦ Μιλησίους ἐπολέμησαν. Θάλεω δὲ Βίαντα σοφώτερον ἀποφαίνοντος αὑτοῦ πρὸς ἐκεῖνον ἧκεν· ἀπ' ἐκείνου δ' αὖθις ἀπεστάλη πρὸς ἄλλον ὡς σοφώτερον. Εἶτα περιϊὼν καὶ ἀναπεμπόμενος οὕτως ἐπὶ Θαλῆν τὸ δεύτερον ἀφίκετο, καὶ τέλος εἰς Θήβας ἐκ Μιλήτου κομισθεὶς τῷ Ἰσμηνίῳ Ἀπόλλωνι καθιερώθη. Θεόφραστος δέ φησι,πρῶτον μὲν εἰς Πριήνην Βίαντι τὸν τρίποδα πεμφθῆναι, δεύτερον δ' εἰς Μίλητον Θαλῇ Βίαντος ἀποπέμψαντος· οὕτω δὲ διὰ πάντων πάλιν εἰς Βίαντα περιελθεῖν, τέλος δὲ εἰς Δελφοὺς ἀποσταλῆναι. Ταῦτα μὲν οὖν ὑπὸ πλειόνων τεθρύληται, πλὴν ὅτι τὸ δῶρον ἀντὶ τοῦ τρίποδος οἱ μὲν φιάλην ὑπὸ Κροίσου πεμφθεῖσαν, οἱ δὲ ποτήριον Βαθυκλέους ἀπολιπόντος εἶναι λέγουσιν.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§5'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f22.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''V.''' On raconte que les sept sages se réunirent une fois à [[w:Delphes|''Delphes'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Delphes_back|<sup>🔄</sup>]], et une autre fois à [[w:Histoire_de_Corinthe_dans_l%27Antiquité|''Corinthe'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Corinthe_back|<sup>🔄</sup>]], où [[w:Périandre|'''Périandre''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Périandre_back|<sup>🔄</sup>]] les avait convoqués pour leur offrir un banquet. Rien ne contribua tant à leur réputation et à leur gloire, que le renvoi qu’ils se firent successivement l’un à l’autre du trépied d’or, et l’honorable humilité avec laquelle ils refusèrent le prix tour à tour. Des hommes de [[w:Kos_(Dodécanèse)#Kos_à_l'époque_hellénistique|''Cos'']] [[#Cos|<span id="Cos_back"><sup>'''I'''</sup></span>]] venaient, dit-on, de jeter leur filet en mer : des étrangers de ''Milet'' achetèrent le coup, avant que les pêcheurs y eussent regardé. Il se trouva, dans le filet, un trépied d’or qu’[[w:Hélène_(mythologie)|'''Hélène''']] [[#Hélène|<span id="Hélène_back"><sup>'''II'''</sup></span>]], à ce qu’on prétend, pour obéir à un ancien oracle, avait jeté dans la mer à son retour de [[w:Troie|''Troie'']] [[#Troie|<span id="Troie_back"><sup>'''III'''</sup></span>]]. Ce fut un sujet de débat, d’abord entre les pêcheurs et les étrangers, ensuite entre les deux villes, qui prirent parti dans la querelle : la guerre allait s’allumer, lorsque la [[w:Pythie|''Pythie'']] [[#Pythie|<span id="Pythie_back"><sup>'''IV'''</sup></span>]], que les deux partis avaient consultée, commanda de donner le trépied au plus sage. On l’envoya d’abord à ''Milet'', pour '''Thalès''', et ceux de ''Cos'' cédèrent sans peine à un seul particulier ce qu’ils allaient disputer par les armes à tous les ''Milésiens'' ensemble. '''Thalès''' déclara que [[w:Bias_de_Priène|'''Bias''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Bias_back|<sup>🔄</sup>]] était plus sage que lui, et le lui fit passer. '''Bias''', avec la même modestie, le fit passer à un autre; et le trépied, après avoir été envoyé successivement à tous les sept, revint une seconde fois à '''Thalès'''. Enfin, il fut transporté de ''Milet'' à [[w:Thèbes_(Grèce)|''Thèbes'']] [[#Thèbes|<span id="Thèbes_back"><sup>'''V'''</sup></span>]], et consacré à Apollon [[w:en:Ismenus|''Isménien'']]. Cependant [[w:Théophaste|'''Théophaste''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Théophaste_back|<sup>🔄</sup>]] dit qu’on envoya le trépied d’abord à '''Bias''', dans ''Priène'' ; que '''Bias''' le fit porter à '''Thalès''' ; qu’après avoir passé alternativement chez tous les sages, il revint à '''Bias''', et qu’il finit par être envoyé à ''Delphes''. Telle est la tradition commune : seulement quelques-uns prétendent qu’il s’agissait de décerner non point un trépied, mais un vase que [[w:Crésus|'''Crésus''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Crésus_back|<sup>🔄</sup>]] avait envoyé ; et, suivant d’autres, c’était une coupe, héritage de '''Bathyclès'''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§5'', [https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Cos_back|<span id="Cos"><sup>I</sup></span>]] Du nom propre grec ancien Κῶς / Kôs [[wikt:en:Κῶς#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">Île grecque l’archipel du [[w:Dodécanèse|''Dodécanèse'']], au Sud-Est de la [[w:Mer_Égée|''mer Égée'']], au large des côtes ''turques''. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Hélène_back|<span id="Hélène"><sup>II</sup></span>]] Du nom propre grec ancien Ἑλένη / Helénē [[wikt:en:Ἑλένη#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">Fille de [[w:Zeus|Zeus]] et de [[w:Léda (mythologie)|Léda]], considérée comme la plus belle femme du monde, uniquement surpassée par la déesse [[w:Aphrodite|Aphrodite]]. Elle est mariée à [[w:Ménélas|Ménélas]], roi de [[w:Sparte|Sparte]], et est enlevée par [[w:Pâris|Pâris]], prince [[w:Troie|''troyen'']] [[#Troie|<sup>'''III'''</sup>]], ce qui déclencha la [[w:guerre de Troie|guerre de Troie]] qui opposa ''Grecs'' et ''Troyens''. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Troie_back|<span id="Troie"><sup>III</sup></span>]] Du nom propre grec ancien Τροίᾱ / Troíā [[wikt:en:Τροία#Ancient_Greek|(en)]] ; [[w:Troie#Toponymie|''toponymie incertaine'']] ;<br /><p style="margin: 0 2em; text-indent: 15px"> Cité semi-légendaire, située sur la colline d’''[[w:site archéologique de Troie|{{lang|tr|Hisarlık}}]]'', à l’entrée de l’''[[w:Hellespont|Hellespont]]'', non loin de la ''[[w:mer Égée|mer Égée]]'', au nord-ouest de la ''péninsule anatolienne'', dans la région ''[[w:Troade|Troade]]'' en ''[[w:Asie Mineure|Asie Mineure]]''.<br /><p style="margin: 0 2em; text-indent: 15px"> Le site a fait l’objet de nombreuses campagnes de fouilles, à la suite de celles entreprises par [[w:Heinrich Schliemann|Heinrich Schliemann]] en 1870, ponctuées par des découvertes fortement médiatisées, qui ont popularisé son identification avec la Troie homérique (qui reste un sujet de débat en l’absence de preuve décisive), le lieu principal des événements du ''[[w:cycle troyen|cycle troyen]]'' rapportés dans les ''[[w:Épopée|poèmes épiques]]'' ''[[w:Homère|homériques]]'' l’''[[w:Iliade|Iliade]]'' et l’''[[w:Odyssée|Odyssée]]''. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Pythie_back|<span id="Pythie"><sup>IV</sup></span>]] Du nom commun grec ancien Πῡθῐ́ᾱ / Pūthĭ́ā,<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom propre Πῡθώ / Pūthṓ, « [[w:Delphes#Histoire_du_site|''Pythô'']], ancien nom de ''Delphes'' » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du suffixe adjectival féminin -ῐος / -ĭos [[wikt:en:-ιος#Ancient_Greek|(en)]], « relatif à, appartenant à (de) ».<br /><p style="margin: 0 2em; text-indent: 15px">[[w:Divination_dans_la_Grèce_antique|''Oracle'']] du [[w:Temple_d%27Apollon_(Delphes)|''temple d’Apollon'']] à ''Delphes''.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:XIVe_siècle_av._J.-C.|XIV<sup>ème</sup>]]/[[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup>]] siècles {{Info|AEC|Avant l’Ère Commune}} — [[w:IVe_siècle_av._J.-C.|IV<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Thèbes_back|<span id="Thèbes"><sup>V</sup></span>]] Du nom propre grec ancien Θῆβαι / Thêbai [[w:Θῆβαι#Ancient_Greek|(en)]], désigne indistinctement la cité ''grecque'' comme [[w:Thèbes_(Égypte)|celle ''égyptienne'']] ; mais leur étymologie diffère : pour celle de la cité grecque, de l’[[w:Ionien-attique|''ionien-attique'']] Θήβη / Thḗbē ; du grec mycénien 𐀳𐀣 / te-qa (/Tʰēgʷā/) ;<br /><p style="margin: 0 2em; text-indent: 15px">Cité grecque de la région de [[w:Béotie#Antiquité|''Béotie'']], au centre de la ''Grèce''.'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">On raconte que les sept sages se trouvèrent un jour ensemble à ''Delphes'', et une autre fois à ''Corinthe'', chez '''Périandre''', qui les avait réunis pour un banquet. Rien ne contribua autant à leur réputation et à leur gloire, que la modestie empressée avec laquelle ils se renvoyèrent l’un à l’autre le trépied d’or. Des ''Milésiens'' qui se trouvaient à l’île de ''Cos'', avaient acheté d’avance de quelques pêcheurs ce que retirerait de l’eau le filet qu’ils allaient y jeter. Quand on l’eut tiré, il s’y trouva un trépied d’or qu’'''Hélène''', à ce qu’on prétend, pour obéir à un oracle, avait jeté dans la mer, à son retour de ''Troie''. Cet incident donna lieu à une vive dispute d’abord entre les pêcheurs et les étrangers, ensuite entre les deux villes, qui prirent parti dans la querelle et étaient près d’en venir aux mains, lorsque la ''Pythie'' consultée leur ordonna de porter ce trépied au plus sage. On l’envoya d’abord à '''Thalès''', et ceux de ''Cos'' cédèrent sans peine à un seul particulier ce qu’ils allaient disputer par les armes à tous les ''Milésiens'' ensemble. '''Thalès''' le renvoya à '''Bias''', qui, disait-il, était plus sage que lui ; '''Bias''', avec la même modestie, le fit passer à un autre ; et après avoir été envoyé successivement à tous les sept, il revint une seconde fois à '''Thalès''' : enfin il fut porté à ''Thèbes'', et consacré à ''Apollon Isménien''. '''Théophraste''' dit qu’on l’envoya d’abord à '''Bias''', qui demeurait à ''Priène'' ; que '''Bias''' le fit porter à '''Thalès''' ; qu’après avoir été envoyé alternativement à tous les sages, il revint à '''Bias''', et qu’enfin il fut porté à ''Delphes''. Telle est la tradition la plus commune sur ce fait ; seulement quelques auteurs disent que ce n’était pas un trépied, mais un vase que '''Crésus''' envoyait à ''Delphes''; suivant d’autres, c’était une coupe que '''Bathyclès''' avait laissée.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f22.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Or ils (les sept sages) sont dits s’être trouvés aussi ensemble les uns avec les autres et à ''Delphes'' et de nouveau à ''Corinthe'', '''Périandre''' ayant préparé une certaine réunion commune d’eux et un banquet. Or le tour du trépied, et sa circulation à travers tous et sa cession se faisant avec une bienveillance pleine-d’émulation mit eux encore davantage en considération et renommée. Car des ''habitants-de-Cos'', comme on dit, jetant le filet, et des hôtes venus de ''Milet'' ayant acheté le coup qui n’était pas encore apparent, un trépied d’-or apparut étant retiré, lequel on dit '''Hélène''' naviguant pour revenir de ''Troie'' avoir jeté là, s’étant souvenue d’un certain oracle ancien. Mais une contestation ayant eu lieu d’abord aux hôtes vis-à-vis des pécheurs au sujet du trépied, ensuite les villes ayant pris-sur-elles le différend qui alla jusqu'à une guerre, la ''Pythie'' répondit aux-uns-et-aux-autres de donner le trépied au plus sage des hommes. Et d’abord il fut envoyé à '''Thalès''' à ''Milet'', les ''habitants-de-Cos'' donnant volontairement à celui-là seul le trépied, au sujet duquel ils avaient fait-la-guerre contre tous les ''Milésiens'' à-la-fois. Mais '''Thalès''' déclarant '''Bias''' plus sage que lui-même, il renvoya vers celui-là. Et de nouveau il fut envoyé par celui-là vers un autre, comme plus sage. Ensuite faisant-le-tour et étant envoyé-successivement ainsi il arriva pour la seconde fois à '''Thalès''' ; et à la fin transporté de ''Milet'' à ''Thèbes'', il fut consacré à ''Apollon Isménien''. Mais '''Théophraste''' dit le trépied avoir été envoyé d’abord à la vérité à ''Priène'' à '''Bias''', mais en-second-lieu à ''Milet'' à '''Thalès''', '''Bias''' l’ayant renvoyé ; et ainsi à travers tous (de l’un à l’autre) être venu-en-faisant-le-tour de nouveau à '''Bias''', et à la fin avoir été envoyé à ''Delphes''. Ces choses donc ont été répandues par plusieurs, excepté qu’ils disent le présent au lieu du trépied les uns être un vase à boire envoyé par '''Crésus''', les autres une coupe. '''Bathyclès''' rayant laissée (laissée par '''Bathyclès'''). </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f23.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Chapitre VI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;"> Récit d’une entrevue de '''Thalès''' avec '''Solon''', de son stoïcisme, de son célibat et de l’adoption du fils de sa sœur, '''Cybistus'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;"> '''VI.''' Ἰδίᾳ δ' Ἀναχάρσεώς τε πρὸς Σόλωνα καὶ πάλιν Θάλεω συνουσίαν τινὰ καὶ λόγους ἀναγράφουσι τοιούτους. [...]<br /><p style="text-indent: 15px"> '''VII.''' Πρὸς Θαλῆν δ' εἰς Μίλητον ἐλθόντα τὸν Σόλωνα θαυμάζειν ὅτι γάμου καὶ παιδοποιΐας τὸ παράπαν ἠμέληκε. Καὶ τὸν Θαλῆν τότε μὲν σιωπῆσαι, διαλιπόντα δ' ὀλίγας ἡμέρας ἄνδρα παρασκευάσαι ξένον, ἀρτίως ἥκειν φάσκοντα δεκαταῖον ἐξ Ἀθηνῶν. Πυθομένου δὲ τοῦ Σόλωνος εἰ δή τι καινὸν ἐν ταῖς Ἀθήναις, δεδιδαγμένον ἃ χρὴ λέγειν τὸν ἄνθρωπον, « οὐδέν,» εἰπεῖν, « ἕτερον, εἰ μὴ νὴ Δία νεανίσκου τινὸς ἦν ἐκφορὰ καὶ προὔπεμπεν ἡ πόλις. Ἦν γὰρ υἱός, ὡς ἔφασαν, ἀνδρὸς ἐνδόξου καὶ πρωτεύοντος ἀρετῇ τῶν πολιτῶν· οὐ παρῆν δέ, ἀλλ' ἀποδημεῖν ἔφασαν αὐτὸν ἤδη πολὺν χρόνον.» « Ὡς δυστυχὴς ἐκεῖνος,» φάναι τὸν Σόλωνα. « Τίνα δὲ ὠνόμαζον αὐτόν;» « ἤκουσα,» φάναι, « τοὔνομα,» τὸν ἄνθρωπον, « ἀλλ' οὐ μνημονεύω· πλὴν ὅτι πολὺς λόγος ἦν αὐτοῦ σοφίας καὶ δικαιοσύνης.» Οὕτω δὴ καθ' ἑκάστην ἀπόκρισιν τῷ φόβῳ προσαγόμενον τὸν Σόλωνα καὶ τέλος ἤδη συντεταραγμένον αὐτὸν ὑποβάλλειν τοὔνομα τῷ ξένῳ, πυνθανόμενον μὴ Σόλωνος ὁ τεθνηκὼς υἱὸς ὠνομάζετο. Φήσαντος δὲ τοῦ ἀνθρώπου, τὸν μὲν ὁρμῆσαι παίειν τὴν κεφαλὴν καὶ τἆλλα ποιεῖν καὶ λέγειν ἃ συμβαίνει τοῖς περιπαθοῦσι, τὸν δὲ Θαλῆν ἐπιλαβόμενον αὐτοῦ καὶ γελάσαντα, « ταῦτά τοι,» φάναι, « ὦ Σόλων, ἐμὲ γάμου καὶ παιδοποιΐας ἀφίστησιν, ἃ καὶ σὲ κατερείπει τὸν ἐρρωμενέστατον. Ἀλλὰ θάρρει τῶν λόγων ἕνεκα τούτων· οὐ γάρ εἰσιν ἀληθεῖς.» ταῦτα μὲν οὖν Ἕρμιππος ἱστορεῖν φησι Πάταικον, ὃς ἔφασκε τὴν Αἰσώπου ψυχὴν ἔχειν.<br /><p style="text-indent: 15px">'''VIII.''' Ἄτοπος δὲ καὶ ἀγεννὴς ὁ τῷ φόβῳ τῆς ἀποβολῆς τὴν κτῆσιν ὧν χρὴ προϊέμενος· οὕτω γὰρ ἄν τις οὐ πλοῦτον, οὐ δόξαν, οὐ σοφίαν ἀγαπήσειε παραγενομένην, δεδιὼς στέρεσθαι. Καὶ γὰρ ἀρετήν, ἧς κτῆμα μεῖζον οὐδὲν οὐδ' ἥδιον, ἐξισταμένην ὑπὸ νόσων καὶ φαρμάκων ὁρῶμεν· αὐτῷ τε '''Θαλῇ''' μὴ γήμαντι πλέον οὐδὲν εἰς ἀφοβίαν, εἰ μὴ καὶ φίλων κτῆσιν ἔφυγε καὶ οἰκείων καὶ πατρίδος. Ἀλλὰ καὶ παῖδα θετὸν ἔσχε ποιησάμενος αὐτὸς τὸν τῆς ἀδελφῆς, ὥς φασι, '''Κύβισθον'''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§§6-8'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f26.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="margin: 0 2em; text-align: justify; direction: ltr;">'''VI.''' '''Solon''' connut [[w:Anacharsis|'''Anacharsis''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Anacharsis_back|<sup>🔄</sup>]] et '''Thalès''', et l’on cite des mots qui s’étaient dits dans leurs entrevues. <br /><p style="text-align: center"> [...]<br /><p style="text-indent: 15px; text-align: justify;">'''Solon''' alla à ''Milet'', pour voir '''Thalès''' : là, il lui témoigna sa surprise dans ce qu’il n’avait jamais voulu se marier et avoir des enfants. '''Thalès''' ne répondit rien sur l’heure; mais, quelques jours après, il fit paraître un étranger, qui disait arriver d’''Athènes'', et qu’il n’en était parti que depuis dix jours. '''Solon''' demanda à cet homme s’il n’y avait rien de nouveau à ''Athènes''. Celui-ci, à qui '''Thalès''' avait fait la leçon, répondit qu’il n’y avait rien de nouveau , sinon la mort d’un jeune homme dont toute la ville menait les funérailles. C’était, en effet, à ce qu’on disait, le fils d’un personnage considérable, d’une vertu éprouvée : le père n’était pas alors à ''Athènes'', et il voyageait depuis longtemps. « L’infortuné père! s’écria '''Solon'''. Mais comment s’appelait-il? — Je l’ai entendu nommer, répondit l’étranger, mais j’ai oublié son nom ; je me souviens seulement qu’on ne parlait que de sa sagesse et de sa justice. » A chacune de ces réponses, '''Solon''' sentait augmenter ses craintes; enfin, ne se possédant plus , il suggéra le nom à l’étranger, et lui demanda si le mort n’était pas le fils de '''Solon'''. « Oui. » répondit l’étranger. A cette parole, '''Solon''' se frappa la tête, et il se mit à faire et à dire tout ce qu’inspire une douleur violente. Alors '''Thalès''' lui prit la main, et lui dit en riant : « Voilà, '''Solon''', ce qui m’éloigne de me marier et d’avoir des enfants. J’ai redouté le coup sous lequel tu fléchis, toi le plus ferme des hommes. Mais rassure-toi; car il n’y a rien de vrai dans tout ce qu’on vient de te dire. » [[w:Hermippe_de_Smyrne|'''Hermippus''']] [[#Hermippe|<span id="Hermippe_back"><sup>'''I'''</sup></span>]] rapporte cette histoire d’après '''Patécus''', celui qui prétendait avoir hérité de l’âme d’[[w:Ésope|'''Ésope''']] [[#Ésope|<span id="Ésope_back"><sup>'''II'''</sup></span>]].<br /><p style="text-indent: 15px">Pourtant il y a faute de sens et de cœur à refuser d’acquérir les choses nécessaires, par la crainte de les perdre. A ce compte, on devra n’aimer ni la richesse, ni la gloire, ni la sagesse, quand on les possède, de peur d’en être privé. En effet, la vertu, le plus grand des biens et le plus doux, nous quitte quelquefois par l’action de certaines maladies ou de certains breuvages. '''Thalès''' lui-même, en ne se mariant point, n’était pas pour cela à l’abri de la crainte, à moins qu’il n'eût renoncé aussi à ses parents, à ses amis, à sa patrie. Mais il n’en était rien : il avait adopté, dit-on, '''Cybisthus''', le fils de sa sœur. </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§6'', [https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Hermippe_back|<span id="Hermippe"><sup>I</sup></span>]] Du nom propre [[w:Nom_théophore|''théophore'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#théophore_back|<sup>🔄</sup>]] grec ancien Ἕρμιππος / Hérmippos [[wikt:en:Ἕρμιππος#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom propre Ἑρμῆς / Hermês [[wikt:en:Ἑρμῆς#Ancient_Greek|(en)]], « Hermès » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun ἵππος / híppos [[wikt:en:ἵππος#Ancient_Greek|(en)]], « cheval » ;<br /><p style="margin: 0 2em; text-indent: 15px">« Péripatéticien » grec, disciple de [[w:Callimaque_de_Cyr%C3%A8ne|Callimaque de ''Cyrène'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Callimaque_back|<sup>🔄</sup>]], auteur de nombreuses biographies toutes perdues, mais listées par plusieurs auteurs.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] seconde moitié du [[w:IIIe_siècle_av._J.-C.|III<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) [https://books.google.fr/books?id=DrvWAAAAMAAJ&newbks=1&newbks_redir=0&lpg=PA497&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA655#v=onepage&q&f=false {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume III, §86 - Hermippe de Smyrne}}] <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Ésope_back|<span id="Ésope"><sup>II</sup></span>]] Du nom propre grec ancien Αἴσωπος / Aísōpos [[wikt:en:Αἴσωπος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun αἶσα / aîsa, « destin »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun ὄψ / óps, « voix »;<br /><br /><p style="margin: 0 2em; text-indent: 15px">Auteur grec de fable.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] seconde moitié du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) [https://books.google.fr/books?id=DrvWAAAAMAAJ&newbks=1&newbks_redir=0&lpg=PA497&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA240#v=onepage&q&f=false {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume III, §60 - Ésope(Αἴσωπος)}}]'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''V.''' Voici les particularités qu’on raconte d’une entrevue de '''Solon''' avec '''Anacharsis''', et d’un entretien qu’il eut avec '''Thalès'''.<br /><p style="text-align: center"> [...]<br /><p style="text-indent: 15px; text-align: justify;">'''VI.''' '''Solon''', étant allé à ''Milet'' pour voir '''Thalès''', lui témoigna sa surprise de ce qu’il n’avait jamais voulu se marier et avoir des enfants. '''Thalès''' ne lui répondit rien dans le moment; mais ayant laissé passer quelques jours, il fit paraître un étranger qui disait arriver d’''Athènes'', d’où il était parti depuis dix jours. '''Solon''' lui demanda s’il n’y avait rien de nouveau, lorsqu’il en était parti. Cet homme, à qui '''Thalès''' avait fait la leçon, lui répondit qu’il n’y avait autre chose que la mort d’un jeune homme dont toute la ville accompagnait le convoi. C’était, disait-on, le fils d’un des premiers et des plus vertueux citoyens, qui n'’était pas alors à ''Athènes'' et qui voyageait depuis longtemps, « Le malheureux père! s’écria Solon. Comment s’appelle-t-il? ― Je l’ai entendu nommer, répondit l’étranger; mais j’ai oublié son nom; je me souviens seulement qu’on ne parlait que de sa sagesse et de sa justice. » A chacune de ces réponses, les craintes de '''Solon''' augmentaient; enfin, troublé, hors de lui-même, il suggéra le nom à l’étranger, et lui demanda si ce jeune homme n’était pas le fils de '''Solon'''. « C’est lui-même, » dit l’autre. A cette parole, '''Solon''', se frappant la tête, se mit à faire et à dire tout ce que la douleur la plus violente peut inspirer. Alors '''Thalès''' l’arrêta et lui dit en souriant : « Voilà, '''Solon''', ce qui m’a éloigné de me marier et d’avoir des enfants; j’ai redouté le coup qui vous accable aujourd’hui, et contre lequel toute votre fermeté est impuissante. Mais rassurez-vous ; il n’y a rien de vrai dans tout ce qu’on vient de vous dire. » '''Hermippus''' rapporte cette histoire d’après le récit qu’en fait '''Patécus''', qui prétendait avoir hérité de l’âme d’'''Ésope'''.<br /><p style="text-indent: 15px; text-align: justify;">'''VII.''' Cependant c’est manquer de sens et de courage que de renoncer à acquérir des choses nécessaires par la crainte de les perdre. A ce compte, il ne faudrait aimer ni la richesse, ni la gloire, ni la sagesse, quand on les possède, de peur d’en être privé. La vertu même, le plus grand et le plus agréable des biens, se perd souvent par l’effet. de quelques maladies ou de certains breuvages. '''Thalès''' lui-même, en ne se mariant point, n’était pas à l’abri de toute crainte, à moins qu’il ne renonçât aussi à ses parents, à ses amis et à sa patrie. Mais au contraire, il avait adopté '''Cybistus''', le fils de sa sœur. </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f26.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''V.''' Mais en particulier on rapporte une certaine entrevue et de tels discours et d’'''Anacharsis''' à '''Solon''' et une-autre-fois de '''Thalès'''.<br /><p style="text-align: center"> [...]<br /><p style="text-indent: 15px; text-align: justify;">'''VI.''' Et on raconte '''Solon''' étant venu vers '''Thalès''' à ''Milet'' s’étonner de ce qu’il avait négligé absolument le mariage et la création-d’enfants. Et '''Thalès''' alors à la vérité s’être tu, mais ayant laissé-d’intervalle peu-de jours, avoir aposté un homme étranger, disant être arrivé récemment parti-depuis-dix-jours d’''Athènes''. Et '''Solon''' s’étant informé si donc il y a quelque chose de nouveau à ''Athènes'', l’homme instruit des choses qu’il faut dire n’avoir dit aucune autre chose, si ce n’est :<br /><p style="text-indent: 15px"> « Par '''Jupiter''', il y avait le convoi d’un certain jeune-homme, et la ville l’accompagnait. Car il était fils, comme on disait, d’un homme illustre et étant-le-premier des citoyens par la vertu; mais il n’était-pas-présent, mais on disait lui être-en-voyage depuis un temps déjà long.<br /><p style="text-align: left; text-indent: 15px">― Combien cet homme-là est malheureux! avoir dit '''Solon'''. Mais quel (comment) appelaient-ils lui ?<br /><p style="text-align: left; text-indent: 15px">― J’ai entendu le nom, avoir dit l’homme (répondit l’étranger), mais je ne me le rappelle pas; excepté qu’un discours fréquent était de la sagesse et de la justice de lui. »<br /><p style="text-indent: 15px">'''Solon''' donc étant-approché ainsi de-la crainte à chaque réponse, et à la fin déjà étant tout-troublé, lui-même avoir suggéré le nom à l’étranger, demandant si le mort n’était pas nommé fils de '''Solon'''. Et l’homme ayant dit-oui, celui-ci ('''Solon''') avoir commencé à frapper sa tête, et à faire et à dire les autres choses, qu’il arrive de faire et de dire à ceux affligés-à-l’excès. Mais '''Thalès''' ayant arrêté lui, et ayant ri, avoir dit :<br /><p style="text-indent: 15px">« Ces choses donc, ô '''Solon''', écartent moi du mariage et de la création-d’enfants, lesquelles abattent même toi le très-fort. Mais aie-confiance quant-à ces discours: car ils ne sont pas vrais. »<br /><p style="text-indent: 15px">'''Hermippe''' donc dit '''Patécus''', qui disait-souvent avoir l’âme d’'''Ésope''', raconter ces choses. <br /><p style="text-indent: 15px">'''VII.''' Or il est absurde et dépourvu de courage celui rejetant par la crainte de la perte l’acquisition des choses qu’il faut; car ainsi quelqu’un n’aimerait pas la richesse, n’aimerait pas la gloire, n’aimerait pas la sagesse étant survenue à lui, craignant (par crainte) d’en être privé. Et en effet nous voyons la vertu, au prix de laquelle aucune possession n’est plus grande, ni plus agréable, déplacée (chassée) par des maladies et des breuvages; et rien de plus n’être pour l’exemption-de-crainte à '''Thalès''' lui-même ne s’étant pas marié, s’il n’avait pas évité la possession et d’amis et de parents et de patrie. Mais même il eut un fils adoptif se l’étant fait tel lui-même, celui de sa sœur, comme on dit '''Cybisthe'''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f27.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ====== <div style="text-align: center;">Paragraphe XV.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;"> Testament d’inhumation de '''Thalès'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''XV.''' Καὶ φόβοι τινὲς ἐκ δεισιδαιμονίας ἅμα καὶ φάσματα κατεῖχε τὴν πόλιν, οἵ τε μάντεις ἄγη καὶ μιασμοὺς δεομένους καθαρμῶν προφαίνεσθαι διὰ τῶν ἱερῶν ἠγόρευον. Οὕτω δὴ μετάπεμπτος αὐτοῖς ἧκεν ἐκ Κρήτης Ἐπιμενίδης ὁ Φαίστιος, ὃν ἕβδομον ἐν τοῖς σοφοῖς καταριθμοῦσιν ἔνιοι τῶν οὐ προσιεμένων τὸν Περίανδρον. Ἐδόκει δέ τις εἶναι θεοφιλὴς καὶ σοφὸς περὶ τὰ θεῖα τὴν ἐνθουσιαστικὴν καὶ τελεστικὴν σοφίαν, διὸ καὶ παῖδα νύμφης ὄνομα Βάλτης καὶ Κούρητα νέον αὐτὸν οἱ τότε ἄνθρωποι προσηγόρευον. <br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Τὸ δὲ μέγιστον, ἱλασμοῖς τισι καὶ καθαρμοῖς καὶ ἱδρύσεσι κατοργιάσας καὶ καθοσιώσας τὴν πόλιν ὑπήκοον τοῦ δικαίου καὶ μᾶλλον εὐπειθῆ πρὸς ὁμόνοιαν κατέστησε. Λέγεται δὲ τὴν Μουνυχίαν ἰδὼν καὶ καταμαθὼν πολὺν χρόνον, εἰπεῖν πρὸς τοὺς παρόντας ὡς τυφλόν ἐστι τοῦ μέλλοντος ἄνθρωπος· ἐκφαγεῖν γὰρ ἂν Ἀθηναίους τοῖς αὑτῶν ὀδοῦσιν, εἰ προῄδεσαν ὅσα τὴν πόλιν ἀνιάσει τὸ χωρίον· ὅμοιον δέ τι καὶ Θαλῆν εἰκάσαι λέγουσι· κελεῦσαι γὰρ αὐτὸν ἔν τινι τόπῳ τῆς Μιλησίας φαύλῳ καὶ παρορωμένῳ τελευτήσαντα θεῖναι, προειπὼν ὡς ἀγορά ποτε τοῦτο Μιλησίων ἔσται τὸ χωρίον. Ἐπιμενίδης μὲν οὖν μάλιστα θαυμασθείς, καὶ χρήματα διδόντων πολλὰ καὶ τιμὰς μεγάλας τῶν Ἀθηναίων, οὐδὲν ἢ θαλλὸν ἀπὸ τῆς ἱερᾶς ἐλαίας αἰτησάμενος καὶ λαβὼν ἀπῆλθεν. </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§15'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f26.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="margin: 0 2em; text-align: justify; direction: ltr;">'''XV.''' Au chagrin que ces pertes causèrent à ceux-ci [les ''Athéniens''], se joignirent des craintes superstitieuses dont la ville [''Athènes''] fut frappée, et qui venaient d’apparitions de spectres et de fantômes. Les devins déclarèrent aussi que l’état des victimes qu’ils avaient offertes annonçait des crimes et des profanations qu’il fallait expier. On fit donc venir de ''Crète'' [[w:Épiménide|'''Épiménide''']] [[#Épiménide|<span id="Épiménide_back"><sup>'''I'''</sup></span>]] le [[w:Phaistos|''Phestien'']] [[#Phaistos|<span id="Phaistos_back"><sup>'''II'''</sup></span>]], qui est mis au nombre des sept sages par ceux qui n’y comptent pas '''Périandre'''. Il passait pour un homme chéri des dieux, doué d’une grande sagesse, fort instruit des choses divines, surtout versé dans la science des inspirations et dans la connaissance des mystères; on l’appelait, même de son vivant, le nouveau [[w:Curètes|'''Curète''']], le fils de la nymphe '''Balté'''.<br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Mais ce qui était plus important, il fit un grand nombre d’expiations et de sacrifices, il fonda plusieurs temples; et par ces différentes cérémonies il purifia entièrement la ville, en bannit l’impiété et l’injustice, et la rendit plus soumise, plus disposée à l’union et à la paix. On rapporte aussi que lorsqu’il vit le fort de [[w:Munichie|''Munychium'']] [[#Munichie|<span id="Munichie_back"><sup>'''III'''</sup></span>]], il le considéra longtemps, et dit à ceux qui l’accompagnaient : Que les hommes sont aveugles sur l’avenir ! Si les ''Athéniens'' pouvaient prévoir tous les maux que ce lieu doit un jour causer à leur ville, ils l’emporteraient à belles dents ». '''Thalès''' eut aussi, dit-on, un pressentiment à peu près semblable. Il ordonna qu’on l’enterrât dans le lieu le plus sauvage et le plus désert du territoire de ''Milet''; et il prédit aux ''Milésiens'' qu’un jour leur marché public y serait transporté. Les ''Athéniens'', pleins de reconnaissance et d’admiration pour '''Épiménide''', voulurent le combler d’honneurs et de présents; mais il ne demanda qu’une branche de l’olivier sacré, qui lui fut accordée, et il s’en retourna en ''Crète''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§15'',[https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Épiménide_back|<span id="Épiménide"><sup>I</sup></span>]] Du nom propre grec ancien Ἐπιμενίδης / Epimenídēs [[wikt:en:Ἐπιμενίδης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Poète, philosophe et [[w:Iatromante|''iatromante'']] crétois.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] milieu du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Phaistos_back|<span id="Phaistos"><sup>II</sup></span>]] Du nom propre grec ancien Φαιστός / Phaistós [[wikt:en:Φαιστός#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Ancienne ville du Sud de la [[w:Histoire_de_la_Crète#Antiquité|''Crète'']].<br /><br /><p style="margin: 0 2em; text-indent: 15px">[[#Munichie_back|<span id="Munichie"><sup>III</sup></span>]] Du nom propre grec ancien Μουνιχία / Mounikhia [[wikt:en:Μουνυχία#Grec_ancien|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">Nom d’une colline du [[w:Le_Pirée|''Pirée'']] et de l’[[w:Port_de_Munichie|un des ports du ''Pirée'']].'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''XII.''' Au chagrin que ces pertes causèrent à ceux-ci, se joignirent des craintes superstitieuses dont la ville fut frappée, et qui venaient d’apparitions de spectres et de fantômes. Les devins déclarèrent aussi que l’état des victimes annonçait des crimes et des profanations qu’il fallait expier. On fit donc venir de ''Crète'' '''Épiménide''' le ''Phestien'' qui est mis au nombre des sept sages par ceux qui n’y comptent pas '''Périandre'''. Il passait pour un homme chéri des dieux, doué d’une grande sagesse, fort instruit des choses divines, surtout versé dans la science des inspirations et dans la connaissance des mystères; on l’appelait, même de son vivant, le nouveau '''Curète''', le fils de la nymphe '''Balté'''.<br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Mais ce qui était plus important, il fit un grand nombre d’expiations et de sacrifices; il fonda plusieurs temples; et par ces différentes cérémonies, il purifia entièrement la ville, en bannit l’impiété et l’injustice, et la rendit plus soumise, plus disposée à l’union et à la paix. On rapporte aussi que lorsqu’il vit ''Munychie'', il la considéra longtemps, et dit à ceux qui l’accompagnaient :<br /><p style="text-align: justify; text-indent: 15px"> « Que les hommes sont aveugles sur l’avenir! Si les ''Athéniens'' pouvaient prévoir tous les maux que ce lieu doit un jour causer à leur ville, il l’emporteraient à belles dents. »<br /><p style="text-align: justify; text-indent: 15px"> '''Thalès''' eut aussi, dit-on, un pressentiment à peu près semblable. Il ordonna qu’on l’enterrât dans le lieu le plus sauvage et le plus désert du territoire de ''Milet''; et il prédit aux ''Milésiens'' qu’un jour leur marché public y serait transporté. Les ''Athéniens'', pleins de reconnaissance et d’admiration pour '''Épiménide''', voulurent le combler d’honneurs et de présents; mais il ne demanda qu’une branche de l’olivier sacré, qui lui fut accordée, et il s’en retourna en ''Crète''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f58.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Et certaines craintes nées de la superstition en-même-temps aussi des apparitions occupaient la ville; et les devins disaient des impiétés et des souillures ayant-besoin de purifications être indiquées par les victimes. Et ainsi vint à eux mandé (ils firent venir) de ''Crète'' '''Épiménide''' le ''Phestien'', que quelques-uns de ceux n’admettant pas '''Périandre''' comptent le septième parmi les sages. Or il avait-la-réputation d’être un homme ami-des-dieux, et habile dans la science de-l’inspiration et des-mystères. C’est-pourquoi les hommes d’alors appelaient lui et fils de la nymphe de nom (nommée) '''Balté''', et nouveau '''Curète'''.<br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Mais le plus grand (le plus important), ayant initié-aux-mystères et ayant purifié la ville par certaines expiations et purifications et fondations, il la rendit prêtant-l’oreille à la justice et plus obéissante pour la concorde. Et il est dit, ayant vu ''Munychie'' et l’ayant examinée un temps long, avoir dit à ceux présents, que l’homme est un être aveugle sur l’avenir ; car les ''Athéniens'' avoir dû manger ''Munychie'' avec les dents d’eux-mêmes, s’ils avaient prévu en combien de choses cette place affligera la ville. Et on dit aussi '''Thalès''' avoir conjecturé quelque chose de semblable; lui avoir ordonné en effet de placer lui ayant cessé de vivre dans un certain lieu de la ''Milésie'' méprisé et dédaigné, ayant prédit que cet endroit sera (serait) un jour le marché des ''Milésiens''. '''Épiménide''' donc ayant été admiré très-grandement, et les ''Athéniens'' lui donnant des sommes nombreuses et des honneurs grands, n’ayant demandé rien qu’un rameau détaché de l’olivier sacré et l’ayant pris (reçu) s’en alla.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f59.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">═✳═</div> === [[w:Œuvres_morales|Œuvres morales]] === <div style="text-align: center; margin: 0 1em;">Ensemble de 78 textes de traitant de sujets extrêmement variés (religieux, éthiques, politiques, philosophiques, littéraires, historiques), et s'inscrivant dans des genres littéraires également divers (traité, différentes sortes de dialogues, lettres, réponses à des Questions ([[wikt:ζήτημα#Grec_ancien|''zetemata'']]), « dits » ([[w:Apophtegme|''apophtegmes'']])).</div> ==== Le Banquet des Sept Sages ==== <div style="text-align: center; margin: 0 1em;">Dialogue faisant intervenir 20 personnages, dont une liste des sept sages : '''Thalès''', [[w:Solon|'''Solon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Solon_back|<sup>🔄</sup>]], [[w:Bias_de_Priène|'''Bias''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Bias_back|<sup>🔄</sup>]], [[w:Chilon|'''Chilon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Chilon_back|<sup>🔄</sup>]], [[w:Cléobule|'''Cléobule''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cléobule_back|<sup>🔄</sup>]], [[w:Pittacos_de_Mytil%C3%A8ne|'''Pittacos''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Pittacos_back|<sup>🔄</sup>]], [[w:Périandre|'''Périandre''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Périandre_back|<sup>🔄</sup>]].<br />À ceux-ci se rajoutent : [[w:Anacharsis|'''Anacharsis''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Anacharsis_back|<sup>🔄</sup>]], '''Ésope''', '''Dioclès''', '''Nicarque''', [[w:Cléobuline|'''Cléobuline''']] [[#Cléobuline|<span id="Cléobuline_back"><sup>'''I'''</sup></span>]], '''Mélissa''', '''Niloxène''', '''Alexidème''', '''Ardalus''', '''Cléodème''', '''Mnésiphile''', '''Chersias''', [[w:Gorgias|'''Gorgias''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Gorgias_back|<sup>🔄</sup>]].</div> {{Boîte déroulante début|titre=NdA Le Banquet des Septs Sages|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Cléobuline_back|<span id="Cléobuline"><sup>I</sup></span>]] Du nom propre grec ancien Κλεοβουλίνη / Kleoboulinè ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ de Κλεόβουλος / Kleóboulos [[wikt:en:Κλεόβουλος#Ancient_Greek|(en)]], « Cléobule, le père de Cléobuline » <br /><p style="margin: 0 2em; text-indent: 15px">➥ du suffixe adjectival féminin -ῑ́νη / -ī́nē [[wikt:en:-ίνη#Ancient_Greek|(en)]], relatif à la matière, au temps, etc. : « fait de, pendant la durée de » ;<br /><p style="margin: 0 2em; text-indent: 15px">Philosophe et poétesse grecque, célèbre pour ses énigmes, fille du [[w:Tyran|''tyran'']] Cléobule, qui la surnommerait Εὔμητις / Eúmētis, « la Prudente » selon Plutarque. '''<br/><br/></div> {{Boîte déroulante fin}} ===== <div style="text-align: center;">Paragraphe I.</div> ===== :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§1. Ἦ που προϊὼν ὁ χρόνος, ὦ '''Νίκαρχε''', πολὺ σκότος ἐπάξει τοῖς πράγμασι καὶ πᾶσαν ἀσάφειαν, εἰ νῦν ἐπὶ προσφάτοις οὕτω καὶ νεαροῖς λόγοι ψευδεῖς συντεθέντες ἔχουσι πίστιν. οὔτε γὰρ μόνων, ὡς ὑμεῖς ἀκηκόατε, τῶν ἑπτὰ γέγονε τὸ συμπόσιον, ἀλλὰ πλειόνων ἢ δὶς τοσούτων (ἐν οἷς καὶ αὐτὸς ἤμην, συνήθης μὲν ὢν '''Περιάνδρῳ''' διὰ τὴν τέχνην, ξένος δὲ '''Θάλεω'''· παρ´ ἐμοὶ γὰρ κατέλυσεν ὁ ἀνὴρ '''Περιάνδρου''' κελεύσαντος), οὔτε τοὺς λόγους ὀρθῶς ἀπεμνημόνευσεν ὅστις ἦν ὑμῖν ὁ διηγούμενος· ἦν δ´ ὡς ἔοικεν οὐδεὶς τῶν παραγεγονότων. ἀλλ´ ἐπεὶ σχολή τε πάρεστι πολλὴ καὶ τὸ γῆρας οὐκ ἀξιόπιστον ἐγγυήσασθαι τὴν ἀναβολὴν τοῦ λόγου, προθυμουμένοις ὑμῖν ἀπ´ ἀρχῆς ἅπαντα διηγήσομαι. </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §1'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§1. '''D<span style ="font-size:85%;">IOCLÈS</span>'''. Certainement le long cours des âges, mon cher '''Nicarque''', jettera sur les faits d’épaisses ténèbres et une complète incertitude, puisque dès aujourd’hui, à propos de choses si récentes et si nouvelles, des relations mensongères et controuvées obtiennent crédit. Car d’abord le banquet en question ne se composait pas seulement des sept sages, comme vous autres l’avez ouï dire. Les convives étaient plus du double de ce nombre. J’en faisais moi-même partie, comme familier de '''Périandre''' en raison de notre profession commune, et comme hôte de '''Thalès''' : ce dernier était en effet descendu chez moi sur la recommandation de '''Périandre'''. Ensuite, on ne vous en a pas rapporté fidèlement les entretiens lorsqu’on vous a fait ce récit. Il faut que celui de qui vous le tenez n’ait pas été un des convives. Mais puisque nous avons un ample loisir et que la vieillesse est un garant trop peu sûr pour nous autoriser à remettre cet entretien, je vais, suivant votre désir unanime, vous en raconter tous les détails à partir du commencement. </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §1'', traduction par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870<br/>(également disponible [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_1,_1870.djvu/424|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''D<span style ="font-size:85%;">IOCLÈS</span>'''. Quelle incertitude et quelle obscurité la succession des temps ne doit-elle pas répandre sur l’histoire, mon cher '''Nicarque''', puisque, dans des faits récents, et qui se sont passés presque sous nos yeux, le faux prend la place du vrai ? Ce banquet n’était pas, comme on vous l’a dit, composé seulement des sept sages ; les convives étaient plus du double de ce nombre. J’y assistai moi-même, et comme ami de '''Périandre''', avec qui ma profession ma lié depuis longtemps [[#Dioclès_NdT_DR|<span id="Dioclès_NdT_DR_back"><sup>1</sup></span>]], et comme hôte de '''Thalès''', à qui '''Périandre''' avait fait marquer son logement chez moi. Celui qui vous a fait le récit de ce qui s’y est passé n’en était sûrement pas, et vous a trompé sur presque tous les points. Mais, puisque nous en avons le loisir, et que notre âge avancé ne nous permet guère de différer, je vais vous satisfaire et vous en raconter tous les détails.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Dioclès_NdT_DR_back|<span id="Dioclès_NdT_DR"><sup>1.</sup></span>]] Dioclès était devin.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe II.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la simplicité de '''Thalès''', de sa mesure de la pyramide d’''Égypte'', et de son aversion des [[w:Tyran|''tyrans'']] et des rois.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§2. Παρεσκευάκει μὲν γὰρ οὐκ ἐν τῇ πόλει τὴν ὑποδοχὴν ὁ Περίανδρος, ἀλλ´ ἐν τῷ περὶ τὸ Λέχαιον ἑστιατορίῳ παρὰ τὸ τῆς Ἀφροδίτης ἱερόν, ἧς ἦν καὶ ἡ θυσία. μετὰ γὰρ τὸν ἔρωτα τῆς μητρὸς αὐτοῦ προεμένης τὸν βίον ἑκουσίως οὐ τεθυκὼς τῇ Ἀφροδίτῃ, τότε πρῶτον ἔκ τινων ἐνυπνίων τῆς Μελίσσης ὥρμησε τιμᾶν καὶ θεραπεύειν τὴν θεόν. Τῶν δὲ κεκλημένων ἑκάστῳ συνωρὶς ἱκανῶς κεκοσμημένη προσήχθη· καὶ γὰρ ὥρα θέρους ἦν, καὶ τὴν ὁδὸν ἅπασαν ὑπὸ πλήθους ἁμαξῶν καὶ ἀνθρώπων ἄχρι θαλάττης κονιορτὸς καὶ θόρυβος κατεῖχεν. ὁ μέντοι Θαλῆς τὸ ζεῦγος ἐπὶ ταῖς θύραις ἰδὼν καὶ μειδιάσας ἀφῆκεν. ἐβαδίζομεν οὖν ἐκτραπόμενοι διὰ τῶν χωρίων, καθ´ ἡσυχίαν, καὶ μεθ´ ἡμῶν τρίτος ὁ Ναυκρατίτης Νειλόξενος, ἀνὴρ ἐπιεικὴς καὶ τοῖς περὶ Σόλωνα καὶ Θαλῆν γεγονὼς ἐν Αἰγύπτῳ συνήθης. ἐτύγχανε δὲ πρὸς Βίαντα πάλιν ἀπεσταλμένος· ὧν δὲ χάριν οὐδ´ αὐτὸς ᾔδει, πλὴν ὑπενόει πρόβλημα δεύτερον αὐτῷ κομίζειν ἐν βιβλίῳ κατασεσημασμένον· εἴρητο γάρ, εἰ Βίας ἀπαγορεύσειεν, ἐπιδεῖξαι τοῖς σοφωτάτοις Ἑλλήνων τὸ βιβλίον. « Ἕρμαιον » ὁ Νειλόξενος ἔφη « μοι γέγονεν ἐνταῦθα λαβεῖν ἅπαντας ὑμᾶς, καὶ κομίζω τὸ βιβλίον ὡς ὁρᾷς ἐπὶ τὸ δεῖπνον. » ἅμα δ´ ἡμῖν ἐπεδείκνυε. Καὶ ὁ Θαλῆς γελάσας « εἴ τι κακόν, » εἶπεν, « αὖθις εἰς Πριήνην· διαλύσει γὰρ ὁ Βίας, ὡς διέλυσεν αὐτὸς τὸ πρῶτον. » « Τί δ´ ἦν, » ἔφην ἐγώ, « τὸ πρῶτον; » « Ἱερεῖον, » εἶπεν, « ἔπεμψεν αὐτῷ, κελεύσας τὸ πονηρότατον ἐξελόντα καὶ χρηστότατον ἀποπέμψαι κρέας. ὁ δ´ ἡμέτερος εὖ καὶ καλῶς τὴν γλῶτταν ἐξελὼν ἔπεμψεν· ὅθεν εὐδοκιμῶν δῆλός ἐστι καὶ θαυμαζόμενος. » « Οὐ διὰ ταῦτ´ » ἔφη « μόνον » ὁ Νειλόξενος, « ἀλλ´ οὐ φεύγει τὸ φίλος εἶναι καὶ λέγεσθαι βασιλέων καθάπερ ὑμεῖς, ἐπεὶ σοῦ γε καὶ τἄλλα θαυμάζει, καὶ τῆς [[wikt:en:πυραμίδος#Ancient_Greek|πυραμίδος]] τὴν μέτρησιν ὑπερφυῶς ἠγάπησεν, ὅτι πάσης ἄνευ πραγματείας καὶ μηδενὸς ὀργάνου δεηθεὶς ἀλλὰ τὴν βακτηρίαν στήσας ἐπὶ τῷ πέρατι τῆς σκιᾶς ἣν ἡ πυραμὶς ἐποίει, γενομένων τῇ ἐπαφῇ τῆς ἀκτῖνος δυεῖν τριγώνων, ἔδειξας ὃν ἡ σκιὰ πρὸς τὴν σκιὰν λόγον εἶχε τὴν πυραμίδα πρὸς τὴν βακτηρίαν ἔχουσαν. ἀλλ´, ὅπερ ἔφην, διεβλήθης μισοβασιλεὺς εἶναι, καί τινες ὑβριστικαί σου περὶ τυράννων ἀποφάσεις ἀνεφέροντο πρὸς αὐτόν, ὡς ἐρωτηθεὶς ὑπὸ Μολπαγόρου τοῦ Ἴωνος τί παραδοξότατον εἴης ἑωρακώς, ἀποκρίναιο ‘τύραννον γέροντα,’ καὶ πάλιν ἔν τινι πότῳ, περὶ τῶν θηρίων λόγου γενομένου, φαίης κάκιστον εἶναι τῶν μὲν ἀγρίων θηρίων τὸν τύραννον, τῶν δ´ ἡμέρων τὸν κόλακα· ταῦτα γάρ, εἰ καὶ πάνυ προσποιοῦνται διαφέρειν οἱ βασιλεῖς τῶν τυράννων, οὐκ εὐμενῶς ἀκούουσιν. » « Ἀλλὰ τοῦτο μέν, » εἶπεν ὁ Θαλῆς, « Πιττακοῦ ἐστιν, εἰρημένον ἐν παιδιᾷ ποτε πρὸς Μυρσίλον· ἐγὼ δὲ θαυμάσαιμ´ ἄν, » ἔφη, « οὐ τύραννον ἀλλὰ [[wikt:κυβερνήτης#Grec_ancien|'''κυβερνήτην''']] γέροντα θεασάμενος. πρὸς δὲ τὴν μετάθεσιν τὸ τοῦ νεανίσκου πέπονθα τοῦ βαλόντος μὲν ἐπὶ τὴν κύνα πατάξαντος δὲ τὴν μητρυιὰν καὶ εἰπόντος ‘οὐδ´ οὕτω κακῶς.’ διὸ καὶ Σόλωνα σοφώτατον ἡγησάμην οὐ δεξάμενον τυραννεῖν. καὶ Πιττακὸς οὗτος εἰ μοναρχίᾳ μὴ προσῆλθεν, οὐκ ἂν εἶπεν ὡς ‘χαλεπὸν ἐσθλὸν ἔμμεναι.’ Περίανδρος δ´ ἔοικεν ὥσπερ ἐν νοσήματι πατρῴῳ τῇ τυραννίδι κατειλημμένος οὐ φαύλως ἐξαναφέρειν, χρώμενος ὁμιλίαις ὑγιειναῖς ἄχρι γε νῦν καὶ συνουσίας ἀνδρῶν νοῦν ἐχόντων ἐπαγόμενος, ἃς δὲ '''Θρασύβουλος''' αὐτῷ κολούσεις τῶν ἄκρων οὑμὸς πολίτης ὑφηγεῖται μὴ προσιέμενος. γεωργοῦ γὰρ [[wikt:en:αἶρα#Ancient_Greek|αἴρας]] καὶ [[wikt:ononis|ὀνώνιδας]] ἀντὶ [[wikt:πυρός#Grec_ancien|πυρῶν]] καὶ [[wikt:κριθή#Grec_ancien|κριθῶν]] συγκομίζειν ἐθέλοντος οὐδὲν διαφέρει τύραννος ἀνδραπόδων μᾶλλον ἄρχειν ἢ ἀνδρῶν βουλόμενος· ἓν γὰρ ἀντὶ πολλῶν κακῶν ἀγαθὸν αἱ δυναστεῖαι τὴν τιμὴν ἔχουσι καὶ τὴν δόξαν, ἄνπερ ἀγαθῶν ὡς κρείττονες ἄρχωσι καὶ μεγάλων μείζονες εἶναι δοκῶσι· τὴν δ´ ἀσφάλειαν ἀγαπῶντας ἄνευ τοῦ καλοῦ προβάτων ἔδει πολλῶν καὶ ἵππων καὶ βοῶν ἄρχειν, μὴ ἀνθρώπων. ἀλλὰ γὰρ εἰς οὐδὲν προσήκοντας ἐμβέβληκεν ἡμᾶς, » ἔφη, « ὁ ξένος οὑτοσὶ λόγους, ἀμελήσας λέγειν τε καὶ ζητεῖν ἃ ἁρμόττει ἐπὶ δεῖπνον βαδίζουσιν. ἦ γὰρ οὐκ οἴει, καθάπερ ἑστιάσοντος ἔστι τις παρασκευή, καὶ δειπνήσοντος εἶναι; Συβαρῖται μὲν γὰρ ὡς ἔοικε πρὸ ἐνιαυτοῦ τὰς κλήσεις ποιοῦνται τῶν γυναικῶν, ὅπως ἐκγένοιτο κατὰ σχολὴν παρασκευασαμέναις ἐσθῆτι καὶ χρυσῷ φοιτᾶν ἐπὶ τὸ δεῖπνον· ἐγὼ δὲ πλείονος οἶμαι χρόνου δεῖσθαι τὴν ἀληθινὴν τοῦ δειπνήσοντος ὀρθῶς παρασκευήν, ὅσῳ χαλεπώτερόν ἐστιν ἤθει τὸν πρέποντα κόσμον ἢ σώματι τὸν περιττὸν ἐξευρεῖν καὶ ἄχρηστον. οὐ γὰρ ὡς ἀγγεῖον ἥκει κομίζων ἑαυτὸν ἐμπλῆσαι πρὸς τὸ δεῖπνον ὁ νοῦν ἔχων, ἀλλὰ καὶ σπουδάσαι τι καὶ παῖξαι καὶ ἀκοῦσαι καὶ εἰπεῖν ὡς ὁ καιρὸς παρακαλεῖ τοὺς συνόντας, εἰ μέλλουσι μετ´ ἀλλήλων ἡδέως ἔσεσθαι. καὶ γὰρ καὶ ὄψον πονηρὸν ἔστι παρώσασθαι, κἂν οἶνος ᾖ φαῦλος, ἐπὶ τὰς νύμφας καταφυγεῖν· σύνδειπνος δὲ κεφαλαλγὴς καὶ βαρὺς καὶ ἀνάγωγος παντὸς μὲν οἴνου καὶ ὄψου πάσης δὲ μουσουργοῦ χάριν ἀπόλλυσι καὶ λυμαίνεται, καὶ οὐδ´ ἀπεμέσαι τὴν τοιαύτην ἀηδίαν ἕτοιμόν ἐστιν, ἀλλ´ ἐνίοις εἰς ἅπαντα τὸν βίον ἐμμένει τὸ πρὸς ἀλλήλους δυσάρεστον, ὥσπερ ἑωλοκρασία τις ὕβρεως ἢ ὀργῆς ἐν οἴνῳ γενομένης. ὅθεν ἄριστα Χίλων, καλούμενος ἐχθές, οὐ πρότερον ὡμολόγησεν ἢ πυθέσθαι τῶν κεκλημένων ἕκαστον. ἔφη γὰρ ὅτι σύμπλουν ἀγνώμονα δεῖ φέρειν καὶ σύσκηνον οἷς πλεῖν ἀνάγκη καὶ στρατεύεσθαι· τὸ δὲ συμπόταις ἑαυτὸν ὡς ἔτυχε καταμιγνύειν οὐ νοῦν ἔχοντος ἀνδρός ἐστιν. ὁ δ´ Αἰγύπτιος σκελετός, ὃν ἐπιεικῶς εἰσφέροντες εἰς τὰ συμπόσια προτίθενται καὶ παρακαλοῦσι μεμνῆσθαι τάχα δὴ τοιούτους ἐσομένους, καίπερ ἄχαρις καὶ ἄωρος ἐπίκωμος ἥκων, ὅμως ἔχει τινὰ καιρόν, καὶ εἰ μὴ πρὸς τὸ πίνειν καὶ ἡδυπαθεῖν ἀλλὰ πρὸς φιλίαν καὶ ἀγάπησιν ἀλλήλων προτρέπεται, καὶ παρακαλεῖ τὸν βίον μὴ τῷ χρόνῳ βραχὺν ὄντα πράγμασι κακοῖς μακρὸν ποιεῖν. » </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §2'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§2. La réception avait été préparée par '''Périandre''', non pas dans la ville même, mais dans son [[w:Cénacle|''cénacle'']] du port de [[w:Léchaion|''Léchée'']], près du temple de '''Vénus''' en l’honneur de laquelle il y avait même un sacrifice. Car depuis l’incestueux amour à la suite duquel sa mère avait volontairement abandonné la vie, '''Périandre''' n’avait pas sacrifié à '''Vénus''' ; et c’était alors la première fois que, d’après certains songes de '''Mélissa''' il s’était décidé à honorer la déesse et à lui rendre des hommages. Pour chacun des invités on avait amené un attelage approprié convenablement. Nous étions en été, et tout le long de la route, en raison du grand nombre de chariots et de piétons, ce n’était jusqu’à la mer que poussière et que bruit. Pourtant '''Thalès''', ayant vu l’attelage à notre porte, se mit à sourire et le renvoya. Nous partîmes donc à pied en faisant un détour, et à travers champs nous cheminâmes à loisir. Un troisième compagnon s’était joint à nous, '''Niloxène''' de ''Naucratie'', homme plein de mérite, que '''Thalès''' et '''Solon''' avaient autrefois beaucoup connu en ''Égypte''. Il se trouvait envoyé de nouveau vers '''Bias''' ; mais pour quelle mission ? Il n’en savait rien lui-même, hormis qu’il se soupçonnait porteur d’une seconde question à résoudre, contenue dans un pli cacheté; et il lui avait été dit, au cas où '''Bias''' renoncerait, de la présenter aux plus sages d’entre les Grecs. « C’est », dit '''Niloxène''', « une chance heureuse que de vous trouver ici tous, et j’apporte, comme vous voyez, cette lettre pour le banquet. » En même temps, il nous la faisait voir. '''Thalès''' se mit à rire : « Si c’est une question épineuse », dit-il, « qu’on aille encore à ''Priène'' : '''Bias''' la résoudra comme il a résolu la première. » — « Quelle était donc cette première question ? » lui demandai-je. — « Le roi d’Égypte », dit '''Thalès''', « avait envoyé à '''Bias''' une victime, en lui faisant dire d’en couper ce qu’il y avait de plus mauvais et de meilleur, et de le lui renvoyer. Notre sage, avec un discernement merveilleux, en ôta la langue et la fit porter au Roi. Voilà ce qui lui a valu une estime et une admiration si déclarée ». — « Cette raison n’est pas la seule », ajouta '''Niloxène''' ; « c’est encore, que '''Bias''' ne fuit pas, comme vous autres, l’amitié des rois eux-mêmes. Ainsi, vous, '''Thalès''', le roi d’Égypte vous admire beaucoup, et, entre autres choses, il a été, au-delà de ce qu’on peut dire, ravi de la manière dont vous avez mesuré la pyramide sans le moindre embarras et sans avoir eu besoin d’aucun instrument. Après avoir dressé votre bâton à l’extrémité de l’ombre que projetait la pyramide, vous construisîtes deux triangles par la tangence d’un rayon, et vous démontrâtes qu’il y avait la même proportion entre la hauteur du bâton et la hauteur de la pyramide qu’entre la longueur des deux ombres. Mais, comme j’ai dit, on vous accuse de détester les rois ; quelques boutades injurieuses prononcées par vous contre des ''tyrans'' ont été rapportées à [[w:Ahmôsis_II|'''Amasis''']]. Par exemple, l’Ionien '''Molpagore''' vous ayant demandé ce que vous aviez jamais vu de plus extraordinaire, vous lui auriez répondu : « C’est un tyran parvenu à la vieillesse. » Une autre fois, dans un festin, la conversation étant venue à tomber sur les bêtes féroces, vous auriez dit : « La plus méchante bête parmi les animaux sauvages, c’est le tyran, et parmi les animaux apprivoisés le flatteur. » De tels propos ne sont pas de ceux que les rois entendent avec plaisir, lors même qu’ils affectent de n’avoir rien de commun avec les tyrans. » Pour cette dernière réponse, dit '''Thalès''', elle est de '''Pittacus''' : il l’avait adressée un jour en plaisantant à '''Myrsile'''. Quant au premier propos, ce n’était pas « un tyran » que j’avais dit, mais « un [[wikt:κυβερνήτης#Grec_ancien|''pilote'']] », qui soit parvenu à la vieillesse. Toutefois, puisqu’on a changé la destination du mot, je fais comme le jeune homme qui, ayant jeté une pierre à un chien, atteignit sa belle-mère et s’écria : Même ainsi, ce n’est pas mal. » C’est pourquoi je regardai '''Solon''' comme éminemment sage lorsqu’il n’accepta pas la tyrannie ; et '''Pittacus''', s’il n’eût approché de la monarchie, n’aurait pas eu à dire : « Il est difficile d’être homme de bien. » Quant à '''Périandre''', il semble qu’ayant été saisi par le souverain pouvoir comme par une maladie de famille, il ne s’en tire pas trop mal. Il use, au moins jusqu’à présent, de sociétés salutaires. Il réunit, pour entretenir commerce avec eux, ses hommes remplis de sens ; et le conseil que lui a donné mon compatriote [[w:Thrasybule_de_Milet|'''Thrasybule''']] [[#Thrasybule|<span id="Thrasybule_back"><sup>'''I'''</sup></span>]], de décapiter l’aristocratie, il ne l’a pas accepté. Entre un laboureur qui aimerait mieux voir dans son champ de l’[[w:Ivraie|''ivraie'']] ou de l’[[w:Orobanche|''orobanche'']] que de l’orge ou du blé, et un tyran qui veut régner sur des esclaves plutôt que sur des hommes de coeur, je ne vois aucune différence. Un seul bien compense les maux nombreux attachés au pouvoir des tyrans : c’est la gloire et l’honneur qui leur sont réservés lorsque, commandant à des hommes vertueux, ils sont plus vertueux eux-mêmes, et qu’au milieu de grands ils se montrent plus grands. Ceux qui préfèrent leur sûreté en renonçant à ce beau rôle, étaient faits pour réunir sous leur main beaucoup de moutons, de chevaux et de boeufs, mais non des hommes. » « Du reste », continua '''Thalès''', « ce sont propos sans portée aucune que ceux où nous a jetés cet étranger, et nous avons omis de dire et de chercher les choses qui conviennent bien à des gens partis pour un banquet. Ne croyez-vous pas, '''Nicarque''', qu’il y ait des préparatifs à faire quand on vient prendre place à un festin, comme il y en a pour celui qui doit le donner ? Les [[w:Sybaris|''Sybarites'']] [[#Sybaris|<span id="Sybaris_back"><sup>'''II'''</sup></span>]], à ce qu’il paraît, s’y prennent un an d’avance pour adresser leurs invitations aux femmes, afin qu’elles puissent à loisir préparer leur toilette et leurs bijoux en or avant de se rendre au festin; et, selon moi, il faut plus de temps encore à un convive pour les préparatifs vraiment nécessaires, parce qu’il est plus difficile de trouver un ajustement convenable pour son moral que la vaine et inutile parure dont on s’inquiète pour son corps. Un homme sensé ne se transporte pas à un festin comme un bocal qu’il s’agit d’y remplir. Il songe à trouver là une occasion de passer tour à tour du sérieux au badinage, d’entendre et de tenir lui-même ces propos auxquels la circonstance invite les convives s’ils veulent se rendre la réunion agréable les uns aux autres. En effet on est libre de repousser un mauvais ragoût, et si le vin ne vaut rien on peut « recourir aux [[w:Naïades|''Naïades'']] »; mais un convive qui vous donne mal à la tête, qui est lourd, qui ne sait pas se conduire, vous fait perdre et vous gâte le plaisir de tout vin, de toute bonne chère, de toute musique. On n’est même pas le maître de se débarrasser aussi complétement qu’on le voudrait d’un tel désagrément. Quelques-uns en gardent tant qu’ils vivent du mécontentement les uns contre les autres : il leur semble qu’il leur reste comme un arrière-goût de viandes mal digérées, parce qu’ils conservent le souvenir d’injures ou de colères échangées dans le vin. C’est pour cela que '''Chilon''', invité hier, n’a pas voulu promettre avant d’avoir su le nom de chacun des convives : « Car on est bien obligé, a-t-il dit, de supporter un désagréable compagnon de traversée, de tente, quand il faut être sur terre ou à l’armée ; mais se mêler indifféremment à table avec les premiers venus, n’est pas le propre d’un homme sensé. » Le squelette des ''Égyptiens'', qu’ils ont la sage coutume de produire et de placer dans la salle du festin afin d’engager à se souvenir que l’on sera bientôt comme lui, survient là comme un convive assez désagréable et intempestif, mais enfin la présence s’en explique. Si cette vue n’excite pas à boire et à se réjouir, elle engage du moins à s’aimer, à se chérir les uns les autres, et elle exhorte à ne pas allonger par des tracas pénibles une existence dont la durée est si courte. </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §2'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> {{Boîte déroulante début|titre=NdA trad. par Victor Bétolaud de 1870|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Thrasybule_back|<span id="Thrasybule"><sup>I</sup></span>]] Du nom propre grec ancien Θρᾰσῠ́βουλος / Thrăsŭ́boulos [[wikt:en:Θρασύβουλος#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ de l’adjectif [[wikt:θρασύς#Grec_ancien|θρᾰσύς / thrăsús]], « confiant, audacieux » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun [[wikt:βουλή#Grec_ancien|βουλή / boulế]], « Volonté. Décision, conseil. Conseil, sénat athénien. »; du verbe [[wikt:βούλομαι#Grec_ancien|βούλομαι / boúlomai]], « Vouloir, désirer, souhaiter. Vouloir bien, consentir à. » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ -ος (-os).<br /><br /><p style="margin: 0 2em; text-indent: 15px">[[#Sybaris_back|<span id="Sybaris"><sup>II</sup></span>]] Du nom propre grec ancien Σῠ́βᾰρῐς / Sŭ́bărĭs [[wikt:en:Σύβαρις#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">[[w:Colonisation grecque|Colonie grecque]] du sud de l’Italie (en [[w:Calabre|Calabre]] actuelle), fondée au [[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]] dans le cadre du mouvement d’établissement et d’[[w:Colonisation_grecque|''essaimage'']] des Grecs vers l’Occident, particulièrement en [[w:Grande-Grèce|''Grande-Grèce'']]. Réputée dès l’Antiquité pour sa richesse devenue proverbiale, ainsi que pour son emprise sur les peuples voisins et différentes cités grecques de son voisinage, elle est détruite à l’issue d’une [[w:Guerre entre Sybaris et Crotone|guerre]] qui l’oppose à [[w:Crotone|''Crotone'']] à la fin du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]], et enfouie sous les eaux du fleuve ''Crathis'' (aujourd’hui [[Crati]]), avant de voir son site réoccupé, soixante ans plus tard, par la colonie [[w:Panhellénisme|''panhellénique'']] de [[w:Thourioï|''Thourioï'']].'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''Périandre''' avait fait préparer le banquet, non à la ville même, mais au ''port de Léchée'' [[#Léchée_NdT_DR|<span id="Léchée_NdT_DR_back"><sup>1</sup></span>]], dans une salle voisine du ''temple de Vénus'', à qui l’on devait offrir un sacrifice. Depuis que sa mère, victime d’un malheureux amour [[#Cratée_NdT_DR|<span id="Cratée_NdT_DR_back"><sup>2</sup></span>]], s’était donné la mort, il n’avait pas encore sacrifié à cette déesse, et c’était la première fois qu’il y pensait, d’après un songe de '''Mélisse''' [[#Mélisse_NdT_DR|<span id="Mélisse_NdT_DR_back"><sup>3</sup></span>]]. Nous étions dans les plus grandes chaleurs de l’été. Le grand nombre des voitures et des gens de pied qui fréquentaient le chemin qui conduit à la mer, l’avaient couvert de poussière et le rendaient fort incommode pour les voyageurs. On avait amené, pour chaque convive, un char commode et proprement orné. '''Thalès''', en voyant le sien à ma porte, se mit à sourire et le refusa. Nous primes donc, à travers les champs, un sentier détourné, et nous allâmes, en nous promenant, suivis de '''Niloxène''' de ''Naucrate'' [[#Niloxène_NdT_DR|<span id="Niloxène_NdT_DR_back"><sup>4</sup></span>]], homme du plus grand mérite, que '''Thalès''' et '''Solon''' avaient autrefois beaucoup connu en ''Égypte''. Il était envoyé, pour la seconde fois, vers '''Bias''', sans savoir lui-même quel était l’objet de sa mission. Il se doutait seulement que la lettre dont '''Amasis''' l’avait chargé contenait une seconde question à résoudre. Il avait ordre, en cas que '''Bias''' refusât d’y répondre, de la proposer aux plus sages d’entre les ''Grecs''. Dès qu’il m’eut aperçu, il me dit en me montrant sa lettre : « J’ai du bonheur aujourd’hui. Cette lettre vous trouve tous réunis. Je la porte au banquet, comme vous voyez. - Si c’est une question épineuse, dit '''Thalès''' en souriant, retournez à ''Priene'' [[#Priene_NdT_DR|<span id="Priene_NdT_DR_back"><sup>5</sup></span>]], '''Bias''' la résoudra, comme il a résolu la première. - Quelle était cette première question, demandai-je à '''Thalès''' ? - Le roi d’Égypte, me répondit-il, avait envoyé une victime à '''Bias''', en lui faisant dire d’en couper ce qu’il y avait de meilleur et de plus mauvais, et de le lui renvoyer. Notre sage, fort habilement en ôta la langue, qu’il lui fit porter. Voilà ce qui lui a mérité l’estime et l’admiration de ce prince. - Ajoutez encore à cette première raison, dit '''Niloxène''', que '''Bias''' ne dédaigne pas, comme vous, l’amitié des rois ; car '''Amasis''' n’a pas moins d’estime pour vous ; il admire surtout la manière dont vous mesurâtes, avec la plus grande facilité et sans aucun instrument mathématique, la hauteur de la pyramide. En dressant votre bâton à l’extrémité de l’ombre qu’elle faisait sur la terre, le rayon solaire qui touchait le sommet de la pyramide et l’extrémité du bâton forma deux triangles ; et vous démontrâtes qu’il y avait la même proportion entre la hauteur du bâton et celle de la pyramide qu’entre la longueur des ombres projetées par l’une et par l’autre. Mais, comme je viens de le dire, on vous accuse, auprès de lui, d’être l’ennemi des rois, et on lui a rapporté plusieurs propos injurieux que vous avez tenus contre les tyrans [[#tyrans_NdT_DR|<span id="tyrans_NdT_DR_back"><sup>6</sup></span>]] ; entre autres que l’''Ionien'' '''Molpagore''' [[#Molpagore_NdT_DR|<span id="Molpagore_NdT_DR_back"><sup>7</sup></span>]] vous ayant demandé ce qui vous paraîtrait plus extraordinaire dans la vie, vous lui répondîtes : de voir vieillir un tyran. Une autre fois, comme on vint à parler, dans un repas, du naturel des animaux, vous dîtes que le plus méchant des animaux sauvages était le tyran, et des animaux domestiques, le flatteur. Les rois, quoiqu’ils affectent de ne rien avoir de commun avec les tyrans, n’aiment pas cependant ces sortes de discours. Cette dernière réponse, dit '''Thalès''', est de '''Pittacus''' ; il la fit un jour, en plaisantant, à ''Myrsile'' [[#Myrsile_NdT_DR|<span id="Myrsile_NdT_DR_back"><sup>8</sup></span>]]. Dans la première, je parlais d’un pilote, et non pas d’un tyran. Mais puisqu’on en a fait application au tyran, je dirai comme ce jeune homme qui, jetant une pierre à son chien, en avait atteint sa belle-mère : « Le coup n’est pas perdu. » Aussi jamais '''Solon''' ne montra-t-il plus de sagesse, à mon gré, que lorsqu’il refusa la tyrannie ; et si '''Pittacus''' n’eût pas été contraint de l’accepter, il n’eût point dit qu’il est à charge d’être vertueux [[#Pittacus_NdT_DR|<span id="Pittacus_NdT_DR_back"><sup>9</sup></span>]]. Il est vrai que '''Périandre''', qui a succédé à l’autorité des tyrans, paraît jusqu’ici opposer à ce mal héréditaire un remède puissant, par le soin qu’il a de rechercher les entretiens et les avis salutaires des hommes vertueux , et par l’horreur qu’il a témoignée pour le conseil barbare que notre compatriote '''Thrasybule''' lui donnait de faire mourir les grands. Un tyran qui veut commander à des esclaves, plutôt qu’à des hommes, ressemble à un laboureur qui aimerait mieux voir son champ couvert de passereaux et de sauterelles que d’orge et de froment. Le seul bien qui puisse compenser tant de maux attachés au pouvoir des tyrans, c’est d’avoir, même sur les plus grands et les plus vertueux de leurs sujets, la supériorité de l’honneur et de la vertu. Ceux qui préfèrent la sûreté à la gloire sont faits pour commander à des troupeaux, et non pour gouverner des hommes. « Mais '''Niloxène''' nous a jetés dans une conversation absolument étrangère à notre objet, et nous a fait négliger ce qui devait nous occuper en allant au banquet. Ne pensez-vous pas que les conviés ont, aussi bien que leur hôte, des apprêts à faire. Les ''Sybarites'', dit-on, prient les femmes à souper un an d’avance, afin qu’elles puissent préparer à loisir leurs habits et leurs bijoux [[#Sybarites_NdT_DR|<span id="Sybarites_NdT_DR_back"><sup>10</sup></span>]]. Pour moi, je pense qu’il faut encore plus de temps à un convive pour faire tous les préparatifs convenables, parcequ’il est bien plus difficile d’orner son esprit comme il faut, que de donner à son corps une parure vaine et superflue. Un homme sensé doit aller à un festin, non pour y remplir son estomac, comme un vase, mais pour écouter et tenir à son tour des propos utiles ou amusants, suivant les circonstances. C’est le seul moyen de rendre le repas agréable aux convives. En effet, on peut laisser un mauvais ragoût, et recourir à l’eau quand le vin n’est pas bon ; mais un convive désagréable, importun et fatigant, fait perdre tout le plaisir de la bonne chère et de la musique. On ne peut se délivrer de l’ennui qu’il cause, et souvent même une parole vive ou offensante qu’il se sera permise dans la liberté de la table, fait naître des aversions et des ressentiments qui ne finissent qu’avec la vie. Aussi '''Chilon''', invité hier à ce banquet, ne voulut-il accepter qu’après qu’on lui eut nommé tous les convives. Il disait avec raison, que quand on est sur mer ou dans un camp, il faut nécessairement supporter les compagnons qui nous sont associés, quelque fâcheux qu’ils soient ; mais dans un festin, il n’est pas d’un homme sensé de se mêler indifféremment avec toutes sortes de personnes. Le squelette que les ''Égyptiens'' placent ordinairement à côté d’eux dans leurs repas, en s’exhortant à penser qu’ils seront bientôt dans le même état, est, à la vérité, un compagnon de table assez triste et assez déplacé. Il est néanmoins utile, sinon pour les exciter au plaisir, du moins pour les porter à la bienveillance et à l’amitié réciproque, et pour les avertir de ne pas remplir d’aigreur et de querelles le temps si court de la vie [[#squelette_NdT_DR|<span id="squelette_NdT_DR_back"><sup>11</sup></span>]]. » </div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Léchée_NdT_DR_back|<span id="Léchée_NdT_DR"><sup>1</sup></span>]] L’isthme de ''Corinthe'' avait deux ports, l’un sur la côte orientale, appelé ''Cenchrées'' ; et l’autre sur la côte occidentale, nommé ''Léchée''. Pausanias, qui a donné une description si détaillée de la ''Grèce'', parle d’un ''temple de Vénus'', bâti sur le port de ''Cenchrées'', et dont la statue était de marbre ; mais il ne fait pas mention de celui que cite Plutarque, et qu’il place près du port occidental. ''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Cratée_NdT_DR_back|<span id="Cratée_NdT_DR"><sup>2</sup></span>]] La mère de Périandre se nommait Cratée. On peut voir dans Parthenius la manière dont elle conçut et nourrit une passion incestueuse pour son fils, les moyens qu'elle prit pour la satisfaire sans être connue, et comment elle fut découverte. Les remords qu’elle en eut l’obligèrent de se donner la mort.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Mélisse_NdT_DR_back|<span id="Mélisse_NdT_DR"><sup>3</sup></span>]] Mélisse était fille de Proclès, roi d’[[w:Épidaure_(cité_antique)|''Épidaure'']]. On prétend que Périandre en devint éperdument amoureux pour l’avoir vue dans l’habillement ordinaire aux femmes du ''Péloponnèse''. Cette passion toutefois ne l’empêcha pas de partager son cœur entre elle et plusieurs concubines. Elles parvinrent à l’irriter contre elle au point qu’un jour, par un mouvement de jalousie, il la frappa d’un coup de pied, sans songer qu’elle était enceinte, et la fit mourir.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Niloxène_NdT_DR_back|<span id="Niloxène_NdT_DR"><sup>4</sup></span>]] Niloxène signifie hôte du ''Nil'' : ce nom semble indiquer que c’est un personnage supposé.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Priene_NdT_DR_back|<span id="Priene_NdT_DR"><sup>5</sup></span>]] Ville d’''Ionie'', colonie des ''Thébains'' et patrie de Bias.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#tyrans_NdT_DR_back|<span id="tyrans_NdT_DR"><sup>6</sup></span>]] Par le mot [[wikt:τύραννος#Grec_ancien|τύραννος]], que nous ne pouvons rendre en français que par celui de tyran, les ''Grecs'' entendaient, non pas seulement, comme nous, un prince injuste et cruel ; mais, en général, tout homme qui s’était emparé de l’autorité monarchique dans un état libre, sans qu’elle lui fût légitimement acquise.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Molpagore_NdT_DR_back|<span id="Molpagore_NdT_DR"><sup>7</sup></span>]] Ce Molpagore est peut-être le père d’Aristagore, que Darius établit tyran à ''Milet''.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Myrsile_NdT_DR_back|<span id="Myrsile_NdT_DR"><sup>8</sup></span>]] Myrsile n’est guère mieux connu que Molpagore. Strabon le met au nombre de ces ''Lesbiens'' ambitieux, qui, du temps de Pittacus, s’étaient emparés de l’autorité souveraine à ''Lesbos'', et dont le poète [[w:Alcée_de_Mytilène|Alcée]] avait flétri la mémoire.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pittacus_NdT_DR_back|<span id="Pittacus_NdT_DR"><sup>9</sup></span>]] Pittacus en se voyant forcé, dans sa vieillesse, de reprendre le gouvernement des affaires, prononça cette maxime.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Sybarites_NdT_DR_back|<span id="Sybarites_NdT_DR"><sup>10</sup></span>]] Cet usage des ''Sybarites'' n’avait lieu que dans les festins publics.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#squelette_NdT_DR_back|<span id="squelette_NdT_DR"><sup>11</sup></span>]] Cet usage, d'’abord particulier aux ''Egyptiens'', avait ensuite passé chez les ''Grecs'', de qui les ''Romains'' l'’empruntèrent. ''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe III.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la reconnaissance de la sagesse de '''Cléobuline''' ''« Eumétis »'' par '''Thalès''', de l’humilité de ce dernier et de son [[w:Cynisme|''cynisme'']].</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§3. Ἐν τοιούτοις λόγοις γενόμενοι κατὰ τὴν ὁδὸν ἀφικόμεθα πρὸς τὴν οἰκίαν, καὶ λούσασθαι μὲν ὁ Θαλῆς οὐκ ἠθέλησεν, ἀληλιμμένοι γὰρ ἦμεν· ἐπιὼν δὲ τούς τε δρόμους ἐθεᾶτο καὶ τὰς παλαίστρας καὶ τὸ ἄλσος τὸ παρὰ τὴν θάλατταν ἱκανῶς διακεκοσμημένον, ὑπ´ οὐδενὸς ἐκπληττόμενος τῶν τοιούτων, ἀλλ´ ὅπως μὴ καταφρονεῖν δοκοίη μηδ´ ὑπερορᾶν τοῦ Περιάνδρου τῆς φιλοτιμίας. τῶν δ´ ἄλλων τὸν ἀλειψάμενον ἢ λουσάμενον οἱ θεράποντες εἰσῆγον εἰς τὸν ἀνδρῶνα διὰ τῆς στοᾶς. Ὁ δ´ Ἀνάχαρσις ἐν τῇ στοᾷ καθῆστο, καὶ παιδίσκη προειστήκει τὴν κόμην ταῖς χερσὶ διακρίνουσα. ταύτην ὁ Θαλῆς ἐλευθεριώτατά πως αὐτῷ προσδραμοῦσαν ἐφίλησε καὶ γελάσας « οὕτως, » ἔφη, « ποίει καλὸν τὸν ξένον, ὅπως ἡμερώτατος ὢν μὴ φοβερὸς ᾖ τὴν ὄψιν ἡμῖν μηδ´ ἄγριος. » Ἐμοῦ δ´ ἐρομένου περὶ τῆς παιδὸς ἥτις εἴη, « τὴν σοφήν, » ἔφη, « καὶ περιβόητον ἀγνοεῖς Εὔμητιν; οὕτω γὰρ ταύτην ὁ πατὴρ αὐτός, οἱ δὲ πολλοὶ πατρόθεν ὀνομάζουσι Κλεοβουλίνην. » Καὶ ὁ Νειλόξενος εἶπεν « ἦ που τὴν περὶ τὰ αἰνίγματα δεινότητα καὶ σοφίαν, » ἔφη, « τῆς κόρης ἐπαινεῖς· καὶ γὰρ εἰς Αἴγυπτον ἔνια τῶν προβαλλομένων ὑπ´ αὐτῆς διῖκται. » « Οὐκ ἔγωγ´, » εἶπεν ὁ Θαλῆς· « τούτοις γὰρ ὥσπερ ἀστραγάλοις, ὅταν τύχῃ, παίζουσα χρῆται καὶ διαβάλλεται πρὸς τοὺς ἐντυχόντας. ἀλλὰ καὶ φρόνημα θαυμαστὸν καὶ νοῦς ἔνεστι πολιτικὸς καὶ φιλάνθρωπον ἦθος, καὶ τὸν πατέρα τοῖς πολίταις πραότερον ἄρχοντα παρέχει καὶ δημοτικώτερον. » « Εἶεν, » ὁ Νειλόξενος ἔφη, « καὶ φαίνεται βλέποντι πρὸς τὴν λιτότητα καὶ ἀφέλειαν αὐτῆς· Ἀνάχαρσιν δὲ πόθεν οὕτω τημελεῖ φιλοστόργως; » « Ὅτι, » ἔφη, « σώφρων ἀνήρ ἐστι καὶ πολυμαθής, καὶ τὴν δίαιταν αὐτῇ καὶ τὸν καθαρμόν, ᾧ χρῶνται Σκύθαι περὶ τοὺς κάμνοντας, ἀφθόνως καὶ προθύμως παραδέδωκε. καὶ νῦν οἶμαι περιέπειν αὐτὴν τὸν ἄνδρα καὶ φιλοφρονεῖσθαι, μανθάνουσάν τι καὶ προσδιαλεγομένην. » Ἤδη δὲ πλησίον οὖσιν ἡμῖν τοῦ ἀνδρῶνος ἀπήντησεν Ἀλεξίδημος ὁ Μιλήσιος (ἦν δὲ Θρασυβούλου τοῦ τυράννου νόθος) καὶ ἐξῄει τεταραγμένος καὶ σὺν ὀργῇ τινι πρὸς αὑτὸν οὐδὲν ἡμῖν γε σαφὲς διαλεγόμενος. ὡς δὲ τὸν Θαλῆν εἶδε, μικρὸν ἀνενεγκὼν καὶ καταστάς « οἵαν ὕβριν, » εἶπεν, « εἰς ἡμᾶς Περίανδρος ὕβρικεν, ἐκπλεῦσαι μὲν οὐκ ἐάσας ὡρμημένον ἀλλὰ προσμεῖναι δεηθεὶς τὸ δεῖπνον, ἐλθόντι δὲ νέμων κλισίαν ἄτιμον, Αἰολεῖς δὲ καὶ νησιώτας (καὶ τίνας γὰρ οὐχί;) Θρασυβούλου προτιμῶν· Θρασύβουλον γὰρ ἐν ἐμοὶ τὸν πέμψαντα προπηλακίσαι βουλόμενος καὶ καταβαλεῖν ὡς δὴ περιορῶν δῆλός ἐστιν. » « Εἶτ´, » ἔφη, « σὺ δέδιας μὴ καθάπερ Αἰγύπτιοι τοὺς ἀστέρας ὑψώματα καὶ ταπεινώματα λαμβάνοντας ἐν τοῖς τόποις οὓς διεξίασι γίγνεσθαι βελτίονας ἢ χείρονας ἑαυτῶν λέγουσιν, οὕτως ἡ περὶ σὲ διὰ τὸν τόπον ἀμαύρωσις ἢ ταπείνωσις γένηται; καὶ τοῦ Λάκωνος ἔσῃ φαυλότερος, ὃς ἐν χορῷ τινι κατασταθεὶς εἰς τὴν ἐσχάτην χώραν ὑπὸ τοῦ ἄρχοντος ‘εὖ γ´,’ εἶπεν, ‘ἐξεῦρες, ὡς καὶ αὕτα ἔντιμος γένηται.’ οὐ καταλαβόντας, » ἔφη, « τόπον μετὰ τίνας κατακείμεθα δεῖ ζητεῖν, μᾶλλον δ´ ὅπως εὐάρμοστοι τοῖς συγκατακειμένοις ὦμεν, ἀρχὴν καὶ λαβὴν φιλίας εὐθὺς ἐν αὐτοῖς ζητοῦντες, μᾶλλον δ´ ἔχοντες τὸ μὴ δυσκολαίνειν ἀλλ´ ἐπαινεῖν ὅτι τοιούτοις συγκατεκλίθημεν· ὡς ὅ γε τόπῳ κλισίας δυσχεραίνων δυσχεραίνει τῷ συγκλίτῃ μᾶλλον ἢ τῷ κεκληκότι, καὶ πρὸς ἀμφοτέρους ἀπεχθάνεται. » « Λόγος, » ἔφη, « ταῦτ´ ἄλλως ἐστίν » ὁ Ἀλεξίδημος, « ἔργῳ δὲ καὶ τοὺς σοφοὺς ὑμᾶς ὁρῶ τὸ τιμᾶσθαι διώκοντας, » καὶ ἅμα παραμειψάμενος ἡμᾶς ἀπῆλθε. Καὶ ὁ Θαλῆς πρὸς ἡμᾶς τὴν ἀτοπίαν τοῦ ἀνθρώπου θαυμάζοντας, « ἔμπληκτος, » ἔφη, « καὶ ἀλλόκοτος φύσει, ἐπεὶ καὶ μειράκιον ὢν ἔτι, μύρου σπουδαίου Θρασυβούλῳ κομισθέντος, εἰς ψυκτῆρα κατεράσας μέγαν καὶ προσεγχέας ἄκρατον ἐξέπιεν, ἔχθραν ἀντὶ φιλίας Θρασυβούλῳ διαπεπραγμένος. » Ἐκ τούτου περιελθὼν ὑπηρέτης « κελεύει σε Περίανδρος, » ἔφη, « καὶ Θαλῆν παραλαβόντα τοῦτον ἐπισκέψασθαι τὸ κεκομισμένον ἀρτίως αὐτῷ πότερον ἄλλως γέγονεν ἤ τι σημεῖόν ἐστι καὶ τέρας· αὐτὸς μὲν γὰρ ἔοικε τεταράχθαι σφόδρα, μίασμα καὶ κηλῖδα τῆς θυσίας ἡγούμενος. » ἅμα δ´ ἀπῆγεν ἡμᾶς εἴς τι οἴκημα τῶν περὶ τὸν κῆπον. ἐνταῦθα νεανίσκος ὡς ἐφαίνετο νομευτικός, οὔπω γενειῶν ἄλλως τε τὸ εἶδος οὐκ ἀγεννής, ἀναπτύξας τινὰ διφθέραν ἔδειξεν ἡμῖν βρέφος ὡς ἔφη γεγονὸς ἐξ ἵππου, τὰ μὲν ἄνω μέχρι τοῦ τραχήλου καὶ τῶν χειρῶν ἀνθρωπόμορφον, τὰ λοιπὰ δ´ ἔχον ἵππου, τῇ δὲ φωνῇ καθάπερ τὰ νεογνὰ παιδάρια κλαυθμυριζόμενον. ὁ μὲν οὖν Νειλόξενος, « Ἀλεξίκακε » εἰπών, ἀπεστράφη τὴν ὄψιν, ὁ δὲ Θαλῆς προσέβλεπε τῷ νεανίσκῳ πολὺν χρόνον, εἶτα μειδιάσας (εἰώθει δ´ ἀεὶ παίζειν πρὸς ἐμὲ περὶ τῆς τέχνης) « ἦ που τὸν καθαρμόν, ὦ Διόκλεις, » ἔφη, « κινεῖν διανοῇ καὶ παρέχειν πράγματα τοῖς ἀποτροπαίοις, ὥς τινος δεινοῦ καὶ μεγάλου συμβάντος; » « Τί δ´, » εἶπον, « οὐ μέλλω; στάσεως γάρ, ὦ Θαλῆ, καὶ διαφορᾶς τὸ σημεῖόν ἐστι, καὶ δέδια μὴ μέχρι γάμου καὶ γενεᾶς ἐξίκηται, πρὶν ἢ τὸ πρῶτον ἐξιλάσασθαι μήνιμα, τῆς θεοῦ δεύτερον ὡς ὁρᾷς προφαινούσης. » Πρὸς τοῦτο μηδὲν ἀποκρινάμενος ὁ Θαλῆς ἀλλὰ γελῶν ἀπηλλάττετο. καὶ τοῦ Περιάνδρου πρὸς τὰς θύρας ἀπαντήσαντος ἡμῖν καὶ διαπυθομένου περὶ ὧν εἴδομεν, ἀφεὶς ὁ Θαλῆς με καὶ λαβόμενος τῆς ἐκείνου χειρὸς ἔφη, « ἃ μὲν Διοκλῆς κελεύει δράσεις καθ´ ἡσυχίαν· ἐγὼ δέ σοι παραινῶ νέοις οὕτω μὴ χρῆσθαι νομεῦσιν ἵππων, ἢ διδόναι γυναῖκας αὐτοῖς. » Ἔδοξε μὲν οὖν μοι τῶν λόγων ἀκούσας ὁ Περίανδρος ἡσθῆναι σφόδρα· καὶ γὰρ ἐξεγέλασε καὶ τὸν Θαλῆν περιβαλὼν κατησπάσατο. κἀκεῖνος « οἶμαι δ´, » εἶπεν, « ὦ Διόκλεις, καὶ πέρας ἔσχε τὸ σημεῖον· ὁρᾷς γὰρ ἡλίκον κακὸν γέγονεν ἡμῖν, Ἀλεξιδήμου συνδειπνεῖν μὴ θελήσαντος. » </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §3'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§3. Ce fut en tenant de tels propos chemin faisant, que nous arrivâmes à la maison. '''Thalès''' ne voulut pas se baigner : « Je me suis frotté d’huile. » dit-il. Il se promena donc de côté et d’autre, regardant les champs de course, les palestres, et le bois sacré, voisin de la mer, que l’on avait bien convenablement disposé. Ce n’était pas qu’il fût frappé par aucun de ces préparatifs, mais il voulait ne pas avoir l’air de mépriser '''Périandre''' et de faire peu de cas de l’empressement avec lequel celui-ci honorait ses hôtes. Pour les autres convives, à mesure qu’ils s’étaient parfumés ou baignés, les serviteurs les introduisaient par la galerie dans la salle du banquet. Or '''Anacharsis''' s’était installé dans cette galerie, et devant lui une jeune fille se tenait, lui séparant les cheveux avec ses mains. Lorsqu’entra '''Thalès''', elle s’élança très librement à sa rencontre, et '''Thalès''', après l’avoir embrassée, lui dit en riant : « Continue à rendre bien beau notre étranger, afin qu’étant devenu la douceur même il ne conserve pas au milieu de nous une mine à faire peur et un aspect sauvage. » Je lui demandai quelle était cette jeune enfant : « Quoi ! » me dit-il, « vous ne connaissez pas la savante et célèbre '''Eumétis''' ! car c’est ainsi que son père la nomme : le plus communément on l’appelle '''Cléobuline''', du nom paternel. » Et '''Niloxène''' : « C’est sans doute à cause de son talent et de son habileté pour les énigmes, que vous faites l’éloge de cette jeune fille : car quelques-unes de celles qu’elle a proposées sont parvenues jusqu’en ''Égypte''. » — « Ce n’est pas à cause de cela », répondit '''Thalès''' : « les énigmes sont pour elle des joujoux dont elle s’amuse à l’occasion pour faire sa partie avec ceux qui se rencontrent. Mais ce qui est admirable en elle c’est sa profondeur d’esprit, son sens politique, l’aménité de son caractère, et le talent qu’elle a de rendre plus douce l’autorité de son père et d’inspirer à celui-ci des sentiments plus humains à l’égard du peuple. » — « Soit », dit '''Niloxène''' ; « et cela se reconnaît à voir sa modestie et sa simplicité. Mais d’où vient qu’elle prend un soin si amoureux de la toilette d’'''Anacharsis''' ? » — Parce que c’est, répondit '''Thalès''', « un sage, un homme des plus instruits, et parce qu’il lui a communiqué, avec de nombreux détails et de grand coeur, l’ensemble des pratiques sanitaires et des purifications que les ''Scythes'' appliquent au traitement des malades. Et dans ce moment je suppose qu’elle l’entoure de soins et d’amitiés parce qu’elle s’instruit de quelque chose en conversant avec lui. » Comme nous étions déjà près de la salle, '''Alexidème''' le ''Milésien'' vint à notre rencontre. C’était un bâtard du tyran '''Thrasybule'''. Il était sorti tout troublé, et avec une sorte de fureur il se parlait à lui-même, mais ses paroles n’avaient rien de clair pour nous. Quand il eut vu '''Thalès''', il se remit un peu ; puis, s’arrêtant tout court : « Quel affront '''Périandre''' vient de nous faire ! Je voulais mettre à la voile : il ne l’a pas permis ; il m’a supplié de rester à son festin, et quand j’arrive, il me donne une des dernières places, faisant passer des [[w:Éoliens|''Éoliens'']], des insulaires (je ne sais qui il ne me préfère pas), les faisant passer, dis je, avant '''Thrasybule''', car c’est '''Thrasybule''' en ma personne, c’est celui par lequel je suis envoyé qu’il a l’intention de traîner dans la boue et de ravaler comme le méprisant : la chose est bien claire. » — « Eh quoi ! » lui dit '''Thalès''', « êtes-vous comme les ''Égyptiens'', qui prétendent que les astres, suivant qu’ils prennent une position élevée ou basse en parcourant leur orbite, ont une condition meilleure ou pire qu’ils ne l’avaient ? Craignez-vous, pareillement, qu’autour de vous, en raison de la place où vous serez, il ne se produise obscurité ou dépression ? Serez-vous moins résigné que certain ''Spartiate'' ? À je ne sais quelle représentation il avait été placé au dernier rang par le maître des cérémonies : « Voilà qui va bien », lui dit-il : « tu as trouvé moyen de rendre honorable ce lieu même. Quand nous avons pris une place nous ne devons pas chercher au-dessous de qui nous sommes installés, mais plutôt comment nous nous mettrons en bon accord avec nos voisins. À leur occasion nous ferons voir tout d’abord, ou plutôt nous l’éprouverons réellement, un désir d’initiative et de prise de possession en matière d’amitié, et nous manifesterons ce désir en nous félicitant, loin d’en montrer du dépit, de ce que l’on nous a placés en une telle compagnie. Mais celui qui se plaint du rang qu’on lui donne à table montre plus de mécontentement contre son commensal que contre son hôte, et il se rend odieux à l’un et à l’autre. » — « Paroles que tout cela, » dit '''Alexidème''', « et paroles sans portée ! Mais je vois que de fait, vous autres sages, vous recherchez aussi les honneurs. » En même temps il s’éloigna de nous et disparut. Une conduite si étrange nous semblait étonnante. « C’est », nous dit '''Thalès''', « un homme écervelé et naturellement bizarre. Vous allez en juger. Il était encore tout jeune ; on avait apporté à '''Thrasybule''' un parfum d’un très haut prix. '''Alexidème''' le versa dans un grand vase à rafraîchir, y mêla du vin pur, et avala le tout, rendant son père odieux au lieu de le faire aimer. » Au même moment parut un serviteur : « Vous êtes invité par '''Périandre''' », me dit-il, « à venir, en vous faisant accompagner de '''Thalès''' que voici, examiner l’objet qu’on lui a récemment apporté, afin que vous disiez si c’est une création toute fortuite, ou bien un présage et une monstruosité; car, pour ce qui est de '''Périandre''', il a l’air grandement troublé, pensant que c’est une souillure et une profanation pour son sacrifice. » En même temps, il nous emmena vers une des salles qui donnaient sur le jardin. Là un jeune homme paraissant appartenir à la classe des bergers, qui n’avait pas encore de barbe et dont la physionomie ne manquait pas de noblesse, déploya une espèce de couverture en cuir, et nous montra un petit enfant né, disait-il, d’une cavale. Par le haut, jusqu’au cou et aux mains, cette créature était de forme humaine ; mais le reste était d’un cheval, et sa voix avait quelque chose des vagissements poussés par les petits enfants qui viennent de naître. « Dieu préservateur ! » s’écria '''Niloxène''', et il détourna les yeux. Mais '''Thalès''' fixa longtemps son regard sur le jeune pâtre; puis s’étant mis à sourire, (car il avait l’habitude de plaisanter toujours avec moi sur ma profession) : « Eh bien, '''Dioclès''', » dit-il, « songez-vous à préparer quelque expiation, et à donner de la besogne aux dieux préservateurs, comme vous trouvant en présence de quelque événement grave et considérable ? » — « Pourquoi non ? » répondis-je : « j’y vois le présage de troubles et de discordes qui s’étendront, j’en ai peur, jusqu’à un mariage et une génération avant que le courroux de la déesse ait été apaisé, puisqu’elle fait, vous le savez, une seconde manifestation ». À ces paroles '''Thalès''' ne répondit rien : il se contenta de rire et de s’en aller. Et comme '''Périandre''' était à la porte, s’avançant pour nous interroger sur ce que nous venions de voir, '''Thalès''' me quitta et le prit par la main : « Ce que '''Dioclès''' prescrira, vous l’exécuterez à loisir », lui dit-il ; « mais moi j’ai un conseil à vous donner : pour faire paître vos juments ne prenez pas de jeunes garçons, ou bien à ceux-ci donnez des femmes. » Ces paroles me semblèrent causer, des qu’il les eut entendues, une vive satisfaction à '''Périandre''', car il éclata de rire et serra très affectueusement '''Thalès''' dans ses bras. '''Thalès''' alors : « '''Dioclès''' », me dit-il, « si je conjecture bien, le prodige reçoit déjà son accomplissement. Car vous voyez quel grand malheur nous est arrivé, '''Alexidème''' n’ayant pas voulu souper avec nous. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §3'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Après avoir ainsi conversé pendant le chemin, nous arrivâmes au lieu destiné pour le banquet. '''Thalès''' ne voulut point entrer dans le bain, parcequ'’il s'’était déja parfumé, mais il se promena dans les dehors, s'’arrêta à voir les luttes et les courses ; il alla voir le bocage voisin de la mer, qu'’on avait décoré avec beaucoup de soin, non qu'’il fût frappé de tout cet appareil, mais pour ne point paraître mépriser '''Périandre''' et dédaigner sa magnificence. Tous les autres convives, à mesure qu'’ils sortaient du bain, étaient introduits par des esclaves dans la salle du banquet. '''Anacharsis''' seul était assis sous le portique, une jeune fille, debout, lui arrangeait les cheveux. Dès qu'’elle vit '''Thalès''', elle accourut très librement au-devant de lui ; ce philosophe l'’embrassa, et lui dit en riant : « Parez cet hôte du mieux que vous pourrez, afin que le plus doux des hommes n'’ait plus un extérieur sauvage et effrayant. » Je lui demandai quelle était cette jeune personne : « Eh quoi ! me répondit-il, vous ne connaissez pas la sage et fameuse '''Eumétis''' ? C'’est le nom que '''Cléobule''' lui donne, mais les autres l'’appellent '''Cléobuline''', du nom de son père. - Est-ce, dit '''Niloxène''', à cause de sa subtilité et de son adresse à composer des énigmes, que vous faites ainsi son éloge ? Quelques unes de celles qu'’on lui attribue ont pénétré jusqu'’en Egypte. - Non, répliqua '''Thalès''' ; ces énigmes ne sont que des jouets dont elle s'’amuse dans l'’occasion pour éprouver la perspicacité de ceux qu'’elle rencontre. Ce qu'’elle a de vraiment admirable, c'’est sa grande prudence, sa capacité pour les affaires, son humanité, et l'’attention qu'’elle a de rendre le gouvernement de son père doux et bienfaisant. - Il est vrai, reprit '''Niloxène''', que sa modestie et sa simplicité annoncent combien elle est populaire. Mais d'’où viennent ces soins et cet intérêt pour '''Anacharsis''' ? - Parceque c'’est un homme sensé et très instruit, répondit '''Thalès''', qu'’il s'’est fait un plaisir de lui apprendre en détail le régime et le traitement que les ''Scythes'' emploient dans les maladies. Je suis sûr que dans ce moment même où elle le pare avec tant de soin, elle s'’entretient utilement avec lui, et cherche à s'’instruire. » Nous approchions de la salle, lorsque nous rencontrâmes '''Alexidème''' de ''Milet'', fils naturel du tyran '''Thrasybule'''. Il sortait tout troublé, et d'’un ton de colère murmurait quelques mots que nous ne pûmes entendre. Dès qu'’il vit '''Thalès''', il se remit un peu ; et en lui adressant la parole, il lui dit : « Quel indigne affront '''Périandre''' vient de nous faire ! J'’allais partir, il me retient, il me prie de rester à son festin ; et quand j'’arrive, il m'’y donne la dernière place : il préfère un ''éolien'', un insulaire, enfin je ne sais qui, à '''Thrasybule''', car il est évident que c'’est '''Thrasybule''' que '''Périandre''' méprise, et brave ouvertement dans la personne de son envoyé [[#Léchée_NdT_DR|<span id="Léchée_NdT_DR_back"><sup>1</sup></span>]]. -Eh quoi ! lui dit Thalès, craignez-vous que la place que vous occuperez à table ne vous rende plus grand ou plus petit , comme les Égyptiens disent que les astres brillent plus ou moins, suivant que le cercle qu'ils par- courent est plus ou moins élevé ? Et vous estimeriez-vous moins que ce Lacédémonien, qui, dans une assemblée publique, placé par le magistrat au dernier rang, lui dit : Vous avez trouvé le moyen de rendre cette place hono- rable 2 ? Doit-on en effet examiner après qui l'on est placé? Ne faut-il pas plutôt s'accommoder de ceux qu'on a pour voisins, afin d'avoir une occasion naturelle de se lier avec eux, et loin de se fâcher du rang qu'on occupe, té- moigner sa satisfaction de se trouver auprès d'eux ? Celui qui se plaint de la place qu'on lui assigne semble plus mécontent de son voisin que de son hôte, et se rend odieux à l'un et à l'autre . -Belles paroles que cela, repartit Alexidème. Mais , dans le fait, je vois que vous autres sages, vous recher- chezles honneurs aussi bien que nous. » En même temps, il nous quitte brusquement, et s'en va. Une conduite si étrange nous étonna tous : « Ce jeune homme, nous dit Thalès, a montré dès l'enfance un caractère dur et emporté. Unjour qu'on avait fait présent à Thrasybule d'un parfum de grand prix, il le versa dans une coupe mêlé avec du vin, et l'avala, payant ainsi d'in- gratitude la tendresse de son père. >>> Au même instant, un des gens de Périandre vint me prier d'aller avec Thalès voir quelque chose d'extraordi- naire qu'on venait de lui apporter, afin de juger si c'é- tait un jeu de la nature ou un prodige menaçant ; il nous dit qu'il en était tout troublé, et qu'il craignait que son sacrifice n'en fùt souillé. En même temps, il nous con- duit dans une salle qui donnait sur le jardin. Nous y trou- vâmes un jeune homme sans barbe, d'une figure intéres- sante, qui avait l'air d'un berger. Il lève une espèce de peau, et nous fait voir un enfant qu'il disait être né d'une cavale, qui avait la tête, le cou et les mains d'un homme, et dans tout le reste, était fait comme un cheval. Sa voix ressemblait à celle d'un enfant qui vient de naître : « Dieu préservateur ! s'écria Niloxène, en détournant la vue. >>> Mais Thalès, qui a coutume de plaisanter avec moi sur mon art , après avoir longtemps considéré ce jeune homme, me dit en souriant : « Ne pensez-vous pas déja, Dioclès, à faire des expiations ? Et pour détourner un présage si terrible , n'allez-vous pas donner bien de l'ouvrage aux dieux préservateurs ? -Pourquoi non ? lui répondis-je. Ce prodige, Thalès, est un signe menaçant de troubles et de discorde ; et je crains bien que l'épouse et les enfants de Périandre n'en éprouvent les tristes suites, puisque enfin, comme vous voyez, avant que la déesse soit apaisée, elle donne une nouvelle marque de son courroux. » A ces mots, Thalès sourit et sortit sans rien répondre. Il vit , à la porte de la salle, Périandre venir au-devant de nous, pour savoir notre sentiment. Il me quitta, lui prit la main, et lui dit : « Dioclès vous parlera ; vous ferez à loisir ce qu'il vous dira. Pour moi, je pense que vous ne devez pas avoir, pour garder vos juments, des bergers aussi jeunes, ou que vous devez les marier. » Cediscours parut faire grand plaisir à Périandre , car il en rit beaucoup, et embrassa affectueusement Thalès. Celui-ci s'’adressant à moi : « Je crois, '''Dioclès''', me dit-il, que le prodige a déja eu son accomplissement. Vous voyez le malheur qui vient de nous arriver ; '''Alexidème''' a refusé de souper avec nous. » </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe IV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage du caractère désinvolte de '''Thalès'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§4. Ἐπεὶ δ´ εἰσήλθομεν, ἤδη μεῖζον ὁ Θαλῆς φθεγξάμενος « ποῦ δ´ » εἶπεν « ὁ ἀνὴρ κατακλινάμενος ἐδυσχέρανεν; » ἀποδειχθείσης δὲ τῆς χώρας περιελθὼν ἐκεῖ κατέκλινεν ἑαυτὸν καὶ ἡμᾶς « ἀλλὰ κἂν ἐπριάμην » εἰπών « Ἀρδάλῳ κοινωνεῖν μιᾶς τραπέζης. » ἦν δὲ Τροιζήνιος ὁ Ἄρδαλος, αὐλῳδὸς καὶ ἱερεὺς τῶν Ἀρδαλείων Μουσῶν, ἃς ὁ παλαιὸς Ἄρδαλος ἱδρύσατο ὁ Τροιζήνιος.<br /><p style="text-align: centre">[...]<br /><p style="text-align: justify; text-indent: 15px">καὶ ὁ Θαλῆς ἐμὲ προσαγορεύσας ἐπάνω τοῦ Βίαντος κατακείμενον « τί οὐκ ἔφρασας, » εἶπεν, « ὦ Διόκλεις, Βίαντι τὸν Ναυκρατίτην ξένον ἥκοντα μετὰ προβλημάτων βασιλικῶν αὖθις ἐπ´ αὐτόν, ὅπως νήφων καὶ προσέχων ἑαυτῷ τὸν λόγον δέχηται; » Καὶ ὁ Βίας « ἀλλ´ οὗτος μέν, » ἔφη, « πάλαι δεδίττεται ταῦτα παρακελευόμενος, ἐγὼ δὲ τὸν Διόνυσον οἶδα τά τ´ ἄλλα δεινὸν ὄντα καὶ Λύσιον ἀπὸ σοφίας προσαγορευόμενον, ὥστ´ οὐ δέδια τοῦ θεοῦ μεστὸς γενόμενος μὴ ἀθαρσέστερον ἀγωνίσωμαι. » Τοιαῦτα μὲν ἐκεῖνοι πρὸς ἀλλήλους ἅμα δειπνοῦντες ἔπαιζον·</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §4'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§4. Après que nous fûmes entrés, '''Thalès''' ayant déjà élevé plus haut la voix: « Où donc », dit-il, « l’avait-on placé, cet homme qui s’en est formalisé ? » Quand on lui eut montré l’endroit il fit le tour de la salle, et ce fut là-même qu’il se plaça et nous installa. « En vérité », ajouta-t-il, « j’aurais payé pour partager la même table qu’'''Ardalus'''. » Cet '''Ardalus''' était un joueur de flûte [[w:Trézène_(ville)|''Trézénien'']] [[#Trézène|<span id="Trézène_back"><sup>'''I'''</sup></span>]], prêtre des ''muses Ardalides'' auxquelles l’antique [[w:Ardalos|'''Ardalus''']] de ''Trézène'' avait dressé des statues.<br /><p style="text-align: centre">[...]<br /><p style="text-indent: 15px">Moi, j’étais au-dessus de '''Bias''', et '''Thalès''' m’ayant interpellé : « '''Dioclès''' », me dit-il, « pourquoi n’avez-vous pas dit à '''Bias''' que l’étranger de ''Naucratie'' est venu une seconde fois le trouver avec des questions de la part de son prince, afin que ce soit à jeun qu’il reçoive ces communications et qu’il y applique son esprit ? » Et '''Bias''' : « Il y a longtemps », dit-il, « que '''Dioclès''' me menace de m’y contraindre ; mais je sais que '''Bacchus''', entre autres attributions merveilleuses, possède une sagacité qui l’a fait surnommer le dieu qui délie, de sorte que je ne crains pas, étant rempli de la divinité, que la confiance m’abandonne au moment de la lutte. » C’est ainsi que, pendant le repas, ils échangeaient entre eux des plaisanteries.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §4'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> {{Boîte déroulante début|titre=NdA trad. par Victor Bétolaud de 1870|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Trézène_back|<span id="Trézène"><sup>I</sup></span>]] Du nom propre grec ancien Τροιζήν / Troizḗn [[wikt:en:Τροιζήν#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">[[w:polis|Cité grecque]] du [[w:Péloponnèse|''Péloponnèse'']], sur la côte nord de l’[[w:Argolide|Argolide]].'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe VII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexions de '''Thalès''' sur le défi de sagacité posé par le roi des ''Éthiopiens'' au roi d’''Égypte'', [[w:Ahmôsis_II|'''Amasis''']], consistant à boire la mer. Ce dernier fait appel à '''Bias''' pour la résoudre, et celui-ci souhaite l’examiner en commun avec les sages. '''Chilon''' explique qu’il ne s’agit pas de faire disparaître tant d’eau salée, mais de rendre la domination d’'''Amasis''' potable et douce à ses sujets (§6).</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§7. [...] Ἐπὶ τούτῳ δ´ ὁ '''Θαλῆς''' ἔφησεν, εὐδαιμονίαν ἄρχοντος νομίζειν, εἰ τελευτήσειε γηράσας κατὰ φύσιν.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §7'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§7. [...] Après lui '''Thalès''' prit la parole : « J’estime que le bonheur pour un souverain, c’est s’il meurt de vieillesse et naturellement. ».</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §7'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe IX.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexions de '''Thalès''' sur le défi de sagacité posé par le roi d’''Égypte'', [[w:Ahmôsis_II|'''Amasis''']], au roi des ''Éthiopiens'', consistant en une série de questions : « Qu’y a-t-il de plus ancien ? Le temps. — De plus grand ? Le monde. — De plus habile ? La vérité. — De plus beau ? La lumière. — De plus commun ? La mort. — De plus utile ? Dieu. — De plus nuisible ? Le mauvais Génie. — De plus puissant ? La Fortune. — De plus facile ? Le plaisir. ». '''Amasis''' fait encore appel à '''Bias''' pour analyser les réponses du roi des ''Éthiopiens'', qui les examinent également en commun avec les sages.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§9. Τούτων πάλιν ἀναγνωσθέντων, ὦ Νίκαρχε, γενομένης σιωπῆς Θαλῆς ἠρώτησε τὸν Νειλόξενον εἰ προσήκατο τὰς λύσεις ὁ Ἄμασις. ἐκείνου δ´ εἰπόντος ὅτι τὰς μὲν ἀπεδέξατο ταῖς δ´ ἐδυσκόλαινε, « καὶ μὴν οὐδέν, » εἶπεν ὁ Θαλῆς, « ἀνεπίληπτόν ἐστιν, ἀλλ´ ἔχει πάντα διαμαρτίας μεγάλας καὶ ἀγνοίας. οἷον εὐθὺς ὁ χρόνος πῶς ἂν εἴη πρεσβύτατον, εἰ τὸ μὲν αὐτοῦ γεγονὸς τὸ δ´ ἐνεστώς ἐστι τὸ δὲ μέλλον; ὁ γὰρ μεθ´ ἡμᾶς ἐσόμενος χρόνος καὶ πραγμάτων τῶν νῦν καὶ ἀνθρώπων νεώτερος ἂν φανείη. τὸ δὲ τὴν ἀλήθειαν ἡγεῖσθαι σοφίαν οὐδὲν ἐμοὶ δοκεῖ διαφέρειν τοῦ τὸ φῶς ὀφθαλμὸν ἀποφαίνειν. εἰ δὲ τὸ φῶς καλόν, ὥσπερ ἐστὶν, ἐνόμιζε, πῶς τὸν ἥλιον αὐτὸν παρεῖδε; τῶν δ´ ἄλλων ἡ μὲν περὶ θεῶν καὶ δαιμόνων ἀπόκρισις θράσος ἔχει καὶ κίνδυνον, ἀλογίαν δὲ καὶ πολλὴν ἡ περὶ τῆς τύχης· οὐ γὰρ ἂν μετέπιπτε ῥᾳδίως οὕτως, ἰσχυρότατον οὖσα τῶν ὄντων καὶ ῥωμαλεώτατον. οὐ μὴν οὐδ´ ὁ θάνατος κοινότατόν ἐστιν· οὐ γάρ ἐστι πρὸς τοὺς ζῶντας. ἀλλ´ ἵνα μὴ δοκῶμεν εὐθύνειν τὰς τῶν ἑτέρων ἀποφάσεις, ἰδίας ταῖς ἐκείνου παραβάλωμεν· ἐμαυτὸν δὲ παρέχω πρῶτον, εἰ βούλεται Νειλόξενος, ἐρωτᾶν καθ´ ἕκαστον. ὡς οὖν ἐγένοντο τότε, κἀγὼ νῦν διηγήσομαι τὰς ἐρωτήσεις καὶ τὰς ἀποκρίσεις· ‘Τί πρεσβύτατον;’ [[wikt:en:θεός#Ancient_Greek|‘θεός,’]] » ἔφη Θαλῆς· « ‘ἀγέν νητον γάρ ἐστι.’ ‘Τί μέγιστον;’ ‘τόπος· τἄλλα μὲν γὰρ ὁ κόσμος, τὸν δὲ κόσμον οὗτος περιέχει.’ ‘Τί κάλλιστον;’ ‘κόσμος· πᾶν γὰρ τὸ κατὰ τάξιν τούτου μέρος ἐστί.’ ‘Τί σοφώτατον;’ ‘χρόνος· τὰ μὲν γὰρ εὕρηκεν οὗτος ἤδη, τὰ δ´ εὑρήσει.’ ‘Τί κοινότατον;’ ‘ἐλπίς· καὶ γὰρ οἷς ἄλλο μηδέν, αὕτη πάρεστι.’ ‘Τί ὠφελιμώτατον;’ ‘ἀρετή· καὶ γὰρ τἄλλα τῷ χρῆσθαι καλῶς ὠφέλιμα ποιεῖ.’ ‘Τί βλαβερώτατον;’ ‘κακία· καὶ γὰρ τὰ πλεῖστα βλάπτει παραγενομένη.’ ‘Τί ἰσχυρότατον;’ ‘ἀνάγκη· μόνον γὰρ ἀνίκητον.’ ‘Τί ῥᾷστον;’ ‘τὸ κατὰ φύσιν, ἐπεὶ πρὸς ἡδονάς γε πολλάκις ἀπαγορεύουσιν.’ » </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §9'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§9. Cette lecture ainsi reproduite, mon cher '''Nicarque''', il se fit un moment de silence. Après quoi '''Thalès''' demanda à '''Niloxène''' si '''Amasis''' avait accepté de telles solutions. Il répondit que ce monarque avait accepté les unes et qu’il avait été mécontent des autres. « C’est qu’en effet », dit '''Thalès''', « il n’en est aucune qui soit irréprochable, et toutes sont grandement entachées d’erreur et d’ignorance. Ainsi, d’abord, comment le temps pourrait-il être ce qu’il y a de plus ancien, puisque, une partie étant écoulée, je le veux bien, une autre est le présent, une autre est l’avenir ? Le temps qui doit venir après nous est évidemment plus jeune que les hommes d’aujourd’hui, que les événements actuels. Croire que ce qu’il y a de plus habile, ce soit la vérité, c’est, à mon avis, ne pas émettre une autre opinion que celle-ci : l’oeil et la lumière sont tout un. Si du reste l’''Éthiopien'' a cru, ce qui est réel, la lumière plus belle que tout, pourquoi a-t-il négligé de nommer le soleil lui-même ? Des autres réponses, celle qui concerne la Divinité et le Génie est aussi téméraire que dangereuse ; et ce qu’il dit de la Fortune est tout à fait déraisonnable : car elle ne changerait pas avec tant de facilité, si elle était ce qu’il y a de plus puissant et de plus fort au monde. De même, la mort n’est pas ce qu’il y a de plus commun, puisqu’elle n’est pas commune aux vivants. Mais pour que nous ne semblions pas nous borner à redresser les réponses des autres, il faut y opposer nos propres solutions. Je m’y offre le premier, si '''Niloxène''' veut reprendre chaque question ». Telles que furent faites alors et les demandes et les réponses, je vais vous les reproduire aujourd’hui : Qu’y a-t-il de plus ancien ? C’est dieu, répondit '''Thalès''', attendu qu’il est incréé. — De plus grand ? L’espace : car si le monde contient le reste, à son tour il est contenu dans l’espace. — De plus beau ? Le monde : car tout ce qui est bien ordonné en fait partie. ― De plus habile ? Le temps : car c’est lui qui a découvert et qui découvrira tout. — De plus commun ? L’espérance : car ceux même qui n’ont rien autre chose la possèdent. — De plus utile ? La vertu : car elle rend toutes les autres choses utiles par le bon usage qu’elle en fait. — De plus nuisible ? Le vice : car il corrompt tout par sa présence. — De plus puissant ? La nécessité : car elle est seule invincible. De plus facile ? Ce qui est selon la nature : car, pour ce qui est du plaisir, il amène souvent la lassitude.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §9'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexion de '''Thalès''' sur les gouvernements où la loi est égale pour tous.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§11. Ἐπὶ τούτῳ '''Θαλῆς''' τὴν μήτε πλουσίους ἄγαν μήτε πένητας ἔχουσαν πολίτας.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §11'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§11. Après lui '''Thalès''' : « que c’est celle qui n’a ni des citoyens trop riches, ni des citoyens trop pauvres. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §11'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexion de '''Thalès''' sur la manière dont une maison doit être réglée.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§12. Τοῦτον οὖν ἄριστον ὁ '''Σόλων''' εἶπεν αὑτῷ δοκεῖν οἶκον, ὅπου τὰ χρήματα μήτε κτωμένοις ἀδικία μήτε φυλάττουσιν ἀπιστία μήτε δαπανῶσι μετάνοια πρόσεστιν. Ὁ δὲ '''Βίας''' ἐν ᾧ τοιοῦτός ἐστιν ὁ δεσπότης δι´ αὑτὸν οἷος ἔξω διὰ τὸν νόμον. Ὁ δὲ '''Θαλῆς''' ἐν ᾧ πλείστην ἄγειν τῷ δεσπότῃ σχολὴν ἔξεστιν.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §12'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§12. '''Solon''' déclara que, selon lui, « la meilleure maison est celle où le bien qui s’y trouve est possédé sans injustice, conservé sans défiance, dépensé sans repentir. » '''Bias''' : « celle où, à l’intérieur, le maître est, par respect pour lui-même, ce qu’il est au dehors par respect pour la loi. » '''Thalès''' : « celle où le maître peut avoir un très grand loisir. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §12'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XIV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de l’''espièglerie'' de '''Thalès'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§14. [...] '''Ἐπιστήσαντος''' δὲ τοῦ λόγου τὸ συμπόσιον ὁ μὲν '''Θαλῆς''' ἐπισκώπτων εὖ φρονεῖν ἔφη τὸν '''Ἐπιμενίδην''' ὅτι μὴ βούλεται πράγματα ἔχειν ἀλῶν τὰ σιτία καὶ πέττων ἑαυτῷ, καθάπερ '''Πιττακός'''. « ἐγὼ γάρ, » εἶπε, « τῆς ξένης ἤκουον ᾀδούσης πρὸς τὴν μύλην, ἐν [[w:Eresós|''Ἐρέσῳ'']] γενόμενος, ἄλει, μύλα, ἄλει· καὶ γὰρ '''Πιττακὸς''' ἄλει μεγάλας ''Μυτιλάνας'' βασιλεύων. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §14'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§14. [...] Ces paroles ayant mis en arrêt les convives, '''Thalès''' dit en raillant qu’'''Epiménide''' avait bien raison de ne pas vouloir se donner l’embarras de moudre et de cuire lui-même son manger, comme faisait '''Pittacus''' : « Car je me souviens », ajouta-t-il, « qu’étant à ''Lesbos'', j’entendis mon hôtesse chanter à sa meule : Va ton train, meule, va ton train, puisque '''Pittacus''', le roi de la grande ''Mitylène'', s’occupe bien à moudre. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §14'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une doctrine de '''Thalès''' sur l’importance vitale de l’agriculture.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§15. [...] « Οὐδαμῶς, » ὁ '''Κλεόδωρος''', « ἔμοιγ´, » εἶπεν, « εἰ δεῖ τὸ φαινόμενον εἰπεῖν, καὶ μάλιστα παρακειμένης τραπέζης, ἣν ἀναιροῦσιν αἰρομένης τροφῆς φιλίων θεῶν βωμὸν οὖσαν καὶ ξενίων. ὡς δὲ '''Θαλῆς''' λέγει τῆς γῆς ἀναιρεθείσης σύγχυσιν τὸν ὅλον ἕξειν κόσμον, οὕτως οἴκου διάλυσις ἐστι· συναναιρεῖται γὰρ αὐτῇ πῦρ ἑστιοῦχον ἑστία κρατῆρες ὑποδοχαὶ ξενισμοί, φιλανθρωπότατα καὶ πρῶτα κοινωνήματα πρὸς ἀλλήλους, μᾶλλον δὲ σύμπας ὁ βίος, εἴ γε διαγωγή τίς ἐστιν ἀνθρώπου πράξεων ἔχουσα διέξοδον, ὧν ἡ τῆς τροφῆς χρεία καὶ παρασκευὴ τὰς πλείστας παρακαλεῖ. [...] »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §15'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§15. [...] « S’il faut dire ce que je pense », reprit '''Cléodème''', « ce n’est nullement mon avis, et surtout quand est dressée la table, que l’on supprime si la nourriture est supprimée et qui est l’autel des dieux amis et hospitaliers. Et s’il est vrai, comme dit '''Thalès''', que la suppression de la terre dût entraîner le désordre et la ruine du monde entier, de même anéantir la table ce serait anéantir la maison. Avec la table disparaîtraient le feu qui consacre le foyer, le foyer lui-même, les coupes, les réceptions, les hospitalités, qui sont les plus affectueux et les premiers rapports de communauté entre les hommes; ou plutôt disparaîtrait la vie entière, s’il est vrai que la vie soit une sorte de courant formé par la série des actes de l’homme, actes dont le plus grand nombre est commandé par le besoin et la préparation de la nourriture.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §15'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XVII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une parole sage de '''Thalès''' : Ne croire ni ses ennemis sur les choses croyables, ni ses amis sur les choses incroyables.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§17. τέλος δὲ γελάσας πρὸς ἡμᾶς « βούλομαι μέν, » ἔφη, « πρὸς τὸ παρὸν φράσαι τὸ προσηγγελμένον· ὀκνῶ δ´ ἀκούσας '''Θαλέω''' ποτ´ εἰπόντος ὅτι δεῖ τὰ μὲν εἰκότα λέγειν, τὰ δ´ ἀμήχανα σιωπᾶν. » Ὑπολαβὼν οὖν ὁ '''Βίας''' « ἀλλὰ καὶ τοῦτ´, » ἔφη, « '''Θαλέω''' τὸ σοφόν ἐστιν, ὅτι δεῖ τοῖς μὲν ἐχθροῖς καὶ περὶ τῶν πιστῶν ἀπιστεῖν, τοῖς δὲ φίλοις καὶ τὰ ἄπιστα πιστεύειν, ἐχθροὺς μέν, ἔγωγ´ ἡγοῦμαι, τοὺς πονηροὺς καὶ ἀνοήτους, φίλους δὲ τοὺς χρηστοὺς καὶ φρονίμους αὐτοῦ καλοῦντος. οὐκοῦν, »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §17'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§17. [...] A la fin il s’adressa à nous en éclatant de rire : « Je voudrais vous faire connaître, sans plus attendre, ce que '''Gorgias''' vient de me conter; et pourtant j’hésite, parce que j’ai autrefois entendu dire à '''Thalès''' qu’il faut dire les choses vraisemblables et taire les impossibles. « Mais, reprit '''Bias''', « c’est à '''Thalès''' aussi qu’appartient cette sage parole : qu’il faut ne pas croire ses ennemis même sur les choses croyables, et croire ses amis même sur celles qui ne le sont pas : par ennemis il entendait, je suppose, les méchants et les sots, par amis, les gens vertueux et sensés. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §17'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XXI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une doctrine de '''Thalès''' sur la résidence de l'âme dans toutes les parties du monde les plus essentielles.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§21. Μετὰ δὲ τοῦτον ὁ '''Ἀνάχαρσις''' εἶπεν ὅτι τοῦ '''Θαλέω''' καλῶς ὑπολαμβάνοντος ἐν πᾶσιν εἶναι τοῖς κυριωτάτοις μέρεσι τοῦ κόσμου καὶ μεγίστοις ψυχήν, [...].</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §21'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§21. Après '''Pittacus''', '''Anacharsis''' prit la parole : « Puisque, comme '''Thalès''' l’a magnifiquement établi, une âme réside dans toutes les parties du monde les plus essentielles, [...].</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §21'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Du démon de '''Socrate''' ==== <div style="text-align: center; margin: 0 1em;"></div> ===== <div style="text-align: center;">Paragraphe VI.</div> ===== <div style="text-align: center; margin: 0 1em;">Témoignage de l’aversion de '''Thalès''' pour les [[w:Tyran|''tyrans'']].</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid;"><br /><div style="text-align: justify; margin: 0 2em; text-indent: 15px">§6. Ταῦτα τοῦ '''Θεοκρίτου''' λέγοντος ὁ '''Λεοντίδης''' ἐξῄει μετὰ τῶν φίλων, ἡμεῖς δ´ εἰσελθόντες ἠσπαζόμεθα τὸν '''Σιμμίαν''' ἐπὶ τῆς κλίνης καθεζόμενον οὐ κατατετευχότα τῆς δεήσεως, οἶμαι, μάλα σύννουν καὶ διαλελυπημένον· ἀποβλέψας δὲ πρὸς ἅπαντας ἡμᾶς ‘ὦ '''Ἡράκλεις''',’ εἶπεν ‘ἀγρίων καὶ βαρβάρων ἠθῶν· εἶτ´ οὐχ ὑπέρευ '''Θαλῆς''' ὁ παλαιὸς ἀπὸ ξένης ἐλθὼν διὰ χρόνου τῶν φίλων ἐρωτώντων ὅ τι καινότατον ἱστορήκοι ’τύραννον‘ ἔφη ’γέροντα.‘ καὶ γὰρ ᾧ μηδὲν ἰδίᾳ συμβέβηκεν ἀδικεῖσθαι, τὸ βάρος αὐτὸ καὶ τὴν σκληρότητα τῆς ὁμιλίας δυσχεραίνων ἐχθρός ἐστι τῶν ἀνόμων καὶ ἀνυπευθύνων δυναστειῶν.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome II, [https://remacle.org/bloodwolf/historiens/Plutarque/demonsocrategr.htm Περι του Σωκρατους Δαιμονιου - Le Démon de Socrate], §6'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§6. Pendant que [[w:Théocrite|'''Théocritos''']] [[#Théocrite|<span id="Théocrite_back"><sup>'''I'''</sup></span>]] parlait, '''Léontidas''' sortit avec ses amis, et nous entrâmes chez '''Simmias''', que nous saluâmes affectueusement. Il était assis sur son lit, et j’attribuai à l’insuccès de sa demande son air pensif et affligé. Après nous avoir regardés tous : « Par '''Hercule''' ! s’écria-t-il, quelles mœurs sauvages et barbares ! Eh bien ! n’avait-il pas cent fois raison le '''Thalès''' des anciens jours ? Comme il était revenu d’un long voyage à l’étranger, ses amis lui demandaient ce qu’il avait vu de plus curieux : « Un tyran parvenu à la vieillesse », répondit-il. Car ceux même qui n’ont pas éprouvé de la part d’un despote une injustice personnelle, supportent avec peine le poids et la dureté d’un semblable régime. On déteste tout pouvoir qui est en dehors de la loi et qui ne veut rendre de comptes à personne. [...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/74|Περι του Σωκρατους Δαιμονιου - Le Démon de Socrate]], [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/83|§6]]'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> {{Boîte déroulante début|titre=NdA de trad. Victor Bétolaud de 1870|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Théocrite_back|<span id="Théocrite"><sup>I</sup></span>]] Du nom propre grec ancien Θεόκριτος / Theókritos [[wikt:en:Θεόκριτος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ de l’adjectif et du nom commun θεός / theós [[wikt:en:θεός#Ancient_Greek|(en)]], « divin, dieu, divinité »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du verbe κρίνω / krínō, « 1. (transitif) Séparer, diviser, distinguer entre deux choses ou personnes ou parmi un groupe de choses ou de personnes. 2. (transitif) Commander, organiser. 3. S’enquérir, enquêter. 4. Sélectionner, choisir, préférer. 5. (transitif) Trancher un différend ou un concours ; (intransitif) Porter un jugement, prendre une décision : • (voix moyenne, voix passive) Décider d’un concours ; (voix moyenne et voix passive) Se disputer, se disputer, se quereller. 6. Décider ou juger [+accusatif et infinitif = que quelque chose fait quelque chose], [+accusatif et accusatif = que quelque chose est quelque chose]. 7. Discerner entre le bien et le mal. 8. Juger, prononcer. 9. Traduire en justice, accuser. 10. Condamner, critiquer. 11. Sécréter, cacher, dissimuler. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + le suffixe adjectival récessif‎ -τος / -tos [[wikt:en:-τος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">''Poète'', auteur de [[w:Mime|''mimes'']] (imitations comiques du langage ou des gestes), d’[[w:Poésie_pastorale|''idylles pastorales'']] et de [[w:Épopée|''contes épiques'']].<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:310_av._J.-C.|-310]]<sup>[[w:IVe_siècle_av._J.-C.|⏳]]</sup>, à [[w:Théocrite#cite_ref-2|''Syracuse'']] — {{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}} [[w:250_av._J.-C.|-250]]<sup>[[w:IIIe_siècle_av._J.-C.|⏳]]</sup>)'''<br /><br /> </div>{{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">§6. Pendant que '''Théocritos''' discourait ainsi, '''Léontidas''' sortit avec ses amis ; nous entrâmes et saluâmes '''Simmias''', qui était assis sur son lit, tout soucieux et triste, parce que sa demande avait été rejetée sans doute. En nous regardant tous, il s’écria : « '''Héraclès''' ! les moeurs sauvages et barbares ! Ah ! que '''Thalès''' l’ancien avait raison de répondre, lorsqu’après un long voyage à l’étranger ses amis lui demandaient ce qu’il avait remarqué de plus extraordinaire : « Un tyran âgé ». Même un homme qui a eu la chance de n’être pour son compte victime d’aucune injustice exècre déjà le poids et la dureté de ce commerce et est ennemi des dictatures, des dominations arbitraires.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome II, [https://remacle.org/bloodwolf/historiens/Plutarque/demonsocrate.htm Περι του Σωκρατους Δαιμονιου - Le Démon de Socrate], §6'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Les [[w:Alimentation_en_Grèce_antique#Banquets|''Symposiaques'']] [[#Symposiaques|<span id="Symposiaques_back"><sup>'''I'''</sup></span>]], ou questions de table ==== <div style="text-align: center; margin: 0 1em;"></div> {{Boîte déroulante début|titre=NdA Symposiaques|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Symposiaques_back|<span id="Symposiaques"><sup>I</sup></span>]] Du nom commun grec ancien συμπόσιον / sympósion [[wikt:en:συμπόσιον#Ancient_Greek|(en)]], « Seconde partie d’un repas pendant laquelle un groupe restreint de convives buvaient et discutaient sur un sujet. » ; <br /><p style="margin: 0 2em; text-indent: 15px;">➥ du nom commun σῠμπότης / sŭmpótēs [[wikt:en:συμπότης#Ancient_Greek|(en)]], « compagnon de boisson » ; <br /><p style="margin: 0 4em; text-indent: 15px;">➥ du préfixe σῠν- / sŭn- [[wikt:en:συν-#Ancient_Greek|(en)]], « avec, ensemble » ;<br /><p style="margin: 0 4em; text-indent: 15px;">➥ +‎ du nom commun ποτής / potḗs [[wikt:en:ποτής#Ancient_Greek|(en)]], « boisson » ;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du suffixe -ῐον / -ĭon [[wikt:en:-ιον#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px;">Entretiens dans un banquet, propos de table. '''<br /><br /> </div>{{Boîte déroulante fin}} ===== <div style="text-align: center;">Livre III</div> ===== <div style="text-align: center; margin: 0 1em;"></div> ====== <div style="text-align: center;">Question VI. Sur le temps où il est à propos de se rapprocher d’une femme.</div> ====== <div style="text-align: center; margin: 0 1em;">Témoignage du statut marital de '''Thalès''' et de sa relation avec sa mère</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid;"><br /><div style="text-align: justify; margin: 0 2em; text-indent: 15px">Καθάπερ οὖν '''Θαλῆς''' ὁ σοφὸς ὑπὸ τῆς μητρὸς ἐνοχλούμενος γῆμαι κελευούσης πῶς ὑπεξέφυγε παρήγαγε λέγων πρὸς αὐτὴν ἐν ἀρχῇ μέν « οὔπω καιρὸς ὦ μῆτερ, » ὕστερον δ´ « οὐκέτι καιρὸς ὦ μῆτερ », οὕτως ἄρα καὶ πρὸς ἀφροδίσια κράτιστον {ἔσται} ἔχειν ἕκαστον, ὥστε κατακλινόμενον λέγειν «οὔπω καιρός», ἀνιστάμενον δ´ « οὐκέτι καιρός ».</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [https://remacle.org/bloodwolf/historiens/Plutarque/sympos3.htm#VI Προβλημα Ϛ. Περὶ καιροῦ συνουσίας. - Question VI. Quel est le temps le plus propre à l'amour?]'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div></div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§3. Ainsi donc, comme le sage '''Thalès''', fatigué par sa mère qui l’engageait à se marier, trouva le moyen de lui échapper et de lui donner le change en lui disant une première fois : « Il n’est pas encore temps, ma mère », et, lorsqu’elle insistait encore après qu’il avait passé l’âge : « Il n’est plus temps » ; de même, pour ce qui regarde les plaisirs de l’amour, le mieux sera que chacun se détermine à dire, en se mettant au lit : « Il n’est pas temps encore », et, en sortant du lit : « il n’est plus temps ».</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/268|Question VI. Sur le temps où il est à propos de se rapprocher d’une femme]], [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/271|§3]]'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Le sage '''Thalès''', pressé par sa mère de se marier, lui répondit avec beaucoup d’adresse. Au commencement, il lui dit : Ma mère, il n’est pas encore temps. Quand il eut passé la fleur de son âge, et qu’elle lui fit de nouvelles instances, il lui répondit : Il n’est plus temps. De même, par rapport à la question proposée, le mieux serait que chacun pût se dire le soir en se couchant : Il n'm’est pas encore temps ; et le matin, quand il se lève : Il n’est plus temps. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [https://remacle.org/bloodwolf/historiens/Plutarque/sympos3.htm#VI Προβλημα Ϛ. Περὶ καιροῦ συνουσίας. - Question VI. Quel est le temps le plus propre à l'amour?]'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== De la malignité d’'''Hérodote''' ==== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Les opinions des Philosophes ==== <div style="text-align: center; margin: 0 1em;"></div> ===== <div style="text-align: center;">Livre I</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ===== <div style="text-align: center;">Livre II</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ===== <div style="text-align: center;">Livre III</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ===== <div style="text-align: center;">Livre IV</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Les animaux de terre ont-ils plus d'adresse que ceux de mer? ==== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== D’'''Isis''' et d’'''Osiris'''==== <div style="text-align: center; margin: 0 1em;"></div> ===== <div style="text-align: center;">Paragraphe IX.</div> ===== <div style="text-align: center; margin: 0 1em;">Témoignage d’un voyage de '''Thalès''' en ''Égypte'', de rencontres avec des prêtres et de récit sur leur divinités.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid;"><br /><div style="text-align: justify; margin: 0 2em; text-indent: 15px">§9. [...] '''Ἑκαταῖος''' δ´ ὁ ''Ἀβδηρίτης'' φησὶ τούτῳ καὶ πρὸς ἀλλήλους τῷ ῥήματι χρῆσθαι τοὺς ''Αἰγυπτίους'', ὅταν τινὰ προσκαλῶνται· προσκλητικὴν γὰρ εἶναι τὴν φωνήν. Διὸ τὸν πρῶτον θεόν, ὃν τῷ παντὶ τὸν αὐτὸν νομίζουσιν, ὡς ἀφανῆ καὶ κεκρυμμένον ὄντα προσκαλούμενοι καὶ παρακαλοῦντες ἐμφανῆ γενέσθαι καὶ δῆλον αὐτοῖς ''Ἀμοῦν'' λέγουσιν.<br /><p style="text-indent: 15px">§10. Ἡ μὲν οὖν εὐλάβεια τῆς περὶ τὰ θεῖα σοφίας '''Αἰγυπτίων''' τοσαύτη {ἦν}, μαρτυροῦσι δὲ καὶ τῶν ''Ἑλλήνων'' οἱ σοφώτατοι, '''Σόλων''' '''Θαλῆς''' '''Πλάτων''' '''Εὔδοξος''' '''Πυθαγόρας''', ὡς δ´ ἔνιοί φασι, καὶ '''Λυκοῦργος''' εἰς ''Αἴγυπτον'' ἀφικόμενοι καὶ συγγενόμενοι τοῖς ἱερεῦσιν.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1870<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm ici])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§9. [...] '''Hécatée''' d’''Abdère'' dit que les ''Égyptiens'' emploient ce mot pour s’appeler les uns les autres, attendu qu’il est essentiellement appellatif. C’est pourquoi, s’adressant au premier Dieu, le même, selon eux, que l’Univers, comme à un être invisible et caché, ils l’exhortent avec supplications, en l’appelant "Amoun", à se faire voir et à se découvrir à eux. Voilà jusqu’à quel point était grande la réserve qui caractérisait la philosophie religieuse des ''Égyptiens''.<br /><p style="text-indent: 15px">§10. C’est ce que témoignent les plus éclairés d’entre les ''Grecs'': '''Solon''', '''Thalès''', '''Platon''', '''Eudoxe''', '''Pythagore''', et aussi, d’après quelques-uns, '''Lycurgue'''. Ils étaient allés en ''Égypte'' et avaient eu des conférences avec les prêtres. [...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §§9, 10'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870<br/>(également disponible [[s:Sur_Isis_et_Osiris|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">§9. [...] '''Hécatée''' d’''Abdère'' dit que les ''Egyptiens'' s’en servent pour s’appeler les uns les autres; que ce nom est de sa nature appellatif ; que ce peuple , qui croit que le premier des dieux, qu’il confond avec l’univers, est un dieu caché et inconnu, l’invoque et le prie de se découvrir à eux, en lui disant ''Amoun'' ;<br /><p style="text-indent: 15px">§10. tant ce peuple portait de retenue et de réserve dans sa philosophie religieuse ! C’est ce qu'attestent unanimement les plus sages d’entre les ''Grecs'', '''Solon''', '''Thalès''', '''Platon''', '''Eudoxe''', '''Pythagore''', et, suivant quelques uns, '''Lycurgue''' lui-même, qui tous voyagèrent en ''Egypte'', et y conférèrent avec les prêtres du pays.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §§9, 10'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XXXIV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la théorie de '''Thalès''' de l’eau principe de tous les êtres.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§34. Ἥλιον δὲ καὶ Σελήνην οὐχ ἅρμασιν ἀλλὰ πλοίοις ὀχήμασι χρωμένους περιπολεῖν φασιν αἰνιττόμενοι τὴν ἀφ´ ὑγροῦ τροφὴν αὐτῶν καὶ γένεσιν. Οἴονται δὲ καὶ '''Ὅμηρον''' ὥσπερ '''Θαλῆν''' μαθόντα παρ´ ''Αἰγυπτίων'' ὕδωρ ἀρχὴν ἁπάντων καὶ γένεσιν τίθεσθαι· τὸν γὰρ '''Ὠκεανὸν''' '''Ὄσιριν''' εἶναι, τὴν δὲ '''Τηθὺν''' '''Ἶσιν''' ὡς τιθηνουμένην πάντα καὶ συνεκτρέφουσαν. [...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1870<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm ici])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§34. Ils disent que le soleil et la lune parcourent leur route perpétuelle non pas sur des chars, mais sur des bâtiments de navigation: signifiant par là, que c’est le principe humide qui les entretient et qui leur a donné naissance. Ils croient aussi que c’est des ''Egyptiens'' qu’'''Homère''', et après lui '''Thalès''', ont appris à établir l’eau comme principe générateur de tous les êtres. Ils veulent qu’'''Osiris''' soit l’'''Océan''', qu’'''Isis''' soit '''Téthys''', laquelle nourrit et entretient tout ce qui existe.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870<br/>(également disponible [[s:Sur_Isis_et_Osiris|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">§34. Ils disent que le soleil et la lune parcourent les cieux, portés, non sur des chars, mais sur des vaisseaux, pour signifier que tout est nourri et mis en mouvement par l’eau. Ils pensent que c’est des ''Egyptiens'' qu’'''Homère''' et '''Thalès''' avaient pris cette opinion, que l’eau est le principe de tous les êtres, qu’'''Osiris''' est l’'''Océan''', et qu’'''Isis''' est '''Thétis''', qui nourrit et alimente toutes les substances.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Valère_Maxime|'''Valère Maxime''']] ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ier_siècle|I<sup>er</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Valère_Maxime|<sup>📚</sup>]] == === Actions et paroles mémorables, VII, § 2 === :8. Il y a aussi un mot admirable de Thalès. On lui demandait si les actions des hommes échappaient à la connaissance des dieux. "Leurs pensées non plus", répondit-il. Aussi faut-il nous appliquer à avoir, je ne dis pas seulement les mains, mais encore le cœur pur, dans la persuasion que la divinité est témoin des mouvements les plus secrets de nos âmes. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Tatien_le_Syrien|'''Tatien''']] le [[w:Assyrie_(province_romaine)|''Syrien'']] ''(vers [[w:120|120]], en [[w:Halicarnasse|''Halicarnasse'']] en [[w:Assyrie_(province_romaine)|Assyrie]] — vers [[w:173|173]], en Assyrie)'' <sup>[[w:IIe_siècle|⏳]]</sup> [[s:Auteur:Tatien_le_Syrien|<sup>📚</sup>]] == === Discours aux Grecs, 41 === = [[w:Lucien_de_Samosate|'''Lucien de Samosate''']] ''(vers [[w:120|120]], à [[w:Samosate|Samosate]] — vers [[w:180|180]], en [[w:Égypte_romaine_et_byzantine|Égypte]])'' <sup>[[w:IIe_siècle|⏳]]</sup> [[s:Auteur:Lucien_de_Samosate|<sup>📚</sup>]] = === Dialogues des morts === https://gallica.bnf.fr/ark:/12148/bpt6k6227866x/f7.item https://gallica.bnf.fr/ark:/12148/bpt6k6227866x/f103.double === Hippias ou le bain === :(2) Mon but est de prouver que les constructeurs de machines qui méritent le plus notre admiration sont ceux qui, distingués par leur science théorique, ont laissé en outre à la postérité des monuments de leur art et des œuvres de leur génie, tandis que les hommes, qui se sont seulement exercés dans la parole méritent plutôt le nom de sophistes que celui de savants. C'est sur la liste traditionnelle de ces artistes que nous voyons figurer Archimède et Socrate de Cnide, qui inventèrent, l'un les moyens de soumettre à Ptolémée la ville de Memphis, sans recourir à un siège, mais en détournant et en divisant le cours du Nil ; l'autre, ceux d'incendier les galères des ennemis. Avant eux, Thalès de Milet, ayant promis à Crésus de faire passer à pied sec à son armée les eaux du fleuve Halys, imagina de les détourner en une seule nuit derrière le camp ; et pourtant ce n'était pas un mécanicien de profession, mais un sage d'un esprit inventif et à l'intelligence duquel on pouvait s'en rapporter. === Exemples de longévité === :(18) Solon, Thalès et Pittacus, que l'on compte au nombre des Sept sages, vécurent chacun cent années. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Clément_d%27Alexandrie|'''Clément''']] d'[[w:Histoire_d%27Alexandrie#Annexion|''Alexandrie'']] ''(vers [[w:150|150]]'' <sup>[[w:IIe_siècle|⏳]]</sup>'', à [[w:Athènes#Antiquité|Athènes]] — vers [[w:215|215]]'' <sup>[[w:IIIe_siècle|⏳]]</sup>'', à [[w:Kayseri|Kayseri]])'' [[s:Auteur:Clément_d’Alexandrie|<sup>📚</sup>]] == === Stromates, I, 65 === <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Claude_Élien|'''Claude Élien''']] ''(vers [[w:175|175]]''<sup>[[w:IIe_siècle|⏳]]</sup>'', à [[w:Préneste|Préneste]] — vers [[w:235|235]]''<sup>[[w:IIIe_siècle|⏳]]</sup>'', en [[w:Rome_antique|Rome]])'' [[s:Auteur:Élien_le_sophiste|<sup>📚</sup>]] == === Histoires diverses === :On a vu des philosophes à la tête des affaires publiques : d'autres, se bornant à cultiver leur raison, ont passé leur vie dans le repos. Entre les premiers sont Zaleucus et Charondas qui réformèrent, l'un, le gouvernement des Locriens, l'autre, d'abord celui des Catanéens, puis, après qu'il eut été exilé de Catane, celui des Rhéginiens. Archytas servit utilement les Tarentins. Les Athéniens durent tout à Solon. Bias et Thalès rendirent les mêmes services à l'Ionie, Chilon à Lacédémone, Pittacus à Mitylène, Cléobule à Rhodes. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Sextus_Empiricus|'''Sextus Empiricus''']] ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:IIe_siècle|II<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Sextus_Empiricus|<sup>📚</sup>]] == Hypot III, 30, et Liv I contre les phys., sect. 319 https://gallica.bnf.fr/ark:/12148/bpt6k9796311p/f305.item.r=thales <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Lactance|'''Lactance''']] ''(vers [[w:250|250]]''<sup>[[w:IIIe_siècle|⏳]]</sup>'', à [[w:Henchir_Kssiba#Histoire|Civitas Popthensis]] — vers [[w:325|325]]''<sup>[[w:IVe_siècle|⏳]]</sup>'', en [[w:Gaule#La_Gaule_dans_l'Antiquité_tardive|Gaule]])'' == Épit. 4 (https://gallica.bnf.fr/ark:/12148/bpt6k282068z/f300.image.r=thales) Inst. 111, 16 (https://gallica.bnf.fr/ark:/12148/bpt6k282068z/f621.item.r=thales) <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Jamblique|'''Jamblique''']] ''(vers [[w:250|250]]''<sup>[[w:IIIe_siècle|⏳]]</sup>'', à [[w:Qinnasrīn|Chalcis ad Belum]] — vers [[w:333|333]]''<sup>[[w:IVe_siècle|⏳]]</sup>'')'' == === Vie de Pythagore === ==== chap. II ==== (https://web.archive.org/web/20110721184914/http://www.aurumsolis.info/index.php?option=com_phocadownload&view=category&download=1%3Aiamblichus-the-pythagorean-life&id=19%3Awritings-from-the-founders&Itemid=143&lang=en) <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Eusèbe_de_Césarée|'''Eusèbe''']] de [[w:Césarée#Césarée_au_début_du_christianisme|''Césarée'']] ''(vers [[w:265|265]]'' <sup>[[w:IIIe_siècle|⏳]]</sup>'', à Césarée — [[w:340|340]]'' <sup>[[w:IVe_siècle|⏳]]</sup>'', à Césarée)'' [[s:Auteur:Eusèbe_de_Césarée|<sup>📚</sup>]] == Preparation Évangélique, XI, 2 Prepar. évang. I, 8, page 22-25 https://gallica.bnf.fr/ark:/12148/bpt6k9796311p/f310.image.r=thales <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Diogène_Laërce|'''Diogène Laërce''']] ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Diogène_Laërce|<sup>📚</sup>]] == ''Ce texte est un extrait de la traduction de Robert Genaille (1933)'' Thalès[1], au dire d’Hérodote, de Douris et de Démocrite, était fils d’Examios et de Cléobuline, et membre de la famille des Thélides, Phéniciens descendant en droite ligne d’Agénor[2] et de Cadmus[3], s’il faut en croire Platon. Le premier, il porta le nom de sage, au temps où Damasias était archonte à Athènes[4]. C’est sous le même archontat que fut créée l’expression : « les sept sages » (cf. Démocrite de Phalère, Registre des Archontes). Thalès fut inscrit comme citoyen de Milet quand il vint dans cette ville avec Nélée chassé de Phénicie. Une autre tradition très courante veut qu’il soit natif de Milet et qu’il descende d’une bonne famille. Il s’occupa de politique avant d’étudier la nature. On croit qu’il ne laissa aucun écrit, car l’Astrologie nautique qu’on lui attribue est de Phocos de Samos. Callimaque[5] croit qu’il découvrit la Petite Ourse et le raconte en vers iambiques : Il mesura, dit-on, les étoiles du Chariot Sur quoi les Phéniciens règlent leur navigation. D’autres auteurs disent qu’il écrivit seulement deux ouvrages, un sur le solstice et un sur l’équinoxe, car il pensait le reste inaccessible. Il passe pour avoir le premier étudié l’astrologie et prédit les éclipses de soleil et les solstices (cf. Eudème, Histoire de l’astrologie)[6]. Xénophane et Hérodote le louent à ce propos, et leur témoignage est confirmé par celui d’Héraclite et de Démocrite. On dit encore (cf. le poète Choirilos) qu’il fut le premier à affirmer l’immortalité des âmes. Le premier il dessina la course du soleil d’un solstice à l’autre, et démontra que comparée au soleil, la lune en est la cent vingtième partie. C’est encore lui qui fixa à trente jours la durée du mois, et qui écrivit le premier traité sur la Nature. Aristote et Hippias disent aussi qu’il accordait une âme aux choses qu’on croit inanimées ; il en donnait pour preuve l’ambre et la pierre de Magnésie. Selon Pamphile[7], il apprit des Égyptiens la géométrie, inscrivit dans un cercle le triangle rectangle, et pour cette découverte immola un bœuf. D’autres, comme Apollodore le calculateur, attribuent cette invention à Pythagore. Thalès a encore développé et précisé l’invention du Phrygien Euphorbe citée par Callimaque dans ses Iambes et concernant le triangle scalène, et tout ce qui touche aux considérations sur les lignes. Il semble encore avoir été en politique un homme de bon conseil. Ainsi, quand Crésus[8] envoya une ambassade aux Milésiens pour demander leur alliance, il s’y opposa, et son intervention sauva la ville, puisque Cyrus l’emporta. Héraclite cite une opinion de Clytos selon laquelle Thalès aurait eu une vie retirée et solitaire. Les uns disent qu’il se maria et eut un fils nommé Kibissos. D’autres prétendent qu’il resta célibataire et adopta le fils de sa sœur, qu’on lui demanda un jour pourquoi il ne cherchait pas à avoir des enfants, et qu’il répondit : « Par amour pour les enfants. » Sa mère l’exhortait à se marier, il lui répondit : « Non, par Zeus, il n’est pas encore temps. » Elle l’y invita une nouvelle fois quand il eut pris de l’âge, mais il lui dit : « Il n’est plus temps. » D’après Hiéronyme de Rhodes (Notes, livre II), il voulut montrer combien il était facile de s’enrichir ayant prévu pour l’année une abondante récolte d’huile, il prit à loyer une oliveraie et gagna beaucoup d’argent[9]. Il soupçonna que l’eau était le principe des choses, que le monde était animé et rempli de démons. On dit qu’il découvrit les saisons de l’année, et qu’il la divisa en trois cent soixante-cinq jours. Il ne suivit les leçons d’aucun maître, sauf en Égypte, où il fréquenta les prêtres du pays. A ce propos, Hiéronyme dit qu’il mesura les Pyramides en calculant le rapport entre leur ombre et celle de notre corps. Si l’on en croit Minuès, il vivait au temps de Thrasybule, qui fut tyran de Milet[10]. L’histoire du trépied trouvé par des pêcheurs et dédié aux sages par le peuple de Milet est bien connue. Des jeunes gens d’Ionie achetèrent à des pêcheurs milésiens leur coup de filet. Ils tirèrent de l’eau un trépied. On se querella et les Milésiens envoyèrent une ambassade à Delphes. Voici quel fut l’oracle de la divinité : Race de Milet, tu interroges Phébus au sujet d’un trépied ? Au plus sage de tous, je donne ce trépied[11]. Ils le donnent alors à Thalès, qui le donne à un autre, et cet autre à un autre, et ainsi de suite jusqu’à Solon, qui, déclarant que seul le dieu était le plus sage de tous, rendit le trépied à Delphes. Callimaque, dans ses Iambes, rapporte cette histoire autrement ; il la tient de Léandre de Milet. Il dit qu’un certain Bathyclès d’Arcadie laissa en mourant une coupe pour qu’elle fût donnée à l’homme le plus sage. Elle fut donc donnée à Thalès, et après être passée de main en main et avoir fait le tour des sages, elle revint à Thalès. Celui-ci en fit don alors à Apollon de Didyme, en ces termes selon le poème de Callimaque : Thalès me donne au protecteur du peuple du Nil, Thalès qui a reçu deux fois ce présent, ce qui, en prose, se dit ainsi : « Thalès de Milet, fils d’Examios, à Apollon delphien, ce présent qu’il a reçu deux fois des Grecs. » Celui qui portait la coupe de sage en sage, le fils de Bathyclès, s’appelait Thyrion (cf. Éleusis, Livre sur Achille, et Alexon de Mynde, Fables, livre IX). Eudoxe de Cnide et Évanthès de Milet disent de leur côté qu’un ami de Crésus reçut du roi un vase d’or, pour le donner au plus sage des Grecs, qu’il le donna à Thalès et que ce vase parvint jusqu’à Chilon. Celui-ci consulta la Pythie, pour savoir qui était plus sage que lui. Elle répondit que c’était Myson (je parlerai de lui : Eudoxe le met parmi les sages à la place de Cléobule et Platon à la place de Périandre.) Voici la réponse que lui fit la Pythie : Il y a un habitant de l’Oeta, Myson, né à Chénée, Qui plus que toi est riche de sages pensées. L’homme qui consulta l’oracle pour Chilon s’appelait Anacharsis. Dédale le Platonicien et Cléarque disent que la coupe fut envoyée par Crésus à Pittacos, et que c’est ainsi qu’elle passa de main en main. D’après Andron, d’autre part (Livre du trépied), les Argiens décidèrent que le trépied serait attribué comme prix de vertu au plus sage des Grecs. Aristodème de Sparte fut choisi et c’est lui qui donna le trépied à Chilon. Alcée est aussi partisan d’Aristodème dont il parle dans les vers suivants : :Comme jadis Aristodème, dit-on, :Prononça à Sparte cette parole bien juste : :C’est de l’argent, un homme, oui de l’argent, :Car l’homme vertueux n’est jamais pauvre. D’autres disent encore que Périandre envoya à Thrasybule, tyran de Milet, un navire chargé, que ce navire fit naufrage dans la mer de Cos, et que quelque temps après le trépied fut trouvé par des pêcheurs. Phanodicos dit que le trépied fut trouvé dans la mer Attique, porté à la ville, et que l’assemblée du peuple s’étant réunie le fit porter à Bias. Pourquoi cela, je le dirai quand je parlerai de Bias. Selon d’autres auteurs, le trépied avait été fabriqué par Héphaïstos et donné en présent de la part de ce dieu à Pélops lors de son mariage. Il vint ensuite à Ménélas, fut enlevé avec Hélène par Alexandre, jeté dans la mer de Cos à l’instigation de la Spartiate qui prévoyait qu’il serait un sujet de querelle. Plus tard, en ce lieu, des Lébédiens achetèrent le produit d’un coup de filet et c’est le trépied qui fut tiré de l’eau. Il y eut querelle avec les pêcheurs, on vint jusqu’à Cos, et comme on ne s’accordait pas, on s’adressa à Milet, qui était la capitale. Les Milésiens envoyèrent des députés qui ne furent pas écoutés, aussi firent-ils la guerre aux gens de Cos. Comme de chaque côté il mourait beaucoup de gens, l’oracle déclara qu’il fallait donner le trépied au plus sage. Les deux camps s’entendirent alors pour l’attribuer à Thalès, qui par la suite le consacra à Apollon de Didyme. Pour en revenir à la réponse de l’oracle aux gens de Cos, elle disait ceci : La querelle entre Ioniens et Méropes ne cessera pas Avant que le trépied d’or qu’Héphaïstos jeta dans la mer N’ait quitté votre ville pour la maison de l’homme Qui connaît le présent, l’avenir et le passé. La réponse aux Milésiens fut la suivante : Race de Milet, tu interroges Phoebus au sujet d’un trépied... comme il a été dit plus haut. En voilà assez sur ce sujet[12]. Hermippe, dans ses Vies, rapporte à Thalès ce qui est dit par d’autres de Socrate : il aimait à dire qu’il remerciait la fortune de trois choses : d’être un humain et non une bête, d’être un homme et non une femme, enfin d’être un Grec, et non un barbare. On raconte encore qu’étant sorti de chez lui pour contempler les astres, il tomba dans un puits[13]. Une vieille femme survenant se moqua de lui en ces mots : « Comment, Thalès, toi qui n’es pas capable de voir ce qui est à tes pieds, t’imagines-tu pouvoir connaître ce qui est dans le ciel ? » Timon[14] a bien connu aussi la science de Thalès en astronomie, et dans ses Silles, il le loue en ces termes : Comme Thalès, un des sept sages, qui fut savant astronome. L’Argien Lobon dit que ses écrits font un total de quelque deux cents vers, et que sous sa statue on écrivit : Thalès de Milet repose ici dans le sol qui l’a nourri, Il fut un sage, et le premier des astrologues. Voici un de ses poèmes : Le trop parler n’est pas marque d’esprit. Trouvez une seule chose sage, Choisissez une seule chose belle, Et vous clouerez le bec à bien des bavards. On lui attribue encore les sentences suivantes : de tous les êtres, le plus ancien, c’est Dieu, car il n’a pas été engendré ; le plus beau, c’est le monde, car il est l’ouvrage du dieu ; le plus grand, c’est l’espace, car il contient tout ; le plus rapide, c’est l’esprit, car il court partout ; le plus fort, c’est la nécessité, car elle vient à bout de tout ; le plus sage, c’est le temps, parce qu’il découvre tout. La mort, dit-il, ne diffère en rien de la vie. On lui répond : « Pourquoi, alors, ne te donnes-tu pas la mort ? » ; « Parce que vie ou mort, c’est tout un », réplique-t-il. Quelqu’un lui demande ce qui du jour ou de la nuit fut créé d’abord ; il répond : « La nuit est en avance d’un jour. » On lui demande si les mauvaises actions d’un homme échappent au regard des dieux. Il répond : « Ils voient même les mauvaises pensées. » Un homme adultère lui demandait s’il pouvait jurer qu’il n’avait pas commis d’adultère. Il répondit : « Le parjure n’est pas pire que l’adultère. » On lui demandait ce qui était difficile : « Se connaître » dit-il ; ce qui était facile : donner un conseil à autrui ; ce qui était le plus doux : jouir ; ce que c’était que la divinité : un être sans commencement ni fin ; encore une chose difficile : voir un tyran âgé ; comment supporter aisément l’infortune : en voyant ses ennemis plus malheureux encore ; comment vivre vertueusement : en ne faisant pas ce que nous reprochons à autrui ; qui est heureux : l’homme bien portant, riche, courageux et instruit. Il disait encore que l’on doit penser à ses amis aussi bien en leur absence qu’en leur présence, que la beauté ne vient pas d’un beau visage, mais de belles actions. « Ne t’enrichis pas injustement, conseillait-il, et veille à ne pas être cité en justice pour de mauvaises paroles contre tes proches et tes amis. Comme tu traites tes parents, tes enfants te traiteront. » Du Nil[15] il disait qu’il débordait quand ses eaux étaient repoussées par les vents étésiens qui soufflent contre son cours. Apollodore dans ses Chroniques dit que Thalès naquit la première année de la trente-cinquième olympiade[16]. Il mourut dans sa soixante-dix-huitième année ou, comme le dit Sosicrate, dans sa quatre-vingt-dixième année, car ce fut dans la cinquante-huitième olympiade. Il vécut du temps de Crésus, auquel il promit de faire traverser l’Hallys[17] sans pont, en détournant le cours du fleuve. Il y eut cinq autres personnages du nom de Thalès (cf. Démétrios de Magnésie, Homonymes) : un rhéteur de Callatie, au style prétentieux, un peintre de Sicyone, de noble origine, un troisième, très ancien, du temps d’Hésiode, d’Homère et de Lycurgue, un quatrième, mentionné par Douris dans son traité de la peinture, un cinquième, plus jeune et peu connu, cité par Denys dans ses Critiques. Pour en revenir à notre sage, il mourut en regardant les jeux gymniques, pour avoir eu trop chaud et trop soif et par suite de sa fatigue et de son grand âge. Voici son épitaphe : :Ce tombeau, certes, est bien petit, :Mais la renommée de l’homme est allée au ciel. :C’est celui de Thalès le très sage. J’ai écrit sur lui les vers suivants dans le premier livre de mes épigrammes ou « vers de mètres divers[18] : :Tandis qu’il regardait les jeux, ô Zeus Hélios, :Tu as ravi du stade le sage Thalès. :Je te loue de l’avoir rapproché du ciel. Il était si vieux :Que de la terre il ne pouvait plus voir les astres. Thalès est l’auteur du fameux « connais-toi toi-même » qu’Antisthène (Livre des Filiations) attribue à Phémonoé, en déclarant que Chilon se l’appropria mensongèrement. Sur les sept sages, qu’il est juste de citer maintenant l’un après l’autre, voici la tradition. Damon de Cyrène, qui blâme tous les philosophes dans ses écrits, s’attaque surtout aux sept sages. Anaximène dit que tous étaient poètes. Dicéarque dit qu’ils n’étaient ni sages ni philosophes, mais hommes d’esprit et législateurs. Archétimos de Syracuse a décrit leurs assemblées chez Cypsélos[19] et dit qu’il y assista personnellement. Euphoros dit que tous, sauf Thalès, fréquentèrent Crésus. D’autres disent qu’ils se réunirent à Panionium, à Corinthe et à Delphes. On rapporte même leurs paroles, et qui a prononcé telle ou telle. Exemple : Le Spartiate Chilon fut sage, Lui qui dit : Rien de trop, Tout est bien qui vient en son temps ! On n’est pas d’accord sur leur nombre. Léandre, au lieu de Cléobule et de Myson, met Léophante, fils de Gorsias, ou Lébédios d’Éphèse et Épiménide de Crète. Platon, dans le Protagoras[20], met Myson à la place de Périandre. Éphoros met Anacharsis à la place de Myson et d’autres ajoutent Pythagore. Selon Dicéarque, il y en a quatre sur qui tout le monde est d’accord : Thalès, Bias, Pittacos et Solon. Le même auteur en nomme six autres, parmi lesquels il en choisit trois : Aristodème, Pamphile, le Lacédémonien Chilon, Cléobule, Anacharsis et Périandre. D’autres ajoutent Acousilaos, Caba ou Scala, un Argien. Hermippe, dans son livre sur les sages, dit qu’ils furent dix-sept et que chacun en choisit sept selon ses préférences. Ce sont Solon, Thalès, Pittacos, Bias, Chilon, Cléobule, Périandre, Anacharsis, Acousilaos, Épiménide, Léophante, Phérécyde, Aristodème, Pythagore, Lasos, fils de Charmantidas ou de Sisambrinos ou, selon Aristoxène, de Chabrinus, Hermonée, Anaxagore. Hippobotos (Catalogue des Philosophes) les inscrit ainsi : Orphée, Linos, Solon, Périandre, Anacharsis, Cléobule, Myson, Thalès, Bias, Pittacos, Épicharme et Pythagore. Voici des lettres attribuées à Thalès[21] : ==== Thalès à Phérécyde ==== « J’apprends que vous vous disposez à présenter aux Grecs le premier traité ionien des choses divines. Vous agiriez peut-être plus sagement en lisant votre ouvrage à vos amis, qu’en communiquant à n’importe quelles gens des écrits qui ne peuvent guère leur être utiles. « Si cela vous plaît, j’aimerais profiter de vos recherches et, si vous m’y invitez, je viendrai vous trouver au plus tôt. Car Solon d’Athènes et moi, qui avons déjà traversé deux fois la mer pour aller visiter la Crète, et pour aller en Égypte nous entretenir avec les prêtres et les astronomes du lieu, nous sommes assez sages pour ne pas hésiter à la traverser de nouveau pour aller vous voir. « Je parle de Solon, parce qu’il viendra avec moi si vous le permettez. Vous êtes un sédentaire, vous allez rarement en Ionie, vous n’aimez guère aller voir les étrangers, et vous ne songez, j’imagine, qu’à écrire. « Mais nous qui n’écrivons pas, nous parcourons volontiers la Grèce et l’Italie. » ==== Thalès à Solon ==== « Si vous quittez Athènes, vous aurez, je crois, tout avantage à venir vous établir à Milet, parmi les colons athéniens. Il n’y a là pour vous aucun danger. Si vous hésitez, sous prétexte que nous, Milésiens, sommes gouvernés par un tyran (je sais que vous haïssez tout pouvoir absolu), songez du moins que vous aurez plaisir à vivre avec nous qui sommes vos amis. Je sais que Bias vous a écrit et vous invite à aller à Priène. Si vous trouvez préférable d’habiter la ville de Priène, j’irai vivre là-bas avec vous. » <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Ausone|'''Ausone''']] ''([[w:309|309]]/[[w:310|310]], à [[w:Bazas|Bazas]] ou à [[w:Bordeaux#Burdigala,_cité_romaine_(Ier_siècle_-_Ve_siècle)|Bordeaux]] — [[w:394|394]]/[[w:395|395]], entre [[w:Langon_(Gironde)|Langon]] et [[w:La_Réole|La Réole]])'' <sup>[[w:IVe_siècle|⏳]]</sup> [[s:Auteur:Ausone|<sup>📚</sup>]] == === Le Jeu des Sept Sages === :Thalès a trouvé [texte grec] pour nous défendre de nous porter cautions, parce qu'il y a du danger à répondre ainsi pour d'autres[iv]. Nous donnons-là un avis qui ne plaira pas beaucoup aux emprunteurs. :THALÈS : Je suis Thalès de Milet ; j'ai dit, comme le poète Pindare, que l'eau est, le principe de toute chose. C'est à moi que des pêcheurs donnèrent autrefois [un trépied d'or] qu'ils avaient tiré de la mer : ils m'avaient choisi pour obéir au dieu de Délos, qui envoyait ce présent à un sage. Je refusai de le recevoir, je le leur rendis pour le porter à d'autres que je croyais plus dignes. Envoyé à tous les sept Sages, et renvoyé par eux, il nie fut rapporté. Je le reçus alors pour le consacrer à Apollon : car si Phébus a voulu qu'on choisit un sage, ce n'était pas d'un homme, mais d'un dieu qu'il fallait l'entendre. Je suis donc ce Thalès : mais un motif m'amène sur la scène. Comme les deux sages qui m'ont précédé, je viens défendre la sentence dont je suis l'auteur. Elle déplaira, mais non certes aux esprits prudents que l'expérience a instruits et rendus plus avisés. Nous avons dit : [texte grec], ou, en latin : Cautionne, mais tu t'en trouveras mal. Je pourrais parcourir mille exemples pour vous montrer des cautions et des répondants bien et dûment convaincus de repentir. Mais je ne veux nommer personne. Que chacun de, vous ré-fléchisse, et compte en lui-même combien de gens ont perdu ou souffert de s'être ainsi portés cautions pour d'autres. Toutefois, si un pareil service a du charme pour vous, n'y renoncez ni les uns ni les autres. :Alors que les uns applaudissent, et que les autres, si je les blesse, me sifflent. :THALÈS DE MILET. :AVANT d'oser une mauvaise action, à défaut de Témoin redoute ta conscience. La vie s'éteint, mais la gloire de la mort ne meurt point. Ce que tu veux faire, abstiens-toi de le dire. C'est un supplice de craindre ce qu'on ne peut empêcher. Si tu blâmes avec raison, ton hostilité même est profitable ; si tu loues mal à propos, ton amitié même est nuisible. Rien de trop. - Arrêtons-nous, et qu'ici même il n'y ait rien de trop. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Proclus|'''Proclus''']] ''(le 7 ou 8 février [[w:412|412]], à [[w:Constantinople|Constantinople]] — le 17 avril [[w:485|485]], à [[w:Histoire_d%27Athènes#Antiquité_tardive|Athènes]])''<sup>[[w:Ve_siècle|⏳]]</sup> [[s:Auteur:Proclus|<sup>📚</sup>]] == === Commentaire sur le premier livre d'Euclide, 65, 3 === ὥσπερ οὖν παρὰ τοῖς Φοίνιξιν διὰ τὰς ἐμπορείας καὶ τὰ συναλλάγματα τὴν ἀρχὴν ἔλαβεν ἡ τῶν ἀριθμῶν ἀκριβὴς γνῶσις, οὕτω δὴ καὶ παρ' Αἰγυπτίοις ἡ γεωμετρία διὰ τὴν εἰρημένην αἰτίαν εὕρηται. Θαλῆς δὲ πρῶτον εἰς Αἴγυπτον ἐλθὼν μετήγαγεν εἰς τὴν Ἑλλάδα τὴν θεωρίαν ταύτην καὶ πολλὰ μὲν αὐτὸς εὗρεν, πολλῶν δὲ τὰς ἀρχὰς τοῖς μετ' αὐτὸν ὑφηγήσατο τοῖς μὲν καθολικώτερον ἐπιβάλλων, τοῖς δὲ αἰσθητικώτερον. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == « [[w:Souda|'''Suidas''']] » ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] fin du [[w:IXe_siècle|IX<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Suidas|<sup>📚</sup>]] == === La Souda === Θαλῆς, Ἐξαμύου καὶ Κλεοβουλίνης, Μιλήσιος, ὡς δὲ Ἡρόδοτος Φοῖνιξ: γεγονὼς πρὸ Κροίσου, ἐπὶ τῆς λε# ὀλυμπιάδος, κατὰ δὲ Φλέγοντα γνωριζόμενος ἤδη ἐπὶ τῆς ζ#. ἔγραψε περὶ μετεώρων ἐν ἔπεσι, Περὶ ἰσημερίας, καὶ ἄλλα πολλά. ἐτελεύτησε δὲ γηραιός, θεώμενος γυμνικὸν ἀγῶνα, πιληθεὶς δὲ ὑπὸ τοῦ ὄχλου καὶ ἐκλυθεὶς ὑπὸ τοῦ καύματος. πρῶτος δὲ Θαλῆς τὸ τοῦ σοφοῦ ἔσχεν ὄνομα καὶ πρῶτος τὴν ψυχὴν εἶπεν ἀθάνατον ἐκλείψεις τε καὶ ἰσημερίας κατείληφεν. ἀποφθέγματα δὲ αὐτοῦ πλεῖστα: καὶ τὸ θρυλλούμενον: γνῶθι σαυτόν. τὸ γάρ, ἐγγύα, πάρα δ' ἄτα, Χίλωνός ἐστι μᾶλλον, ἰδιοποιησαμένου αὐτό: καὶ τό, μηδὲν ἄγαν. gysmk1w5zfdcstj34puk6ldm0h0m89o Fonctionnement d'un ordinateur/Les unités arithmétiques et logiques entières (simples) 0 80707 767927 767887 2026-06-17T14:05:51Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767927 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Un circuit en fin de chaine détermine le résultat final en fonction de ce que disent ces trois circuits. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. Pour faire un ET/OU entre les deux bits d'opérandes, il faut donc mettre le bit de retenue entrante à 0. La porte ET sortira le ET entre les deux bits opérande, la porte OU sortira un OU. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Enfin, il faut concevoir le circuit final pour qu'il sélectionne l'opération voulue. Suivant comment on le configure, il peut soit sortir le résultat de la somme, soit simplement recopier le résultat de la porte ET, soit celui de la porte OU. Toute la difficulté est de concevoir ce circuit, avec sa table de vérité. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> nvh8s3i58ieaznehgia7nore0dywwmn 767928 767927 2026-06-17T14:10:20Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767928 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Un circuit en fin de chaine détermine le résultat final en fonction de ce que disent ces trois circuits. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. Pour faire un ET/OU entre les deux bits d'opérandes, il faut donc mettre le bit de retenue entrante à 0. La porte ET sortira le ET entre les deux bits opérande, la porte OU sortira un OU. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Enfin, il faut concevoir le circuit final pour qu'il sélectionne l'opération voulue. Suivant comment on le configure, il peut soit sortir le résultat de la somme, soit simplement recopier le résultat de la porte ET, soit celui de la porte OU. Pour simplifier, il agit comme une sorte de multiplexeur amélioré, mais qui serait intégré dans l'additionneur complet. Toute la difficulté est de concevoir ce circuit, avec sa table de vérité. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 7qrm9qzogc3q74eqskam35575173soh 767931 767928 2026-06-17T14:25:48Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767931 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. [[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]] L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Un circuit en fin de chaine détermine le résultat final en fonction de ce que disent ces trois circuits. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. Pour faire un ET/OU entre les deux bits d'opérandes, il faut donc mettre le bit de retenue entrante à 0. La porte ET sortira le ET entre les deux bits opérande, la porte OU sortira un OU. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Enfin, il faut concevoir le circuit final pour qu'il sélectionne l'opération voulue. Suivant comment on le configure, il peut soit sortir le résultat de la somme, soit simplement recopier le résultat de la porte ET, soit celui de la porte OU. Pour simplifier, il agit comme une sorte de multiplexeur amélioré, mais qui serait intégré dans l'additionneur complet. Toute la difficulté est de concevoir ce circuit, avec sa table de vérité. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> o8lnac7ycyzkhw5izu12frqo6m4pmww 767932 767931 2026-06-17T14:34:01Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767932 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. Les deux portes en fin de chaine déterminent le résultat final en fonction de ce que disent les trois circuits précédents. L'une force le bit de somme à 0, l'autre le force à 1. [[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]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. En manipulant la retenue entrante, on peut activer ou désactiver ces deux portes. * En mettant la retenue entrante à 0, la porte ET sera désactivée et la porte OU fournira le OU entre les deux bits d'opérande. * En mettant la retenue entrante à 1, la porte OU sortira systématiquement un 1 et n'aura aucun impact sur le bit de somme, la porte ET calculera le ET entre les deux bits d'opérande. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Dans le détail, il y a quatre possibilités intéressantes : * Si on ne force ni la retenue entrante, ni la retenue sortante, on a une addition. * Si on force la retenue entrante à 0, sans forcer la retenue interne, on a un XOR. * Si on force la retenue entrante à 0 et la retenue interne à 1, on a un OU logique. * Si on force la retenue entrante à 1, et la retenue interne à 0, on a un ET logique. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 823erylxql8psuoz7unnunhipbd9e6z 767933 767932 2026-06-17T14:41:24Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767933 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. Les deux portes en fin de chaine déterminent le résultat final en fonction de ce que disent les trois circuits précédents. L'une force le bit de somme à 0, l'autre le force à 1. [[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]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. En manipulant la retenue entrante, on peut activer ou désactiver ces deux portes. * En mettant la retenue entrante à 0, la porte ET sera désactivée et la porte OU fournira le OU entre les deux bits d'opérande. * En mettant la retenue entrante à 1, la porte OU sortira systématiquement un 1 et n'aura aucun impact sur le bit de somme, la porte ET calculera le ET entre les deux bits d'opérande. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Dans le détail, il y a quatre possibilités intéressantes : * Si on ne force ni la retenue entrante, ni la retenue sortante, on a une addition. * Si on force la retenue entrante à 0, sans forcer la retenue interne, on a un XOR. * Si on force la retenue entrante à 0 et la retenue interne à 1, on a un OU logique. * Si on force la retenue entrante à 1, et la retenue interne à 0, on a un ET logique. : Le cas où on force les deux retenues à 0 n'a pas d'intérêt : le bit de somme sera mis à zéro. Idem si on met les deux à 1 : le bit de somme sera forcé à 1. Les autres cas n'ont pas d'interprétation évidente. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> q6ufxtlzwrewki0k5or5g13k9l7dxrl 767934 767933 2026-06-17T14:42:50Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767934 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. Les deux portes en fin de chaine déterminent le résultat final en fonction de ce que disent les trois circuits précédents. L'une force le bit de somme à 0, l'autre le force à 1. [[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]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. En manipulant la retenue entrante, on peut activer ou désactiver ces deux portes. * En mettant la retenue entrante à 0, la porte ET sera désactivée et la porte OU fournira le OU entre les deux bits d'opérande. * En mettant la retenue entrante à 1, la porte OU sortira systématiquement un 1 et n'aura aucun impact sur le bit de somme, la porte ET calculera le ET entre les deux bits d'opérande. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Dans le détail, on retrouve les possibilités classiques : * Si on ne force ni la retenue entrante, ni la retenue sortante, on a une addition. * Si on force la retenue entrante à 0, sans forcer la retenue interne, on a un XOR. * Si on force la retenue entrante à 1, sans forcer la retenue interne, on a un NXOR. Mais à cela, il faut ajouter les cas obtenus en modifiant la retenue interne : * Si on force la retenue entrante à 0 et la retenue interne à 1, on a un OU logique. * Si on force la retenue entrante à 1, et la retenue interne à 0, on a un ET logique. : Le cas où on force les deux retenues à 0 n'a pas d'intérêt : le bit de somme sera mis à zéro. Idem si on met les deux à 1 : le bit de somme sera forcé à 1. Les autres cas n'ont pas d'interprétation évidente. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> e4gagson029fgb17byzgs2lgemcqeot 767941 767934 2026-06-17T17:00:13Z Mewtow 31375 /* Les opérations gérées par l'ALU 74181 */ 767941 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. Les deux portes en fin de chaine déterminent le résultat final en fonction de ce que disent les trois circuits précédents. L'une force le bit de somme à 0, l'autre le force à 1. [[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]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. En manipulant la retenue entrante, on peut activer ou désactiver ces deux portes. * En mettant la retenue entrante à 0, la porte ET sera désactivée et la porte OU fournira le OU entre les deux bits d'opérande. * En mettant la retenue entrante à 1, la porte OU sortira systématiquement un 1 et n'aura aucun impact sur le bit de somme, la porte ET calculera le ET entre les deux bits d'opérande. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Dans le détail, on retrouve les possibilités classiques : * Si on ne force ni la retenue entrante, ni la retenue sortante, on a une addition. * Si on force la retenue entrante à 0, sans forcer la retenue interne, on a un XOR. * Si on force la retenue entrante à 1, sans forcer la retenue interne, on a un NXOR. Mais à cela, il faut ajouter les cas obtenus en modifiant la retenue interne : * Si on force la retenue entrante à 0 et la retenue interne à 1, on a un OU logique. * Si on force la retenue entrante à 1, et la retenue interne à 0, on a un ET logique. : Le cas où on force les deux retenues à 0 n'a pas d'intérêt : le bit de somme sera mis à zéro. Idem si on met les deux à 1 : le bit de somme sera forcé à 1. Les autres cas n'ont pas d'interprétation évidente. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, les inverseurs commandables sont remplacés par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> m29t3t9ig9j1y4udsamjug6chwes2b3 767942 767941 2026-06-17T17:01:27Z Mewtow 31375 /* L'exemple de l'unité de calcul 74181 */ 767942 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. Les deux portes en fin de chaine déterminent le résultat final en fonction de ce que disent les trois circuits précédents. L'une force le bit de somme à 0, l'autre le force à 1. [[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]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. En manipulant la retenue entrante, on peut activer ou désactiver ces deux portes. * En mettant la retenue entrante à 0, la porte ET sera désactivée et la porte OU fournira le OU entre les deux bits d'opérande. * En mettant la retenue entrante à 1, la porte OU sortira systématiquement un 1 et n'aura aucun impact sur le bit de somme, la porte ET calculera le ET entre les deux bits d'opérande. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Dans le détail, on retrouve les possibilités classiques : * Si on ne force ni la retenue entrante, ni la retenue sortante, on a une addition. * Si on force la retenue entrante à 0, sans forcer la retenue interne, on a un XOR. * Si on force la retenue entrante à 1, sans forcer la retenue interne, on a un NXOR. Mais à cela, il faut ajouter les cas obtenus en modifiant la retenue interne : * Si on force la retenue entrante à 0 et la retenue interne à 1, on a un OU logique. * Si on force la retenue entrante à 1, et la retenue interne à 0, on a un ET logique. : Le cas où on force les deux retenues à 0 n'a pas d'intérêt : le bit de somme sera mis à zéro. Idem si on met les deux à 1 : le bit de somme sera forcé à 1. Les autres cas n'ont pas d'interprétation évidente. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était aussi possible de combiner plusieurs 74181 avec une unité d'anticipation de retenue séparée, l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, les inverseurs commandables sont remplacés par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> keuc6cvbxdoxhbida28vo5yjj20rqn8 767943 767942 2026-06-17T17:02:55Z Mewtow 31375 /* Les opérations gérées par l'ALU 74181 */ 767943 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. Les deux portes en fin de chaine déterminent le résultat final en fonction de ce que disent les trois circuits précédents. L'une force le bit de somme à 0, l'autre le force à 1. [[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]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. En manipulant la retenue entrante, on peut activer ou désactiver ces deux portes. * En mettant la retenue entrante à 0, la porte ET sera désactivée et la porte OU fournira le OU entre les deux bits d'opérande. * En mettant la retenue entrante à 1, la porte OU sortira systématiquement un 1 et n'aura aucun impact sur le bit de somme, la porte ET calculera le ET entre les deux bits d'opérande. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Dans le détail, on retrouve les possibilités classiques : * Si on ne force ni la retenue entrante, ni la retenue sortante, on a une addition. * Si on force la retenue entrante à 0, sans forcer la retenue interne, on a un XOR. * Si on force la retenue entrante à 1, sans forcer la retenue interne, on a un NXOR. Mais à cela, il faut ajouter les cas obtenus en modifiant la retenue interne : * Si on force la retenue entrante à 0 et la retenue interne à 1, on a un OU logique. * Si on force la retenue entrante à 1, et la retenue interne à 0, on a un ET logique. : Le cas où on force les deux retenues à 0 n'a pas d'intérêt : le bit de somme sera mis à zéro. Idem si on met les deux à 1 : le bit de somme sera forcé à 1. Les autres cas n'ont pas d'interprétation évidente. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était aussi possible de combiner plusieurs 74181 avec une unité d'anticipation de retenue séparée, l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur, où les inverseurs commandables sont remplacés par une porte universelle 2 bits. En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). De plus, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit et une addition. En clair, il effectue une opération bit à bit et une addition facultative. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. L'entrée de sélection de l'instruction fait 5 bits : un groupe de 4 bits précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 0wwtfnszuc7569mv4h7cex4fjavdmx9 767944 767943 2026-06-17T17:07:05Z Mewtow 31375 /* L'exemple de l'unité de calcul 74181 */ 767944 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. Les deux portes en fin de chaine déterminent le résultat final en fonction de ce que disent les trois circuits précédents. L'une force le bit de somme à 0, l'autre le force à 1. [[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]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. En manipulant la retenue entrante, on peut activer ou désactiver ces deux portes. * En mettant la retenue entrante à 0, la porte ET sera désactivée et la porte OU fournira le OU entre les deux bits d'opérande. * En mettant la retenue entrante à 1, la porte OU sortira systématiquement un 1 et n'aura aucun impact sur le bit de somme, la porte ET calculera le ET entre les deux bits d'opérande. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Dans le détail, on retrouve les possibilités classiques : * Si on ne force ni la retenue entrante, ni la retenue sortante, on a une addition. * Si on force la retenue entrante à 0, sans forcer la retenue interne, on a un XOR. * Si on force la retenue entrante à 1, sans forcer la retenue interne, on a un NXOR. Mais à cela, il faut ajouter les cas obtenus en modifiant la retenue interne : * Si on force la retenue entrante à 0 et la retenue interne à 1, on a un OU logique. * Si on force la retenue entrante à 1, et la retenue interne à 0, on a un ET logique. : Le cas où on force les deux retenues à 0 n'a pas d'intérêt : le bit de somme sera mis à zéro. Idem si on met les deux à 1 : le bit de somme sera forcé à 1. Les autres cas n'ont pas d'interprétation évidente. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ===L'exemple de l'unité de calcul 74181=== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était aussi possible de combiner plusieurs 74181 avec une unité d'anticipation de retenue séparée, l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. Le 74181 fonctionne concrètement comme un additionneur-soustracteur, où les inverseurs commandables sont remplacés par une porte universelle 2 bits. En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). De plus, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit et une addition. En clair, il effectue une opération bit à bit et une addition facultative. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. L'entrée de sélection de l'instruction fait 5 bits : un groupe de 4 bits précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> fn3uv4uwqv8zsey74jj15i8a5mxr0y9 767945 767944 2026-06-17T17:07:14Z Mewtow 31375 /* L'exemple de l'ALU du processeur 8086 d'Intel */ 767945 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. Les deux portes en fin de chaine déterminent le résultat final en fonction de ce que disent les trois circuits précédents. L'une force le bit de somme à 0, l'autre le force à 1. [[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]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. En manipulant la retenue entrante, on peut activer ou désactiver ces deux portes. * En mettant la retenue entrante à 0, la porte ET sera désactivée et la porte OU fournira le OU entre les deux bits d'opérande. * En mettant la retenue entrante à 1, la porte OU sortira systématiquement un 1 et n'aura aucun impact sur le bit de somme, la porte ET calculera le ET entre les deux bits d'opérande. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Dans le détail, on retrouve les possibilités classiques : * Si on ne force ni la retenue entrante, ni la retenue sortante, on a une addition. * Si on force la retenue entrante à 0, sans forcer la retenue interne, on a un XOR. * Si on force la retenue entrante à 1, sans forcer la retenue interne, on a un NXOR. Mais à cela, il faut ajouter les cas obtenus en modifiant la retenue interne : * Si on force la retenue entrante à 0 et la retenue interne à 1, on a un OU logique. * Si on force la retenue entrante à 1, et la retenue interne à 0, on a un ET logique. : Le cas où on force les deux retenues à 0 n'a pas d'intérêt : le bit de somme sera mis à zéro. Idem si on met les deux à 1 : le bit de somme sera forcé à 1. Les autres cas n'ont pas d'interprétation évidente. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ===L'exemple de l'unité de calcul 74181=== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était aussi possible de combiner plusieurs 74181 avec une unité d'anticipation de retenue séparée, l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. Le 74181 fonctionne concrètement comme un additionneur-soustracteur, où les inverseurs commandables sont remplacés par une porte universelle 2 bits. En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). De plus, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit et une addition. En clair, il effectue une opération bit à bit et une addition facultative. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. L'entrée de sélection de l'instruction fait 5 bits : un groupe de 4 bits précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> aml91sk78hls981nsihh5os9527s4yr 767946 767945 2026-06-17T17:07:22Z Mewtow 31375 /* L'exemple de l'unité de calcul 74181 */ 767946 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. Les deux portes en fin de chaine déterminent le résultat final en fonction de ce que disent les trois circuits précédents. L'une force le bit de somme à 0, l'autre le force à 1. [[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]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. En manipulant la retenue entrante, on peut activer ou désactiver ces deux portes. * En mettant la retenue entrante à 0, la porte ET sera désactivée et la porte OU fournira le OU entre les deux bits d'opérande. * En mettant la retenue entrante à 1, la porte OU sortira systématiquement un 1 et n'aura aucun impact sur le bit de somme, la porte ET calculera le ET entre les deux bits d'opérande. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Dans le détail, on retrouve les possibilités classiques : * Si on ne force ni la retenue entrante, ni la retenue sortante, on a une addition. * Si on force la retenue entrante à 0, sans forcer la retenue interne, on a un XOR. * Si on force la retenue entrante à 1, sans forcer la retenue interne, on a un NXOR. Mais à cela, il faut ajouter les cas obtenus en modifiant la retenue interne : * Si on force la retenue entrante à 0 et la retenue interne à 1, on a un OU logique. * Si on force la retenue entrante à 1, et la retenue interne à 0, on a un ET logique. : Le cas où on force les deux retenues à 0 n'a pas d'intérêt : le bit de somme sera mis à zéro. Idem si on met les deux à 1 : le bit de somme sera forcé à 1. Les autres cas n'ont pas d'interprétation évidente. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ===L'unité de calcul 74181=== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était aussi possible de combiner plusieurs 74181 avec une unité d'anticipation de retenue séparée, l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. Le 74181 fonctionne concrètement comme un additionneur-soustracteur, où les inverseurs commandables sont remplacés par une porte universelle 2 bits. En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). De plus, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit et une addition. En clair, il effectue une opération bit à bit et une addition facultative. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. L'entrée de sélection de l'instruction fait 5 bits : un groupe de 4 bits précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> ifxzarffwesfqhpgdia4ca1u6dq54p1 767947 767946 2026-06-17T17:11:08Z Mewtow 31375 /* L'unité de calcul 74181 */ 767947 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que le bit de somme est égal à l'inverse de la retenue sortante, sauf dans deux cas : celui où les trois bits d'opérande valent 0, celui où ils valent tous 1. L'additionneur complet comprend donc un circuit qui calcule la retenue sortante, et deux circuits pour gérer les deux cas particuliers. Il se trouve que les deux circuits en question sont des portes ET et OU/NOR, qu'on peut donc réutiliser pour faire un ET/OU logique. Les deux portes en fin de chaine déterminent le résultat final en fonction de ce que disent les trois circuits précédents. L'une force le bit de somme à 0, l'autre le force à 1. [[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]] Dans ce qui suit, on suppose que le circuit utilise une porte ET et une porte OU, pour se simplifier la tâche. Ces deux portes prennent trois opérandes : les deux bits d'opérandes et le bit de retenue entrante. En manipulant la retenue entrante, on peut activer ou désactiver ces deux portes. * En mettant la retenue entrante à 0, la porte ET sera désactivée et la porte OU fournira le OU entre les deux bits d'opérande. * En mettant la retenue entrante à 1, la porte OU sortira systématiquement un 1 et n'aura aucun impact sur le bit de somme, la porte ET calculera le ET entre les deux bits d'opérande. Maintenant, cela ne suffit pas pour avoir un ET/OU en sortie de l'additionneur. Pour cela, il faut aussi neutraliser l'effet de la retenue sortante. Pour distinguer la retenue sortante de celle utilisée dans l'additionneur complet, on appellera cette dernière la '''retenue interne'''. Notez bien que cette retenue est l'inverse de la retenue sortante, il y a une porte NON pour l'inverser avant utilisation. Neutraliser l'effet de la retenue interne demande soit de forcer celle-ci à 0, soit de la forcer à 1. Pour cela, on remplace la porte NON par un circuit qui est capable : d'inverser la retenue, de la mettre à 0, de la mettre à 1. Nous avions vu un tel circuit dans le chapitre sur les opérations de masquage, il s'appelle une ''porte universelle 1 bit''. Dans le détail, on retrouve les possibilités classiques : * Si on ne force ni la retenue entrante, ni la retenue sortante, on a une addition. * Si on force la retenue entrante à 0, sans forcer la retenue interne, on a un XOR. * Si on force la retenue entrante à 1, sans forcer la retenue interne, on a un NXOR. Mais à cela, il faut ajouter les cas obtenus en modifiant la retenue interne : * Si on force la retenue entrante à 0 et la retenue interne à 1, on a un OU logique. * Si on force la retenue entrante à 1, et la retenue interne à 0, on a un ET logique. : Le cas où on force les deux retenues à 0 n'a pas d'intérêt : le bit de somme sera mis à zéro. Idem si on met les deux à 1 : le bit de somme sera forcé à 1. Les autres cas n'ont pas d'interprétation évidente. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ===L'unité de calcul 74181=== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était aussi possible de combiner plusieurs 74181 avec une unité d'anticipation de retenue séparée, l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. Le 74181 fonctionne concrètement comme un additionneur-soustracteur, où les inverseurs commandables sont remplacés par une porte universelle 2 bits. En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). De plus, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit et une addition. En clair, il effectue une opération bit à bit et une addition facultative. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. L'entrée de sélection de l'instruction fait 5 bits : un groupe de 4 bits précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. Autre optimisation : l'additionneur est fusionné avec les portes logiques universelles. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue. Le 8086 remplace les portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, il est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,1) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 05zeamk4nv6ijfi62cascy8lt2ulexw Dictionnaire de philosophie/A priori 0 82998 767970 762074 2026-06-18T04:49:56Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 767970 wikitext text/x-wiki {{DicoPhilo|A priori|lecture=oui}} L'expression ''a priori'' (littéralement « à partir de ce qui précède » en latin) désigne, en philosophie, ce qui est antérieur à l'expérience sensible et indépendant d'elle. Apparue dans la scolastique médiévale, cette expression a reçu d'Emmanuel Kant, au XVIII{{e}} siècle, sa formulation moderne et systématique, qui oppose ce qui est connu indépendamment de l'expérience (l{{'}}''a priori'') à ce qui provient de l'expérience empirique (l{{'}}''a posteriori'').<ref>Kant, E., ''Critique de la raison pure'', 1781/1787, trad. A. Renaut, Garnier-Flammarion, 2006, Introduction, B1-B6.</ref> Comprendre cette distinction permet de saisir comment s'articulent, dans notre connaissance du monde, les contributions respectives de notre esprit et de notre expérience sensible. == Origines historiques de la notion == === Racines anciennes et médiévales === La distinction entre ce que l'on connaît par la seule pensée et ce que l'on connaît par l'observation trouve ses premières formulations dans l'Antiquité. Platon opposait la connaissance sensible, changeante et imparfaite, à la connaissance intelligible des Idées, éternelles et nécessaires.<ref>Platon, ''La République'', VI-VII (allégorie de la Ligne et de la Caverne), trad. G. Leroux, Garnier-Flammarion, 2004.</ref><ref>Platon, ''Ménon'', 80d-86c (le passage de la réminiscence géométrique), trad. M. Canto-Sperber, Garnier-Flammarion, 1993.</ref> Les vérités mathématiques, par exemple, semblaient ne pas dépendre de l'observation : que la somme des angles d'un triangle égale deux angles droits apparaît comme une vérité universelle et nécessaire, que l'on ne découvre pas par la mesure répétée de triangles concrets, mais que l'on saisit par l'intelligence.<ref>Brisson, L. et Ofman, S., « Comprendre les mathématiques pour comprendre Platon – ''Théétète'' (ged147d-148b) », ''Archives de philosophie'', 2014, t. 77, n° 4, p. 621-640.</ref> Les termes mêmes d{{'}}''a priori'' et d{{'}}''a posteriori'' n'apparaissent toutefois qu'au Moyen Âge. Ils proviennent du vocabulaire logique de la scolastique, où ils désignaient deux directions du raisonnement : le raisonnement ''a priori'' allait de la cause vers l'effet (du « premier » vers le « second »), tandis que le raisonnement ''a posteriori'' remontait de l'effet vers la cause.<ref>Cf. Albert le Grand, ''Analytica posteriora'', I, 2 ; Thomas d'Aquin, ''Somme théologique'', I, q. 2, a. 2.</ref> Cette acception est donc très différente de celle que Kant leur donnera plus tard : chez les scolastiques, il ne s'agit pas encore d'un rapport à l'expérience sensible, mais d'un ordre entre causes et effets dans la démonstration. C'est seulement au cours du XVII{{e}} et du XVIII{{e}} siècle que les termes glissent vers leur sens épistémologique moderne, celui d'une opposition entre connaissance indépendante de l'expérience et connaissance tirée de l'expérience.<ref>Kauppi, R., « Über die Begriffe "a priori" und "a posteriori" », in R. Kauppi, ''Sehen und Denken'', University of Tampere, 1990 ; sur cette évolution sémantique, voir aussi Ferrarin, A., « Construction and Mathematical Schematism : Kant on the Exhibition of a Concept in Intuition », ''Kant-Studien'', vol. 86, 1995, p. 131-174.</ref> === Le débat entre rationalistes et empiristes === Au XVII{{e}} siècle, la philosophie de la connaissance se structure autour d'un débat entre rationalistes et empiristes. Pour les rationalistes — Descartes, Spinoza, Leibniz — la raison possède des idées innées ou des principes indépendants de l'expérience : l'idée d'infini, les principes logiques (principe de contradiction, principe de raison suffisante), les vérités mathématiques.<ref>Descartes, R., ''Méditations métaphysiques'', 1641, III (idée d'infini), éd. J.-M. Beyssade et M. Beyssade, Garnier-Flammarion, 2011.</ref><ref>Leibniz, G. W., ''Nouveaux essais sur l'entendement humain'', 1765, Préface et I, 1, éd. J. Brunschwig, Garnier-Flammarion, 1990.</ref> Ces vérités seraient universelles, nécessaires, et connaissables par la seule raison. Pour les empiristes — Locke, Berkeley, Hume — toute connaissance provient au contraire de l'expérience sensible : avant toute expérience, notre esprit serait comme une « page blanche » (''tabula rasa'').<ref>Locke, J., ''Essai sur l'entendement humain'', 1689, II, 1, § 2, trad. J.-M. Vienne, Vrin, 2001.</ref><ref>Hume, D., ''Enquête sur l'entendement humain'', 1748, IV, trad. A. Leroy, rév. M. Beyssade, Garnier-Flammarion, 2006.</ref> Les empiristes ne nient pas qu'il existe des propositions dont la vérité peut être établie sans recourir à l'observation. Mais chaque auteur formule cette idée dans son propre vocabulaire. Locke distingue, au sein de notre connaissance, ce qui repose sur la perception de rapports entre idées (''agreement or disagreement of ideas'') et ce qui porte sur l'existence réelle des choses : les vérités mathématiques et morales relèvent du premier type et peuvent être connues avec certitude, sans dépendre de l'observation du monde extérieur.<ref>Locke, J., ''Essai sur l'entendement humain'', IV, 3, § 18-20 ; IV, 9, § 1.</ref> Hume, de son côté, oppose les « relations d'idées » (les propositions de la géométrie, de l'algèbre, de l'arithmétique, « découvertes par la seule opération de la pensée ») aux « choses de fait », fondées sur l'expérience.<ref>Hume, D., ''Enquête sur l'entendement humain'', IV, 1.</ref> Leibniz, quant à lui — rationaliste mais interlocuteur principal des empiristes — distingue « vérités de raison » (nécessaires, fondées sur le principe de contradiction) et « vérités de fait » (contingentes, fondées sur le principe de raison suffisante).<ref>Leibniz, G. W., ''Monadologie'', 1714, § 33.</ref> Il serait toutefois anachronique de projeter sur ces auteurs la grille conceptuelle kantienne. Les distinctions entre ''a priori'' et ''a posteriori'', entre analytique et synthétique, entre nécessaire et contingent — que Kant présente comme orthogonales — ne se recoupent pas chez les classiques de la même façon qu'elles le feront plus tard. L'identification systématique de l{{'}}''a priori'' avec l'analytique et le nécessaire est surtout caractéristique de certaines formes d'empirisme logique au XX{{e}} siècle, notamment chez Alfred Ayer, qui soutient explicitement que les vérités ''a priori'' sont des tautologies sans contenu factuel.<ref>Ayer, A. J., ''Language, Truth and Logic'', Gollancz, 1936, chap. 4.</ref> Les synthèses contemporaines insistent précisément sur la nécessité de séparer ces trois distinctions, qui ne coïncident ni chez les classiques ni, comme Kripke l'a montré, dans la philosophie actuelle. == La systématisation kantienne : les jugements synthétiques ''a priori'' == C'est Emmanuel Kant (1724-1804) qui, dans la ''Critique de la raison pure'' (1781, seconde édition 1787), confère à la distinction ''a priori'' / ''a posteriori'' son statut philosophique central et sa portée moderne.<ref>Kant, E., ''Critique de la raison pure'', 1781/1787, trad. A. Renaut, Garnier-Flammarion, 2006.</ref> Kant opère ce qu'il appelle une « révolution copernicienne » en philosophie : au lieu de penser que notre connaissance se règle sur les objets, il propose que les objets se règlent sur notre faculté de connaître. Cette thèse lui permet d'expliquer l'existence de connaissances ''a priori'' tout en évitant les impasses du rationalisme dogmatique (qui prétend connaître le réel par la seule raison) et du scepticisme empiriste (qui conteste la possibilité de toute connaissance nécessaire). === Critères de l{{'}}''a priori'' : nécessité et universalité === Pour Kant, une connaissance est ''a priori'' si elle possède deux caractéristiques indissociables : la nécessité (elle ne peut pas être autrement) et l'universalité rigoureuse (elle vaut pour tous les cas sans exception possible).<ref>Kant, E., ''Critique de la raison pure'', Introduction, B3-B4.</ref> Si l'on dit « tous les corps observés jusqu'à présent tombent », cette proposition est universelle empiriquement, mais non nécessaire : rien ne garantit absolument qu'un corps ne pourrait pas ne pas tomber. En revanche, « tout changement doit avoir une cause » est, selon Kant, une proposition à la fois nécessaire et universelle : on ne peut concevoir un changement sans cause. Une connaissance ''a posteriori'', au contraire, provient de l'expérience sensible, comme « cette rose est rouge » ou « l'eau bout à 100 °C sous pression normale ». De telles connaissances sont contingentes (elles auraient pu être autrement) et leur universalité n'est que provisoire, fondée sur l'accumulation d'observations. === Distinction entre analytique et synthétique === Kant introduit une seconde distinction, qu'il conçoit comme orthogonale à la première : celle entre jugements analytiques et jugements synthétiques.<ref>Kant, E., ''Prolégomènes à toute métaphysique future'', 1783, § 2, trad. J. Gibelin, rév. J. Rivelaygue, Vrin, 1986.</ref> Un jugement analytique est celui dans lequel « le prédicat est contenu dans le concept du sujet » : par exemple, « tout corps est étendu » — l'extension fait partie de la définition même du corps. Ces jugements sont purement explicatifs : ils clarifient ce que nous pensions déjà confusément, mais n'étendent pas notre connaissance. Ils sont toujours ''a priori'', car on peut les établir par simple analyse conceptuelle, sans recourir à l'expérience. Un jugement synthétique, à l'inverse, « ajoute au sujet un prédicat qui n'y était pas contenu » : par exemple, « tous les corps sont pesants ». Le concept de pesanteur n'est pas inclus dans celui de corps ; c'est une information qui accroît notre connaissance. Les jugements synthétiques sont le plus souvent ''a posteriori'', fondés sur l'expérience empirique. === Les jugements synthétiques ''a priori'' === La thèse fondamentale de Kant est qu'il existe des jugements synthétiques ''a priori'' : des propositions qui étendent notre connaissance (synthétiques) tout en étant universelles, nécessaires et indépendantes de l'expérience (''a priori'').<ref>Kant, E., ''Critique de la raison pure'', B19.</ref> Cette catégorie, inattendue puisqu'elle combine deux traits ordinairement dissociés, constitue selon Kant la clé de la connaissance scientifique. Les exemples fondamentaux sont les jugements mathématiques. La proposition « 7 + 5 = 12 » n'est pas analytique, soutient Kant, car le concept de « 12 » n'est contenu ni dans « 7 » ni dans « 5 » ni dans celui de somme : pour parvenir à « 12 », il faut effectuer une synthèse mentale, une construction dans l'intuition. Pourtant, ce jugement est ''a priori'' : il est universel et nécessaire, valable indépendamment de toute observation empirique.<ref>Kant, E., ''Critique de la raison pure'', Introduction, B15-B16.</ref> De même, les principes fondamentaux de la physique, comme « tout changement a une cause », sont synthétiques (ils étendent notre connaissance du monde) et ''a priori'' (ils sont nécessaires et universels). == Formes ''a priori'' de la sensibilité et de l'entendement == Comment expliquer la possibilité de ces jugements synthétiques ''a priori'' ? Kant répond que notre esprit impose des structures ''a priori'' à l'expérience. Ces structures sont de deux types, correspondant à deux facultés de connaissance distinctes. === L'espace et le temps : formes ''a priori'' de la sensibilité === Dans l'Esthétique transcendantale (première partie de la ''Critique de la raison pure''), Kant soutient que l'espace et le temps ne sont pas des propriétés des choses en elles-mêmes, mais des formes ''a priori'' de notre sensibilité — c'est-à-dire des conditions sous lesquelles seulement quelque chose peut nous être donné comme objet.<ref>Kant, E., ''Critique de la raison pure'', A22/B37 sq.</ref> L'espace est la forme du « sens externe » : tout ce qui nous apparaît comme extérieur se présente nécessairement dans l'espace. Le temps est la forme du « sens interne » : toutes nos représentations, qu'elles soient externes ou internes, se succèdent dans le temps. Ces formes ne dérivent pas de l'expérience ; au contraire, elles sont les conditions de possibilité de toute expérience. Kant insiste sur le fait que la sensibilité possède ses propres structures ''a priori'' qui organisent toute réception d'objets. L{{'}}''a priori'' n'est donc pas l'apanage de l'intellect : il concerne aussi notre capacité intuitive et sensible. Cette thèse explique, pour Kant, la nature ''a priori'' de la géométrie : celle-ci étudie les propriétés nécessaires de l'espace en tant que forme de notre sensibilité. Les vérités géométriques sont donc synthétiques (elles étendent notre connaissance de l'espace) et ''a priori'' (elles découlent de la structure spatiale que notre esprit impose aux phénomènes). === Les catégories : formes ''a priori'' de l'entendement === Dans l'Analytique transcendantale, Kant identifie les catégories ou concepts purs de l'entendement : substance, causalité, unité, pluralité, nécessité, possibilité, etc.<ref>Kant, E., ''Critique de la raison pure'', A80/B106.</ref> Ces catégories sont ''a priori'' : elles ne dérivent pas de l'expérience, mais structurent toute expérience possible. Par exemple, nous ne pouvons faire l'expérience d'une succession temporelle sans y introduire des relations de causalité : c'est notre entendement qui impose ''a priori'' la catégorie de cause et effet. Les catégories permettent de transformer les données sensibles en objets de connaissance. Sans elles, l'expérience serait un chaos d'impressions désordonnées. Kant formule ce point dans une phrase célèbre : « Des pensées sans contenu sont vides, des intuitions sans concepts sont aveugles. »<ref>Kant, E., ''Critique de la raison pure'', A51/B75.</ref> Les deux ensembles de structures ''a priori'' — formes de la sensibilité (espace et temps) et catégories de l'entendement — sont nécessaires l'un et l'autre pour que la connaissance soit possible. === Idéalisme transcendantal et limites de l{{'}}''a priori'' === Cette doctrine a un corollaire important : nous ne connaissons que les phénomènes (les objets tels qu'ils nous apparaissent, structurés par nos formes ''a priori''), jamais les choses en soi (les objets tels qu'ils sont indépendamment de notre faculté de connaître).<ref>Kant, E., ''Critique de la raison pure'', Bxxvi.</ref> L{{'}}''a priori'' gagne en universalité et en nécessité ce qu'il perd en portée métaphysique : nous ne pouvons connaître ''a priori'' que ce que notre esprit a lui-même mis dans les choses, non ce que les choses sont en elles-mêmes. Cette limitation a des conséquences considérables pour la métaphysique traditionnelle. Les catégories, bien qu{{'}}''a priori'', ne s'appliquent légitimement qu'aux objets d'expérience possible. Toute tentative de les appliquer au-delà — par exemple pour démontrer l'existence de Dieu, l'immortalité de l'âme ou la liberté absolue — constitue un usage illégitime de la raison, qui engendre des contradictions insolubles : les « antinomies » de la raison pure.<ref>Kant, E., ''Critique de la raison pure'', A405-567/B432-595.</ref> == L{{'}}''a priori'' après Kant : critiques, reprises, transformations == La théorie kantienne a suscité d'intenses débats qui se poursuivent jusqu'à nos jours. === La critique empiriste : Quine et le holisme === Au XX{{e}} siècle, le philosophe américain Willard Van Orman Quine (1908-2000) attaque frontalement la distinction entre analytique et synthétique. Dans son article « Deux dogmes de l'empirisme » (1951), Quine soutient que la frontière entre propositions analytiques et propositions synthétiques, loin d'être nette, est indéfendable : aucune définition satisfaisante de l'analyticité ne résiste à l'examen.<ref>Quine, W. V. O., « Two Dogmas of Empiricism », ''The Philosophical Review'', vol. 60, n° 1, 1951, p. 20-43 ; repris dans ''From a Logical Point of View'', Harvard UP, 1953, chap. 2.</ref> Quine propose à la place une conception holiste de la connaissance : nos croyances forment un « réseau » solidaire où chaque élément, y compris les vérités logiques et mathématiques, peut en principe être révisé face à l'expérience. Il n'y aurait donc pas de vérités absolument à l'abri de toute révision empirique. La critique de Quine ne porte pas directement sur le concept d{{'}}''a priori'' au sens épistémologique (le mode de justification indépendant de l'expérience), mais elle sape la distinction analytique/synthétique qui, depuis Kant, servait de cadre pour penser l{{'}}''a priori''. Elle a ouvert un débat considérable, notamment avec la réponse de Grice et Strawson, qui défendent la distinction contre Quine en montrant qu'elle repose sur une pratique linguistique stable et partagée.<ref>Grice, H. P. et Strawson, P. F., « In Defense of a Dogma », ''Philosophical Review'', vol. 65, n° 2, 1956, p. 141-158.</ref> Le positivisme logique du Cercle de Vienne (années 1920-1930) avait déjà, avant Quine, cherché à réduire l{{'}}''a priori'' au domaine analytique, en rejetant les jugements synthétiques ''a priori'' kantiens.<ref>Carnap, R., ''Der logische Aufbau der Welt'', 1928 ; Schlick, M., « Is There a Factual A Priori? », in H. Feigl & W. Sellars (éds.), ''Readings in Philosophical Analysis'', Appleton-Century-Crofts, 1949.</ref> Pour des philosophes comme Carnap, les vérités dites ''a priori'' — en logique et en mathématiques — sont des vérités purement linguistiques, résultant de conventions concernant le cadre linguistique adopté. === L{{'}}''a priori'' matériel : la phénoménologie === À l'opposé de la tradition empiriste, la phénoménologie, initiée par Edmund Husserl (1859-1938), défend l'existence d'un ''a priori'' matériel.<ref>Husserl, E., ''Recherches logiques'', 1900-1901, III (théorie des touts et des parties), trad. H. Élie, A. L. Kelkel et R. Schérer, PUF, 1961-1963.</ref> Pour Husserl, il existe des structures essentielles non formelles, accessibles par l'intuition eidétique (c'est-à-dire par la saisie directe des essences) : par exemple, les lois d'essence qui régissent les rapports entre couleur et étendue (toute couleur suppose une surface colorée), ou entre promesse et obligation. Ces vérités ne se réduisent ni à des conventions linguistiques ni à des tautologies formelles ; elles portent sur le contenu même des phénomènes. Max Scheler (1874-1928) prolonge cette idée en éthique : les valeurs morales (le noble, le sacré, l'utile, l'agréable) possèdent selon lui un ordre hiérarchique qui n'est ni conventionnel ni empirique, mais donné dans une intuition émotionnelle ''a priori''.<ref>Scheler, M., ''Le formalisme en éthique et l'éthique matériale des valeurs'', 1913-1916, trad. M. de Gandillac, Gallimard, 1955, Ire partie.</ref> Cette conception élargit considérablement le champ de l{{'}}''a priori'' en y incluant des domaines que Kant avait exclus : l'esthétique, l'éthique matérielle, la sphère affective. Plus tard, Mikel Dufrenne (1910-1995) parle d'un « ''a priori'' matériel » pour désigner des structures de sens qui, sans être dérivées de l'expérience empirique individuelle, sont inscrites dans la culture et l'histoire.<ref>Dufrenne, M., ''L'inventaire des a priori. Recherche de l'originaire'', Christian Bourgois, 1981 ; rééd. PU de Caen, 2018.</ref> Cet ''a priori'' perd son caractère strictement formel et universel pour devenir variable selon les époques et les cultures, tout en conservant une certaine nécessité au sein de chaque configuration historique. === Nécessité, ''a priori'' et modalité : Kripke === Le philosophe américain Saul Kripke (1940-2022), dans ''La logique des noms propres'' (1980), a montré que les notions de nécessité, d{{'}}''a priori'' et d'analyticité, souvent confondues, doivent être soigneusement distinguées.<ref>Kripke, S., ''Naming and Necessity'', Harvard UP, 1980 ; trad. fr. P. Jacob et F. Recanati, ''La logique des noms propres'', Minuit, 1982.</ref> La nécessité est une propriété métaphysique : elle concerne ce qui ne peut pas être autrement, dans tous les mondes possibles. L{{'}}''a priori'' est une propriété épistémologique : il concerne le mode par lequel on connaît ou justifie une proposition (indépendamment de l'expérience). L'analyticité est une propriété sémantique : elle concerne les propositions vraies en vertu de la signification de leurs termes. Or ces trois propriétés ne coïncident pas nécessairement. Kripke donne deux types de contre-exemples frappants. Premièrement, certaines vérités sont ''a priori'' sans être nécessaires. La proposition « le mètre étalon de Paris mesure un mètre » est connaissable ''a priori'' (par stipulation : c'est cet objet qui fixe la définition du mètre), mais contingente (ce morceau de métal aurait pu avoir une longueur légèrement différente dans d'autres circonstances). Deuxièmement, certaines vérités nécessaires ne sont connaissables qu{{'}}''a posteriori''. L'identité « l'étoile du soir est l'étoile du matin » (toutes deux étant Vénus) est nécessaire — dans tout monde possible où ces objets existent, ils sont identiques — mais elle a été découverte par l'observation astronomique, non par la réflexion pure. Ces résultats ont profondément transformé le débat sur l{{'}}''a priori'' en montrant qu'il est impossible de traiter comme équivalentes les questions « cette proposition est-elle nécessaire ? », « est-elle connaissable ''a priori'' ? » et « est-elle analytique ? ». La philosophie contemporaine doit travailler avec ces trois distinctions séparées. === Le néo-kantisme et la relativisation de l{{'}}''a priori'' === Les néo-kantiens du XIX{{e}} siècle et du début du XX{{e}} siècle — Hermann Cohen, Paul Natorp, Ernst Cassirer — ont cherché à adapter la théorie kantienne aux transformations scientifiques : les géométries non euclidiennes, la théorie de la relativité, la mécanique quantique semblaient contredire l'idée d'un ''a priori'' fixe et définitif.<ref>Cassirer, E., ''Substance et fonction'', 1910, trad. P. Caussat, Minuit, 1977 ; Cassirer, E., ''La théorie de la relativité d'Einstein'', 1921, trad. J. Seidengart, Cerf, 2000.</ref> Pour Cassirer, les formes ''a priori'' ne sont plus des structures immuables de l'esprit, mais des « fonctions symboliques » qui évoluent avec le développement scientifique, tout en conservant un rôle constitutif : chaque théorie scientifique présuppose un cadre de principes ''a priori'' qui rendent possible l'interprétation de l'expérience, mais ce cadre peut lui-même changer lors des grandes transformations théoriques. Michael Friedman, dans la lignée de Cassirer, a développé l'idée d'un ''a priori'' « relativisé » ou « constitutif » : les principes ''a priori'' d'une théorie physique ne sont pas révisables de la même manière que les hypothèses empiriques ordinaires, mais ils ne sont pas non plus absolument à l'abri de toute révision.<ref>Friedman, M., ''Dynamics of Reason'', CSLI Publications, 2001, chap. 2-3.</ref> Cette position tente de conserver l'intuition kantienne d'un rôle constitutif de l{{'}}''a priori'' tout en acceptant la leçon des changements scientifiques. == L{{'}}''a priori'' dans la philosophie contemporaine == La notion d{{'}}''a priori'' demeure au cœur de plusieurs débats importants. La section qui suit distingue les principales lignes de discussion, en commençant par les questions épistémologiques les plus fondamentales, souvent absentes des présentations introductives. === La justification ''a priori'' : nature, sources et faillibilité === L'un des débats les plus vifs de l'épistémologie contemporaine porte sur la nature même de la justification ''a priori''. Dire qu'une croyance est justifiée ''a priori'', c'est dire que sa justification ne repose pas sur l'expérience — qu'il s'agisse de la perception sensible, de l'observation empirique, de l'introspection ou de toute autre forme d'évidence tirée du contact avec le monde.<ref>Les formulations varient selon les auteurs : certains parlent d'indépendance à l'égard de l'« expérience perceptive » (BonJour), d'autres de l'« expérience » tout court (Casullo), d'autres encore de l'« évidence empirique » (Kitcher). Sur ces variations, voir Casullo, A., ''A Priori Justification'', Oxford UP, 2003, chap. 1, p. 27-38.</ref> Mais sur quoi repose alors cette justification ? Le rationalisme modéré, défendu notamment par Laurence BonJour, soutient que la justification ''a priori'' repose sur l'« intuition rationnelle » ou l'« évidence intellectuelle » : lorsque nous saisissons que la proposition « rien ne peut être entièrement rouge et entièrement vert au même moment » est vraie, nous nous appuyons sur une sorte de « voir » intellectuel, analogue (mais non identique) à la perception sensible.<ref>BonJour, L., ''In Defense of Pure Reason. A Rationalist Account of A Priori Justification'', Cambridge UP, 1998, chap. 4.</ref> George Bealer parle d'« intuitions » au sens technique — des états mentaux où une proposition nous apparaît vraie sans que cette apparence repose sur l'inférence, la mémoire ou la perception — et soutient que ces intuitions constituent une source irréductible de justification ''a priori''.<ref>Bealer, G., « The Incoherence of Empiricism », ''Proceedings of the Aristotelian Society'', suppl. vol. 66, 1992, p. 99-138.</ref> Une question centrale est celle de la faillibilité : la justification ''a priori'' peut-elle être erronée ? Le rationalisme infaillibiliste traditionnel (attribué, peut-être un peu vite, à Descartes) répondait non : ce qui est connu ''a priori'' est connu avec certitude. Mais la plupart des épistémologues contemporains adoptent un rationalisme faillibiliste : une croyance peut être justifiée ''a priori'' tout en étant révisable, voire fausse.<ref>Casullo, A., ''A Priori Justification'', Oxford UP, 2003, chap. 2-3.</ref> L'histoire des mathématiques offre des exemples instructifs : des propositions longtemps tenues pour évidentes ''a priori'' (comme l'axiome des parallèles d'Euclide, ou certaines intuitions ensemblistes) se sont révélées contestables ou fausses. Se pose alors le problème de la défaisabilité (''defeasibility'') : la justification ''a priori'' peut-elle être défaite par des considérations empiriques ? Si un mathématicien croit ''a priori'' avoir trouvé une démonstration correcte, mais qu'un ordinateur vérifie les calculs et signale une erreur, la justification ''a priori'' initiale est-elle annulée par cette donnée empirique ? Albert Casullo distingue plusieurs manières dont l'expérience peut interagir avec la justification ''a priori'' : l'expérience ne fonde pas cette justification, mais elle peut la confirmer, la renforcer ou l'affaiblir.<ref>Casullo, A., ''A Priori Justification'', Oxford UP, 2003, chap. 3-4 ; voir aussi Kitcher, P., ''The Nature of Mathematical Knowledge'', Oxford UP, 1983, chap. 4.</ref> Cette discussion prolonge et nuance la critique quinienne en montrant que même les défenseurs de l{{'}}''a priori'' peuvent reconnaître des formes d'interaction avec l'expérience, sans pour autant dissoudre la notion. Timothy Williamson a récemment proposé une critique d'un autre genre : selon lui, la distinction entre ''a priori'' et ''a posteriori'' est moins nette qu'on ne le suppose, car la plupart des processus cognitifs réels mêlent des éléments expérientiels et non expérientiels de manière inextricable.<ref>Williamson, T., ''The Philosophy of Philosophy'', Blackwell, 2007, chap. 5.</ref> Plutôt que de demander si une connaissance est ''a priori'' ou ''a posteriori'', Williamson suggère de s'intéresser à la fiabilité et à la robustesse des méthodes cognitives employées, quelle que soit leur classification. === ''A priori'', analyticité et modalité : le paysage après Kripke === Les résultats de Kripke ont ouvert un espace de recherche très actif sur les rapports entre ''a priori'', analyticité et nécessité. David Chalmers et Frank Jackson ont développé le « bidimensionnalisme sémantique », qui tente de restaurer un lien systématique entre ''a priori'' et nécessité en distinguant deux dimensions de signification (le contenu « primaire » et le contenu « secondaire » d'un énoncé).<ref>Chalmers, D., « Does Conceivability Entail Possibility? », in T. Gendler et J. Hawthorne (éds.), ''Conceivability and Possibility'', Oxford UP, 2002, p. 145-200 ; Jackson, F., ''From Metaphysics to Ethics'', Oxford UP, 1998.</ref> Selon cette approche, les nécessités ''a posteriori'' de Kripke (comme « l'eau est H{{sub|2}}O ») ne sont pas de vraies exceptions : leur contenu primaire (ce que l'énoncé dit dans le monde actuel) est en réalité ''a priori'', tandis que leur contenu secondaire (ce qu'il dit dans tous les mondes possibles) est nécessaire. Le bidimensionnalisme est discuté et contesté, mais il témoigne de la vitalité du débat. Paul Boghossian a distingué deux conceptions de l'analyticité — la conception « métaphysique » (les propositions analytiques sont vraies en vertu de la signification seule) et la conception « épistémologique » (les propositions analytiques sont celles dont la compréhension suffit à justifier leur acceptation) — et a soutenu que seule la seconde résiste aux critiques quiniennes.<ref>Boghossian, P., « Analyticity Reconsidered », ''Noûs'', vol. 30, n° 3, 1996, p. 360-391.</ref> Ce travail montre que la question du rapport entre analyticité et ''a priori'' reste ouverte et féconde. === L{{'}}''a priori'', les sciences cognitives et la question de l'innéité === La question de l{{'}}''a priori'' réapparaît dans les sciences cognitives sous la forme du débat sur l'innéisme : existe-t-il des structures cognitives innées, indépendantes de l'expérience individuelle ? Le linguiste Noam Chomsky défend l'existence d'une « grammaire universelle » innée qui structure l'acquisition du langage.<ref>Chomsky, N., ''Règles et représentations'', 1980, trad. A. Kihm, Flammarion, 1985.</ref> Certains psychologues du développement, comme Elizabeth Spelke, ont identifié des « systèmes de connaissance fondamentale » (''core knowledge'') chez le nourrisson — une appréhension intuitive des nombres, des objets physiques, de la géométrie — qui semblent précéder toute instruction.<ref>Spelke, E. S. et Kinzler, K. D., « Core Knowledge », ''Developmental Science'', vol. 10, n° 1, 2007, p. 89-96.</ref> Cependant, il est important de ne pas confondre innéité et ''a priori''. L{{'}}''a priori'' est d'abord une notion épistémologique : il concerne le mode de justification d'une proposition ou d'une croyance — le fait qu'elle puisse être justifiée indépendamment de l'expérience (au sens large : perception, observation, évidence empirique sous toutes ses formes). L'innéité, en revanche, est une notion portant sur la genèse ou l'origine d'une structure cognitive : elle dit que cette structure n'a pas été acquise par apprentissage individuel, mais est présente dès la naissance (ou dès un stade très précoce du développement). Une structure cognitive peut être innée sans que les croyances qu'elle produit soient justifiées ''a priori'' ; inversement, une justification ''a priori'' peut en principe ne reposer sur aucune structure innée identifiable.<ref>Casullo, A., ''A Priori Justification'', Oxford UP, 2003, p. 145-150 ; Boghossian, P. et Peacocke, C. (éds.), ''New Essays on the A Priori'', Oxford UP, 2000, Introduction.</ref> L'épistémologie évolutionniste, issue notamment des travaux du biologiste Konrad Lorenz (1903-1989), illustre cette distinction de manière éclairante.<ref>Lorenz, K., « Kants Lehre vom Apriorischen im Lichte gegenwärtiger Biologie », ''Blätter für deutsche Philosophie'', vol. 15, 1941, p. 94-125.</ref> Lorenz propose de comprendre les structures kantiennes de perception et de cognition — notre appréhension de l'espace, du temps, de la causalité — comme des adaptations évolutives : elles seraient ''a priori'' pour l'individu (présentes avant toute expérience personnelle), mais ''a posteriori'' pour l'espèce (résultant d'une longue sélection naturelle). Cette perspective est suggestive, mais elle transpose la question de l{{'}}''a priori'' du plan épistémologique (comment une croyance est-elle justifiée ?) au plan génétique (comment une structure cognitive est-elle acquise ?). Or ce sont deux questions distinctes. Le fait qu'une capacité cognitive ait une origine évolutive ne dit rien, en tant que tel, sur le statut justificatif des croyances qu'elle produit : une capacité innée peut engendrer des croyances fausses, et une croyance justifiée ''a priori'' peut n'avoir aucun fondement biologique identifiable. === Philosophie morale et politique === L{{'}}''a priori'' joue également un rôle en éthique. Kant lui-même fonde sa philosophie morale sur un principe ''a priori'' : l'impératif catégorique, qui prescrit d'agir uniquement selon une maxime que l'on pourrait vouloir ériger en loi universelle.<ref>Kant, E., ''Fondation de la métaphysique des mœurs'', 1785, trad. A. Renaut, Garnier-Flammarion, 1994, Deuxième section.</ref> Ce principe ne dérive pas de l'expérience, mais de la raison pratique pure. Parmi les contemporains, Christine Korsgaard défend encore une conception kantienne de la moralité fondée sur des principes ''a priori'' de la raison pratique.<ref>Korsgaard, C., ''Creating the Kingdom of Ends'', Cambridge UP, 1996, chap. 1-3.</ref> La tradition phénoménologique, dans la lignée de Scheler, explore de son côté un ''a priori'' matériel des valeurs : l'existence de hiérarchies axiologiques (le noble supérieur à l'agréable, le sacré supérieur à l'utile) qui, sans être dérivées de l'expérience empirique, structurent notre vie morale et affective. == Conclusion == La distinction entre ''a priori'' et ''a posteriori'', loin d'être une simple classification scolaire, engage toute une conception de la connaissance humaine et de ses limites. Elle pose la question suivante : qu'est-ce que notre esprit apporte à la connaissance du réel, et qu'est-ce qu'il reçoit de l'expérience ? Si la réponse kantienne — avec ses formes ''a priori'' de la sensibilité et ses catégories de l'entendement — n'est plus acceptée telle quelle, elle a durablement marqué la philosophie en montrant que la connaissance n'est jamais une simple réception passive de données, mais implique toujours une activité structurante du sujet connaissant. Les débats contemporains sur la nature de la justification ''a priori'', sa faillibilité, les rapports entre ''a priori'', analyticité et nécessité, le rôle de l'intuition rationnelle, le statut des principes scientifiques ou les structures cognitives innées s'inscrivent tous, d'une manière ou d'une autre, dans l'héritage de cette distinction. Comprendre la notion d{{'}}''a priori'', c'est saisir l'un des fils conducteurs de l'histoire de la philosophie : la tentative de délimiter ce qui, dans notre connaissance du monde, relève de la constitution propre de notre esprit et ce qui provient de l'expérience sensible — autrement dit, de comprendre comment nous connaissons et quelles sont les conditions de possibilité de notre savoir. == Notes et références == {{references}} == Bibliographie == === Sources primaires classiques === * Platon, ''La République'', trad. G. Leroux, Garnier-Flammarion, 2004. * Platon, ''Ménon'', trad. M. Canto-Sperber, Garnier-Flammarion, 1993. * Descartes, René, ''Méditations métaphysiques'', 1641, éd. J.-M. Beyssade et M. Beyssade, Garnier-Flammarion, 2011. * Leibniz, Gottfried W., ''Nouveaux essais sur l'entendement humain'', 1765, éd. J. Brunschwig, Garnier-Flammarion, 1990. * Leibniz, Gottfried W., ''Monadologie'', 1714, éd. É. Boutroux, Delagrave, 1991. * Locke, John, ''Essai sur l'entendement humain'', 1689, trad. J.-M. Vienne, Vrin, 2001-2006 (2 vol.). * Hume, David, ''Traité de la nature humaine'', 1739, trad. Ph. Baranger et Ph. Saltel, Garnier-Flammarion, 1993-1999 (3 vol.). * Hume, David, ''Enquête sur l'entendement humain'', 1748, trad. A. Leroy, rév. M. Beyssade, Garnier-Flammarion, 2006. * Kant, Emmanuel, ''Critique de la raison pure'', 1781/1787, trad. A. Renaut, Garnier-Flammarion, 2006 ; trad. A. Tremesaygues et B. Pacaud, PUF, coll. « Quadrige », 2012. * Kant, Emmanuel, ''Prolégomènes à toute métaphysique future'', 1783, trad. J. Gibelin, rév. J. Rivelaygue, Vrin, 1986. * Kant, Emmanuel, ''Fondation de la métaphysique des mœurs'', 1785, trad. A. Renaut, Garnier-Flammarion, 1994. === Développements post-kantiens et XX{{e}} siècle === * Ayer, Alfred J., ''Language, Truth and Logic'', Gollancz, 1936 ; rééd. Penguin, 2001. * Husserl, Edmund, ''Recherches logiques'', 1900-1901, trad. H. Élie, A. L. Kelkel et R. Schérer, PUF, 1961-1963 (3 vol.). * Scheler, Max, ''Le formalisme en éthique et l'éthique matériale des valeurs'', 1913-1916, trad. M. de Gandillac, Gallimard, 1955. * Carnap, Rudolf, ''Der logische Aufbau der Welt'', 1928 ; trad. angl. ''The Logical Structure of the World'', Open Court, 2003. * Cassirer, Ernst, ''Substance et fonction'', 1910, trad. P. Caussat, Minuit, 1977. * Quine, Willard Van Orman, « Two Dogmas of Empiricism », ''The Philosophical Review'', vol. 60, n° 1, 1951, p. 20-43 ; repris dans ''From a Logical Point of View'', Harvard UP, 1953. * Quine, Willard Van Orman, ''Word and Object'', MIT Press, 1960. * Grice, Herbert P. et Strawson, Peter F., « In Defense of a Dogma », ''Philosophical Review'', vol. 65, n° 2, 1956, p. 141-158. * Kripke, Saul, ''Naming and Necessity'', Harvard UP, 1980 ; trad. fr. P. Jacob et F. Recanati, ''La logique des noms propres'', Minuit, 1982. * Dufrenne, Mikel, ''L'inventaire des a priori. Recherche de l'originaire'', Christian Bourgois, 1981 ; rééd. PU de Caen, 2018. === Épistémologie contemporaine de l{{'}}''a priori'' === * Boghossian, Paul et Peacocke, Christopher (éds.), ''New Essays on the A Priori'', Oxford UP, 2000. * Boghossian, Paul, « Analyticity Reconsidered », ''Noûs'', vol. 30, n° 3, 1996, p. 360-391. * BonJour, Laurence, ''In Defense of Pure Reason. A Rationalist Account of A Priori Justification'', Cambridge UP, 1998. * Casullo, Albert, ''A Priori Justification'', Oxford UP, 2003. * Casullo, Albert (éd.), ''A Priori Knowledge'', Oxford UP, 2012 (anthologie de textes classiques et contemporains). * Chalmers, David, « Does Conceivability Entail Possibility? », in T. Gendler et J. Hawthorne (éds.), ''Conceivability and Possibility'', Oxford UP, 2002, p. 145-200. * Kitcher, Philip, ''The Nature of Mathematical Knowledge'', Oxford UP, 1983. * Williamson, Timothy, ''The Philosophy of Philosophy'', Blackwell, 2007. === Études et manuels sur Kant === * Benoist, Jocelyn, ''L'a priori conceptuel. Bolzano, Husserl, Schlick'', Vrin, 1999. * Friedman, Michael, ''Kant and the Exact Sciences'', Harvard UP, 1992. * Friedman, Michael, ''Dynamics of Reason'', CSLI Publications, 2001. * Gueroult, Martial, ''La Critique de la raison pure de Kant'', Collège de France, 2022. * Guillermit, Louis, ''Leçons sur la Critique de la raison pure de Kant'', Vrin, 2008. * Guyer, Paul, ''Kant'', Routledge, 2006. * Pascal, Georges, ''Pour connaître la pensée de Kant'', Bordas, 1996. * Vuillemin, Jules, ''Leçons sur Kant'', PUF, 1967. === Philosophie morale, sciences cognitives, perspectives complémentaires === * Chomsky, Noam, ''Règles et représentations'', 1980, trad. A. Kihm, Flammarion, 1985. * Korsgaard, Christine, ''Creating the Kingdom of Ends'', Cambridge UP, 1996. * Lorenz, Konrad, « Kants Lehre vom Apriorischen im Lichte gegenwärtiger Biologie », ''Blätter für deutsche Philosophie'', vol. 15, 1941, p. 94-125. * Spelke, Elizabeth S. et Kinzler, Katherine D., « Core Knowledge », ''Developmental Science'', vol. 10, n° 1, 2007, p. 89-96. * Jackson, Frank, ''From Metaphysics to Ethics'', Oxford UP, 1998. {{IndexPhilo}} {{AutoCat}} m2r9oxt306gvlj97w6or1zyk2r68aca Dictionnaire de philosophie/Absurde 0 83002 767974 767543 2026-06-18T04:51:10Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 767974 wikitext text/x-wiki {{DicoPhilo|Absurde|lecture=oui}} == A. Définitions et origines du concept == === L’étymologie : de la dissonance au non-sens === Le terme absurde dérive du latin ''absurdus'', dont le sens premier est « dissonant », « qui sonne faux », « qui détonne »<ref>Cicéron, ''De l’orateur'' (''De oratore''), III, 41, qui parle d’une « ''vox absona atque absurda'' », une voix « discordante et qui sonne faux ».</ref>. Cette origine musicale n’est pas anodine : elle suggère d’emblée que l’absurde ne se réduit pas à une simple absence de sens, mais désigne d’abord une discordance, un désaccord profond entre des éléments qui devraient s’accorder et qui, au contraire, heurtent l’oreille ou l’intelligence. Sur le plan étymologique, ''absurdus'' se forme sur ''surdus'' (« sourd », mais aussi « au son mat », « étouffé »), précédé du préfixe ''ab-''. Contrairement à une idée répandue, le sens littéral attesté en latin classique n’est pas celui d’un son « inentendu » ou « inouï », mais celui d’un son qui détonne : une voix « rauque », « discordante », « qui sonne faux ». L’hypothèse qui rattache ''ab-surdus'' à ce « dont on n’a jamais ouï parler » demeure plus conjecturale<ref>Voir Charlton T. Lewis et Charles Short, ''A Latin Dictionary'', Oxford, Clarendon Press, 1879, ''s. v.'' « absurdus » (« ''out of tune, hence giving a disagreeable sound, harsh, rough'' ») ; pour l’hypothèse du « non-entendu », Michiel de Vaan, ''Etymological Dictionary of Latin and the Other Italic Languages'', Leyde, Brill, 2008, ''s. v.'' « surdus ». Voir aussi le Centre National de Ressources Textuelles et Lexicales (CNRTL), article « absurde ».</ref>. De là naît le glissement vers des acceptions plus générales : est absurde ce qui « ne tient pas debout », ce qui choque le bon sens, ce qui s’oppose à la rationalité commune. Dès l’Antiquité romaine, chez Térence ou Cicéron, ''absurdus'' qualifie un propos, un discours, une attitude qui paraissent « saugrenus », « déplacés », « insupportables à l’oreille ». L’absurde devient ainsi ce qui résiste à l’intelligence et déroute la raison. Ce déplacement sémantique prépare la double postérité du terme : d’une part en logique, où il désigne la contradiction flagrante ; d’autre part en philosophie existentielle, où il en viendra à caractériser la disproportion entre l’homme et le monde. === L’absurde en logique : le raisonnement par l’absurde === Avant de devenir un motif majeur de la philosophie de l’existence, l’absurde reçoit d’abord une signification logique et mathématique rigoureuse. En logique classique, le raisonnement par l’absurde (''reductio ad absurdum'') est une méthode démonstrative qui consiste à établir la vérité d’une proposition en montrant que sa négation conduit à une contradiction ou à une conséquence manifestement impossible. Le schème est bien connu : pour démontrer une proposition ''p'', on suppose provisoirement ''¬p'' (la négation de ''p'') et l’on montre que cette supposition, combinée à des principes admis, débouche sur une impossibilité logique ou factuelle (par exemple sur ''q'' et ''¬q'' à la fois). L’« absurde » désigne alors ce résultat inacceptable qui viole le principe de non-contradiction. Dès lors, la supposition initiale ''¬p'' étant réfutée, c’est ''p'' qui se trouve démontrée. Cette méthode, déjà utilisée par les mathématiciens grecs (la démonstration de l’irrationalité de √2 en offre l’exemple classique), illustre une première acception du terme : l’absurde comme incohérence logique et impossibilité formelle au sens strict. Toutefois, il convient de préciser que la portée de la réduction à l’absurde dépend du cadre logique dans lequel on se place. En logique classique, fondée sur les principes du tiers exclu et de non-contradiction, cette méthode est pleinement valide<ref>Voir par exemple Aristote, ''[[s:Premiers Analytiques|Premiers Analytiques]]'', II, 14, 62b 29-40, pour l’usage de la démonstration par l’impossible.</ref>. En revanche, dans les logiques non classiques, comme la logique intuitionniste, qui n’admet pas le tiers exclu comme principe général valable pour toute proposition, la portée de cette méthode est limitée. L’intuitionnisme admet bien certains raisonnements par contradiction : montrer que ''A'' conduit à une contradiction établit légitimement ''¬A''. Ce qu’il refuse en général, c’est la démonstration indirecte de ''A'' à partir de ''¬¬A'' : la double négation ''¬¬A'' n’équivaut pas à ''A'', car réfuter la négation de ''A'' ne fournit pas la preuve constructive que la vérité de ''A'' exige<ref>Arend Heyting, « Die formalen Regeln der intuitionistischen Logik », ''Sitzungsberichte der Preussischen Akademie der Wissenschaften, Physikalisch-mathematische Klasse'', 1930, p. 42-56.</ref>. Le raisonnement par l’absurde n’est donc pas une méthode universelle et neutre : il dépend de certains principes logiques, notamment le tiers exclu et l’élimination de la double négation. Être « absurde », dans ce contexte, ce n’est pas manquer de sens existentiel, mais violer les règles élémentaires de cohérence telles que définies par un système déductif donné. === L’absurde comme dissonance existentielle === Au XX{{e}} siècle, dans le contexte des catastrophes historiques, le mot absurde change de registre et acquiert une dimension existentielle nouvelle. Il ne renvoie plus seulement à l’« impossible logique », mais à une expérience humaine intime : celle du non-sens de l’existence, de l’impossibilité de trouver une justification, une finalité lisible ou une providence bienveillante dans la condition humaine. Ce déplacement n’efface pas la signification étymologique : il l’approfondit. L’absurde, désormais, désigne la dissonance entre deux ordres hétérogènes : d’un côté, le désir humain de clarté, de sens, de cohérence ; de l’autre, l’opaque indifférence du monde, son mutisme, son caractère irréductiblement étranger à nos attentes. Albert Camus formule cette idée de manière canonique dans ''Le Mythe de Sisyphe'' (1942) : <blockquote>« L’absurde naît de cette confrontation entre l’appel humain et le silence déraisonnable du monde. »<ref>Albert Camus, ''Le Mythe de Sisyphe'', Paris, Gallimard, 1942 ; repris in ''Essais'', éd. R. Quilliot et L. Faucon, Paris, Gallimard, coll. « Bibliothèque de la Pléiade », 1965, p. 113.</ref></blockquote> L’absurde n’est donc ni dans l’homme seul, ni dans le monde pris isolément. Un monde sans conscience ne serait pas absurde : il serait simplement là, indifférent à toute question. Un homme vivant dans un univers pleinement intelligible ne connaîtrait pas l’absurde. L’absurde surgit précisément de leur coprésence, de leur confrontation : de la rencontre entre une exigence de sens et un réel qui ne répond pas. === L’absurde comme condition métaphysique de l’homme conscient === Dans l’œuvre de Camus, l’absurde n’est ni un malaise passager ni une humeur individuelle, mais une structure de l’existence qui se révèle dès que l’homme cesse de vivre dans l’inconscience routinière et affronte lucidement ce qu’il est et ce qu’est le monde. Ce surgissement de l’absurde est lié à plusieurs expériences, souvent banales en apparence, mais philosophiquement révélatrices : * La certitude de la mort : fin inéluctable qui relativise l’ensemble de nos projets et ruine l’idée d’une justification ultime de nos efforts. La mort introduit au cœur de la vie un terme absolu, qui rend dérisoires les prétentions à la totalité et à l’achèvement. * Le caractère machinal de l’existence : la répétition des jours, la routine du travail, la succession des gestes quotidiens peuvent soudain apparaître dans leur nudité : « se lever, tramway, quatre heures de bureau ou d’usine, repas, tramway, quatre heures de travail, repas, sommeil et lundi mardi mercredi jeudi vendredi et samedi sur le même rythme », écrit Camus, avant de conclure : « un jour seulement le "pourquoi" s’élève et tout commence dans cette lassitude teintée d’étonnement »<ref>Albert Camus, ''Le Mythe de Sisyphe'', in ''Essais'', op. cit., p. 107.</ref>. * L’étrangeté du monde : ce qui nous était familier se dérobe soudain ; les choses, les êtres, les institutions nous apparaissent comme étrangers, « hostiles » à nos espérances, dépourvus de toute connivence avec nos désirs. * L’écoulement irréversible du temps : la prise de conscience que le temps ne revient pas, que chaque instant est perdu pour toujours, et que l’ensemble de notre vie se dirige vers un point final qui n’est ordonné à aucun sens nécessaire. Ces expériences déclenchent une lucidité douloureuse. L’absurde n’est pas un concept abstrait, mais le nom donné à cette clairvoyance brutale où l’on constate que rien, ni dans la structure du monde ni dans une quelconque providence, ne vient garantir le sens de l’existence. L’homme absurde est celui qui persiste dans cette lucidité sans se réfugier dans l’oubli, l’illusion ou la foi consolatrice. === Distinction entre absurde, nihilisme et non-sens === Il importe de distinguer l’absurde de notions voisines avec lesquelles il est souvent confondu, en particulier le non-sens et le nihilisme. Le non-sens désigne ce qui est dépourvu de signification intelligible. Un énoncé grammaticalement construit peut être sémantiquement vide ou incohérent (« le carré bleu est jaloux ») ; une situation peut être dite « insensée » lorsqu’elle échappe à toute interprétation cohérente. Dans ce cas, il y a simplement absence de sens, échec de la compréhension. Le nihilisme est, lui, une position philosophique ou existentielle qui affirme l’inexistence de toute valeur objective, de toute vérité absolue, de tout fondement moral ou métaphysique. Pour le nihiliste, « rien ne vaut », aucune norme n’est plus justifiée qu’une autre ; le monde n’offre aucune hiérarchie de valeurs, seulement une égalité dans le néant. L’absurde ne se confond ni avec le non-sens pur ni avec le nihilisme. Il suppose au contraire la coexistence de deux exigences irréductibles : d’un côté, la recherche humaine de sens, de justification, de valeur ; de l’autre, le constat que le monde ne répond pas à cette exigence. L’absurde n’est donc pas le vide de sens, mais une contradiction vécue, une antinomie maintenue entre aspiration et réalité. Thomas Nagel l’exprime avec précision : l’absurde, selon lui, ne vient pas seulement du fait que « le monde n’a pas de sens », mais du fait que nous pouvons, d’un même mouvement, prendre nos vies très au sérieux et les envisager d’un point de vue distancié où elles apparaissent « arbitraires, contingentes et dérisoires »<ref>Thomas Nagel, « The Absurd », ''The Journal of Philosophy'', vol. 68, n{{o}} 20, 1971, p. 716-727.</ref>. L’absurde naît de cette oscillation, inhérente à la conscience humaine, entre implication passionnée et recul ironique. === Contexte historique et antécédents du concept === Si le mot « absurde » existe depuis l’Antiquité, c’est au XX{{e}} siècle, dans le contexte des catastrophes historiques (Première Guerre mondiale, totalitarismes, Shoah, bombe atomique), que le concept prend son importance philosophique et existentielle. Rappelons toutefois les antécédents de cette thématisation moderne. Dans la philosophie grecque antique, le terme ἄτοπον (''atopon'', littéralement « sans lieu », « étrange », « absurde ») qualifie déjà ce qui sort de l’ordre attendu, ce qui échappe à la rationalité commune. Platon et Aristote utilisent ce vocabulaire pour désigner ce qui est paradoxal ou contraire à la raison<ref>Voir par exemple Platon, ''Parménide'', 128d, où le paradoxe de l’Un est qualifié d’ἄτοπον ; et Aristote, ''Métaphysique'', Λ 10, 1075b, où certaines positions présocratiques sont dites absurdes (ἄτοπον).</ref>. La pensée médiévale, quant à elle, connaît des usages de l’absurde liés à la théologie : l’absurde peut désigner ce qui contredit la foi ou ce qui échappe à la raison naturelle sans être pour autant faux. Le célèbre « ''Credo quia absurdum'' » (« Je crois parce que c’est absurde »), attribué à [[s:Auteur:Tertullien|Tertullien]], exprime l’idée que la vérité chrétienne, parce qu’elle dépasse la raison, paraît absurde aux yeux de celle-ci<ref>Formule attribuée à Tertullien, inspirée de son traité ''De carne Christi'', V, 4, où il écrit : « ''Crucifixus est Dei Filius ; non pudet, quia pudendum est. Et mortuus est Dei Filius ; prorsus credibile est, quia ineptum est. Et sepultus resurrexit ; certum est, quia impossibile'' » (« Le Fils de Dieu a été crucifié ; je n’en ai pas honte, parce que c’est honteux. Et le Fils de Dieu est mort ; c’est tout à fait croyable, parce que c’est insensé. Et, enseveli, il est ressuscité ; c’est certain, parce que c’est impossible »).</ref>. Cette tradition se prolonge, sous des formes diverses, chez des penseurs comme Nicolas de Cues, qui pense la coïncidence des opposés en Dieu, ou Pascal, qui ne parle pas d’« absurde » mais de disproportion de l’homme, de misère et de grandeur, de raisons du cœur que la raison ne connaît pas. Rabattre sur eux la catégorie d’« absurde », au sens kierkegaardien ou camusien, serait anachronique. Au XIX{{e}} siècle, des auteurs comme Schopenhauer, Kierkegaard et Nietzsche préparent le terrain à la philosophie moderne de l’absurde. Schopenhauer pose que le Vouloir-vivre, principe métaphysique de la réalité, est dépourvu de finalité et condamne l’existence à un perpétuel balancement entre souffrance et ennui<ref>Arthur Schopenhauer, ''[[s:Le Monde comme volonté et comme représentation|Le Monde comme volonté et comme représentation]]'', trad. A. Burdeau, rév. R. Roos, Paris, PUF, 1966, livre IV.</ref>. Kierkegaard, de son côté, fait du « paradoxe absolu » de l’Incarnation le cœur de la foi chrétienne : Dieu s’est fait homme dans le temps, ce qui est impensable pour la raison et constitue un scandale<ref>Søren Kierkegaard, ''Miettes philosophiques'', in ''Œuvres complètes'', trad. P.-H. Tisseau et E.-M. Jacquet-Tisseau, Paris, L’Orante, t. 7, 1973, p. 53-59.</ref>. Chez Kierkegaard, toutefois, l’absurde n’a pas le même statut que chez Camus : il est lié au paradoxe de la foi et appelle non pas le désespoir, mais le « saut » dans la foi. Il serait inexact de n’en faire qu’un exemple de « dépassement » illégitime de l’absurde au sens camusien : pour Kierkegaard, l’absurde (au sens du paradoxe de l’Incarnation) ne se « résout » pas par une explication rationnelle, mais s’assume dans la subjectivité passionnée du croyant. La différence avec Camus ne tient pas tant à un refus ou une acceptation de l’absurde qu’au type de réponse existentielle qu’il appelle : pour l’un, la foi ; pour l’autre, la révolte lucide. Nietzsche, enfin, déclare la mort de Dieu et ouvre la voie à un nihilisme que l’homme doit surmonter en créant lui-même ses valeurs<ref>Friedrich Nietzsche, ''Le Gai Savoir'', § 125 (« L’insensé »), trad. P. Wotling, Paris, GF-Flammarion, 1997, p. 177-179.</ref>. Ces trois penseurs, chacun à sa manière, posent les jalons d’une réflexion sur le non-sens ou l’absence de fondement ultime de l’existence. La littérature de l’absurde se développe dans l’entre-deux-guerres et surtout après la Seconde Guerre mondiale. Elle met en scène le désarroi de l’homme moderne, devenu « étranger » au monde, à lui-même, aux autres. Comment continuer à croire au progrès, à la rationalité de l’histoire, à la dignité de l’humanité après Verdun, Auschwitz, Hiroshima ? Comment interpréter une époque où les avancées techniques servent autant à soigner qu’à anéantir, où la rationalité s’emploie à organiser le génocide ou la destruction massive ? Des écrivains comme Franz Kafka (''La Métamorphose'', ''Le Procès''), Albert Camus (''L’Étranger'', ''Le Mythe de Sisyphe''), Jean-Paul Sartre, Eugène Ionesco, Samuel Beckett donnent à l’absurde une densité littéraire nouvelle. Le concept devient l’une des catégories majeures par lesquelles se lit la condition humaine moderne, marquée par le désenchantement du monde, la crise des repères religieux et moraux et la défiance à l’égard des grands récits politiques. Il ne résume pas pour autant toute la pensée du siècle : le marxisme, la phénoménologie, le personnalisme, le structuralisme naissant ou la philosophie analytique ne posent pas le problème dans les mêmes termes. == B. Contexte historique d’émergence == === La Grande Guerre et la première crise de sens === Le concept moderne d’absurde, tel qu’il sera thématisé par Camus et dans le contexte plus large des philosophies de l’existence, plonge ses racines dans les bouleversements de la Première Guerre mondiale (1914-1918). La Grande Guerre inaugure un type de conflit où la violence devient industrielle et impersonnelle : mitrailleuses, gaz, artillerie lourde, bombardements massifs transforment le champ de bataille en un mécanisme d’anéantissement anonyme. Les offensives meurtrières qui ne « gagnent » que quelques kilomètres de terrain, les millions de morts et de mutilés, la vie des tranchées faite de boue, de peur et d’attente, engendrent une expérience vécue de l’absurdité bien avant que le terme ne soit théorisé. Aux yeux de nombreux contemporains, la guerre apparaît comme un gaspillage insensé de vies humaines au service de causes mal définies ou de nationalismes aveugles. Cette catastrophe militaire et morale ébranle profondément la confiance héritée du XIX{{e}} siècle dans le progrès, la raison et l’humanisme. Comment encore croire que l’histoire suit une marche ascendante vers la civilisation, lorsque la science et la technique se mettent au service de la destruction de masse ? Les historiens ont parlé à ce propos de brutalisation des sociétés européennes, pour désigner la diffusion durable de la violence dans les mentalités, mais aussi d’une désillusion à l’égard des valeurs qui avaient structuré le monde d’avant 1914<ref>George L. Mosse, ''De la Grande Guerre au totalitarisme. La brutalisation des sociétés européennes'', trad. C. Terrier, Paris, Hachette, 1999.</ref>. La Grande Guerre pose à nouveaux frais la question de la Providence. Comment concilier l’idée d’un Dieu bon et tout-puissant avec l’horreur industrielle des champs de bataille ? La foi chrétienne, déjà fragilisée par la sécularisation, subit un choc supplémentaire. L’entre-deux-guerres voit ainsi se diffuser un vide métaphysique qui prépare le terrain à la philosophie de l’absurde : la certitude s’effrite, le sens traditionnel se fissure, sans que de nouveaux fondements viennent prendre le relais. === L’entre-deux-guerres : germination de l’absurde === La période 1918-1939 est ambivalente : d’un côté, un grand élan de reconstruction et de création artistique ; de l’autre, une inquiétude sourde, faite de crises économiques, de violences politiques et d’angoisses collectives. C’est dans ce climat que se multiplient les premières expressions littéraires de ce que l’on appellera plus tard la littérature de l’absurde. Les romans de Franz Kafka (''La Métamorphose'', 1915 ; ''Le Procès'', publié en 1925 ; ''Le Château'', posthume) mettent en scène des personnages confrontés à des situations incompréhensibles, réglées par des bureaucraties opaques, des institutions sans visage, des règles obscures. Le terme « kafkaïen » est resté pour désigner ces expériences où l’individu se heurte à un monde dont la logique lui échappe totalement. L’œuvre de Kafka anticipe, sur le mode de la parabole, l’expérience de l’absurde : sentiment d’être étranger à sa propre vie, impossibilité d’accéder à un sens lisible. Parallèlement, les totalitarismes se mettent en place : fascisme italien, nazisme, stalinisme. Ils prétendent conférer à l’histoire un sens absolu (nation, race, classe), mais révèlent, par la terreur et la propagande, la dimension arbitraire et violente de ces pseudo-fondements. La promesse d’un sens global se renverse en expérience de l’inhumain et du mensonge systématique. La crise économique de 1929 et la Grande Dépression renforcent la précarité sociale et le sentiment d’irrationalité historique : millions de chômeurs, faillites en chaîne, misère de masse. Le sentiment que le monde économique et politique obéit à des forces anonymes et incompréhensibles renforce l’impression que l’existence est livrée au hasard et à l’irrationalité. Les conditions intellectuelles dans lesquelles se développeront, après 1945, la philosophie et la littérature de l’absurde sont ainsi réunies. === La Seconde Guerre mondiale et l’intensification du sentiment d’absurde === La Seconde Guerre mondiale (1939-1945) intensifie la thématique de l’absurde et lui donne une résonance collective. Une précision chronologique s’impose toutefois : ''Le Mythe de Sisyphe'' paraît en 1942, avant que l’extermination des Juifs d’Europe ne soit pleinement connue et avant l’âge atomique. La constitution philosophique de l’absurde chez Camus ne procède donc pas de la Shoah ni d’Hiroshima ; elle se nourrit plutôt de l’existentialisme naissant, d’une phénoménologie diffuse de l’étrangeté, et de lectures de Dostoïevski, Kafka, Nietzsche et Kierkegaard. Ce que la guerre et l’après-guerre apportent, c’est moins l’origine de cette pensée que sa diffusion et son écho élargi. Par son ampleur, sa puissance de destruction, la planification du génocide et l’usage de la bombe atomique, le conflit pousse à l’extrême une expérience du non-sens que la philosophie de l’absurde avait commencé à formuler pour d’autres raisons. Au cœur de cette catastrophe, la Shoah, extermination systématique de six millions de Juifs d’Europe, remet en question jusqu’aux catégories morales et esthétiques traditionnelles. Theodor W. Adorno pourra écrire, dans une formule célèbre, que « rédiger un poème après Auschwitz est barbare », tant l’horreur subvertit les cadres habituels de la culture et de la pensée<ref>Theodor W. Adorno, ''Prismes. Critique de la culture et société'', trad. G. et R. Rochlitz, Paris, Payot, 1986, p. 27.</ref>. Comment continuer à parler de progrès moral, de civilisation ou de sens de l’histoire après les camps ? L’explosion des bombes atomiques sur Hiroshima et Nagasaki (août 1945) ajoute une dimension nouvelle : l’humanité découvre qu’elle possède désormais les moyens techniques de s’anéantir elle-même. L’ère atomique est aussi l’ère où le progrès scientifique devient explicitement ambigu : source de confort, mais aussi de menace globale. La possibilité de la fin de l’espèce humaine par sa propre main nourrit une angoisse d’un genre nouveau, qui renforce le sentiment d’absurdité. Dans ce contexte, les œuvres de Camus (''L’Étranger'', ''Le Mythe de Sisyphe'' en 1942) et de Sartre trouvent un écho considérable. Sartre, toutefois, ne pense pas l’absurde tout à fait comme Camus : l’expérience voisine y prend surtout la forme de la contingence et de la nausée devant l’existence brute, comme dans le roman ''La Nausée'' (1938), avant d’être articulée à la liberté, à la mauvaise foi et au néant dans ''L’Être et le Néant'' (1943). Ces œuvres donnent une forme philosophique et littéraire à un malaise largement partagé : comment vivre, agir, juger dans un monde où les repères traditionnels se sont effondrés ? === L’après-guerre et la diffusion de l’existentialisme === À la Libération, la France connaît une effervescence intellectuelle intense. Le quartier de Saint-Germain-des-Prés devient le lieu emblématique où se cristallisent les débats existentialistes et la réflexion sur l’absurde. Dans les cafés, dans les revues, au théâtre, on discute de liberté, d’engagement, de responsabilité, de non-sens de l’existence. En octobre 1945, Jean-Paul Sartre prononce sa conférence ''L’existentialisme est un humanisme'' devant un public nombreux et passionné. L’événement consacre l’existentialisme comme mouvement intellectuel de premier plan. Sartre y résume quelques thèses centrales : « l’existence précède l’essence », « l’homme n’est rien d’autre que ce qu’il se fait », « nous sommes condamnés à être libres ». Ces formules, largement reprises, popularisent l’idée que l’homme, livré à une liberté sans garantie et à un monde dépourvu de sens préétabli, doit inventer lui-même sa propre voie. L’existentialisme déborde alors le cadre strictement philosophique pour devenir un phénomène culturel : on parle de « mode existentialiste », de « caves existentialistes », où se mêlent jazz, discussions métaphysiques et interrogation sur la liberté. Au-delà de la caricature, cette diffusion témoigne d’une angoisse diffuse : comment habiter un monde où Dieu semble absent et où les valeurs s’effondrent ? === Le théâtre de l’absurde === Dans les années 1950, le questionnement sur l’absurde trouve une expression privilégiée au théâtre. Le critique Martin Esslin parlera, en 1961, de « théâtre de l’absurde » pour désigner un ensemble d’auteurs, au premier rang desquels Samuel Beckett et Eugène Ionesco, qui rompent avec les conventions dramatiques classiques pour mettre en scène la vacuité du langage, l’inefficacité de la communication, l’opacité du monde<ref>Martin Esslin, ''The Theatre of the Absurd'', New York, Anchor Books, 1961.</ref>. L’expression ne désigne pas un mouvement organisé, mais une catégorie critique rétrospective regroupant des dramaturgies différentes, que les auteurs concernés n’ont pas toujours revendiquée. Dans ''En attendant Godot'' (1953), Beckett montre deux personnages qui remplissent le vide de leur existence par des paroles et des gestes dérisoires, dans l’attente d’un Godot qui ne vient jamais. La pièce est devenue l’emblème de la condition absurde : attendre un sens qui ne vient pas, persévérer pourtant, sans autre raison que l’habitude ou la peur du vide. Chez Ionesco, ''La Cantatrice chauve'' (1950) expose la décomposition du langage ordinaire en clichés et en non-sens ; ''Rhinocéros'' (1959) met en scène la métamorphose des habitants d’une ville en animaux massifs, image de la contagion du conformisme et de l’adhésion aux puissances totalitaires. Dans ces œuvres, l’absurde n’est pas seulement un thème : il devient une forme, une manière de faire craquer les cadres du théâtre réaliste et psychologique. === Une rupture avec les valeurs traditionnelles === Plus largement, l’émergence de la philosophie de l’absurde s’inscrit dans une crise des valeurs qui avaient structuré la civilisation européenne. Trois grandes croyances traditionnelles vacillent simultanément : * La foi religieuse : le christianisme ne parvient plus à structurer l’horizon de sens des sociétés occidentales comme il l’avait fait pendant des siècles. La sécularisation, les sciences historiques et critiques, l’expérience des guerres minent la représentation d’un monde gouverné par une Providence juste et bienveillante. * La foi dans le progrès : l’idée, héritée des Lumières, selon laquelle la science, la technique et la raison conduiraient nécessairement à un mieux moral et politique se trouve réfutée par les faits. Le progrès apparaît désormais comme ambivalent : porteur de confort et de destruction, d’émancipation et de domination. * La confiance humaniste dans l’homme : l’humanisme optimiste, qui plaçait sa confiance dans la rationalité et la bonté humaines, est mis à mal par l’expérience des camps, des génocides, des violences de masse. La capacité de l’homme à commettre le pire oblige à repenser l’idée même d’« humanité ». Dans ce contexte d’effondrement des certitudes, la philosophie de l’absurde ne propose pas un nouveau système de consolation. Elle invite plutôt à affronter lucidement la condition humaine sans se réfugier dans des illusions rassurantes. L’absurde devient alors une catégorie permettant de penser une existence privée de garanties transcendantes, mais ouverte à une révolte, à une liberté et à une créativité nouvelles. == C. Problématique générale == La philosophie de l’absurde ne se contente pas de décrire une situation historique ou un sentiment diffus : elle pose des questions qui touchent au cœur de l’existence humaine. Où se loge l’absurde ? Comment y répondre ? Conduit-il à la destruction des valeurs ou à une forme nouvelle de liberté ? Trois grandes problématiques structurent le débat. === L’absurde est-il dans le monde ou dans l’homme ? === La première question est ontologique : où situer l’absurde ? Est-il une propriété du monde, une disposition de l’esprit, ou le produit d’une relation particulière entre les deux ? Pour Camus, l’absurde n’est « ni dans l’homme, ni dans le monde, mais dans leur présence commune ». Il écrit : <blockquote>« L’absurde naît de cette confrontation entre l’appel humain et le silence déraisonnable du monde. »<ref>Albert Camus, ''Le Mythe de Sisyphe'', in ''Essais'', op. cit., p. 113.</ref></blockquote> Et il précise : <blockquote>« L’absurde dépend autant de l’homme que du monde. Il est pour le moment leur seul lien. »<ref>Albert Camus, ''Le Mythe de Sisyphe'', in ''Essais'', op. cit., p. 114.</ref></blockquote> L’absurde est ainsi essentiellement relationnel. Il ne se confond pas avec l’irrationalité du monde : le monde est « déraisonnable » en ce sens qu’il ne répond pas à nos catégories, mais il n’est pas par lui-même absurde. Il ne se réduit pas non plus à un état d’âme subjectif : ce n’est pas parce que je suis mélancolique que le monde devient absurde. L’absurde apparaît lorsque se rencontrent une exigence de sens et un silence. Thomas Nagel, de son côté, tend à intérioriser davantage la source de l’absurde. Selon lui, l’absurde vient de la capacité spécifiquement humaine à adopter deux points de vue incompatibles sur sa propre existence : le point de vue engagé, à partir duquel nous prenons nos projets très au sérieux, et le point de vue distancié, quasi cosmique, à partir duquel ces mêmes projets apparaissent contingents et dérisoires<ref>Thomas Nagel, « The Absurd », article cité, ''The Journal of Philosophy'', 1971.</ref>. L’absurde est alors moins un conflit entre l’homme et le monde qu’une tension interne à la conscience humaine, déchirée entre implication et recul. Ces analyses ne s’excluent pas : elles soulignent deux faces d’une même structure. Dans tous les cas, l’absurde résulte d’une dualité irréductible : nous ne pouvons cesser ni de désirer du sens, ni de constater l’absence de fondement ultime ; nous ne pouvons renoncer ni à vivre nos engagements, ni à voir leur fragilité. === Peut-on vivre avec l’absurde ou doit-on le résoudre ? === Une fois l’absurde reconnu, se pose la question de la réponse existentielle. Faut-il tenter de le supprimer, de le contourner, ou peut-on vivre avec lui de manière lucide ? ==== Le suicide physique : refuser de vivre l’absurde ==== Camus ouvre ''Le Mythe de Sisyphe'' par une formule devenue célèbre : <blockquote>« Il n’y a qu’un problème philosophique vraiment sérieux : c’est le 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. »<ref>Albert Camus, ''Le Mythe de Sisyphe'', in ''Essais'', op. cit. ; phrase qui ouvre la section « L’absurde et le suicide ».</ref></blockquote> Si la vie est dépourvue de sens, si l’existence est absurde, la tentation est grande de conclure qu’elle ne mérite pas d’être poursuivie. Le suicide apparaît alors comme une issue logique. Pourtant, Camus le refuse explicitement : pour lui, le suicide est une démission, un consentement à l’absurde. Se tuer, c’est reconnaître que l’on est vaincu par la contradiction, c’est renoncer à la lutte, c’est transformer le constat de l’absurde en renoncement à vivre. ==== Le suicide philosophique : le refuge dans la transcendance ==== À côté du suicide physique, Camus dénonce ce qu’il appelle le suicide philosophique : toutes les tentatives théoriques qui, après avoir posé l’absurde, s’empressent de le « dépasser » en invoquant une transcendance (Dieu, l’Absolu, l’Esprit, l’Histoire, etc.). Le ''saut'' religieux de Kierkegaard ou certaines philosophies qui font de l’absurde un simple moment dialectique rapidement surmonté par une réconciliation supérieure illustrent, selon Camus, cette tentation. Le reproche camusien est clair : expliquer l’absurde, le réinscrire dans un ordre supérieur de sens, c’est précisément l’abolir. Or, ce qui caractérise l’absurde est de demeurer sans solution : toute tentative de le résoudre par un recours à la transcendance revient à escamoter la difficulté, à supprimer la contradiction au lieu de la supporter. ==== Vivre l’absurde : révolte, liberté, passion ==== Camus propose une troisième voie : vivre avec l’absurde en maintenant la tension, sans succomber ni au suicide, ni au refuge consolateur. Cette attitude comporte trois dimensions solidaires : * La révolte : persévérer dans la confrontation, refuser de baisser les yeux, ne jamais consentir à ce que l’absurde soit une raison de renoncer à vivre. * La liberté : libéré des promesses illusoires d’un au-delà du monde, l’homme absurde conquiert une liberté nouvelle. Ne comptant plus sur une justification ultime, il se sait responsable, ici et maintenant, de ses choix. À ce stade, ''Le Mythe de Sisyphe'' décrit surtout une attitude existentielle ; la question d’une éthique commune et de ses valeurs ne sera reprise que plus tard, dans ''L’Homme révolté''. * La passion : vivre « le plus possible », multiplier les expériences, ne rien sacrifier au nom d’un futur hypothétique. Là où la morale traditionnelle hiérarchise les vies selon leur conformité à des normes transcendantes, l’homme absurde valorise l’intensité du vivre plutôt que la conformité à un modèle. Cette attitude culmine dans la figure de Sisyphe : éternellement condamné à rouler son rocher, il incarne la condition absurde. Pourtant, écrit Camus, « il faut imaginer Sisyphe heureux » : non pas parce qu’il aurait trouvé un sens caché à sa tâche, mais parce qu’il assume pleinement sa condition et fait de sa lucidité même une victoire sur son destin. === L’absurde conduit-il au nihilisme ou à une forme de liberté ? === Reste la question des conséquences éthiques : l’absurde mène-t-il nécessairement au nihilisme ou peut-il ouvrir à une éthique et à une liberté positives ? ==== La tentation nihiliste ==== Si rien n’a de sens objectif, si le monde ne fournit aucun fondement ultime, il est tentant de conclure que tout se vaut et que rien ne vaut. Selon une formule traditionnellement associée à la problématique d’Ivan Karamazov, si Dieu n’existe pas, « tout est permis ». Le risque est alors de basculer dans l’indifférence morale, la violence arbitraire ou le cynisme désabusé. Certains personnages de la littérature moderne semblent incarner cette dérive. Meursault, dans ''L’Étranger'' de Camus, vit dans une forme d’indifférence aux normes sociales et morales. Son geste meurtrier n’est pas pour autant sans circonstances : le roman en donne le cadre sensible, la chaleur, l’éblouissement du soleil, la tension avec l’homme sur la plage, le revolver. Ce qui apparaît absurde n’est donc pas l’absence de toute cause, mais l’absence de justification morale claire et proportionnée, comme si les critères ordinaires permettant de distinguer le grave du trivial s’étaient dissous. ==== Absurde n’est pas nihilisme ==== Camus insiste cependant sur le fait que reconnaître l’absurde ne revient pas à nier toute valeur. Le nihilisme affirme qu’il n’y a rien à affirmer ; l’absurde, au contraire, maintient l’exigence de valeur tout en refusant de la fonder sur un absolu. L’homme absurde ne renonce pas à juger, il renonce à fonder ses jugements sur une métaphysique consolatrice. Dans ''L’Homme révolté'', Camus cherchera à penser une éthique de la révolte : à partir de l’expérience commune de la souffrance et de l’injustice, il tente de dégager des valeurs (la mesure, la solidarité, la limite) qui ne soient ni arbitraires ni transcendantes<ref>Albert Camus, ''L’Homme révolté'', Paris, Gallimard, 1951.</ref>. L’absurde n’abolit pas l’exigence de justice ; il oblige à la refonder sans recours à des garanties ultimes. ==== L’absurde comme libération ==== Pour Camus comme pour Nagel, la lucidité devant l’absurde peut aussi être une source de liberté. Libéré de l’espoir et de la peur d’un jugement ultime, l’homme absurde peut cesser de vivre pour un au-delà ou pour un idéal abstrait, et se concentrer sur la seule réalité qui lui soit donnée : cette vie-ci, cette terre, cette communauté humaine. La liberté n’est plus définie par l’obéissance à une loi absolue, mais par la capacité à assumer ses choix en connaissance de cause. Nagel, de son côté, propose une tonalité différente : l’humour et l’ironie comme manières de vivre l’absurde. Puisque nous ne pouvons ni renoncer à prendre nos vies au sérieux, ni oublier qu’elles sont contingentes et fragiles, la meilleure réponse pourrait être une double conscience : continuer à agir, aimer, créer, tout en sachant que, du point de vue le plus vaste, tout cela n’a pas de justification ultime. L’ironie permet alors de tenir ensemble l’engagement et la distance, la gravité et le sourire. ==== Une question toujours ouverte ==== Loin de se clore sur un système achevé, la philosophie de l’absurde laisse ouvertes ces questions : où situer l’absurde ? jusqu’où le supporter ? comment inventer des valeurs sans illusion ? Elle ne propose pas de solution définitive, mais une expérience de pensée et de vie : reconnaître qu’il n’y a pas de réponse totale, et apprendre malgré tout à habiter un monde sans garantie. En ce sens, l’absurde n’est pas seulement un thème historique lié au traumatisme du XX{{e}} siècle. Il demeure une manière de formuler une question qui traverse les époques : comment vivre lorsque l’on renonce à tout fondement absolu, mais que l’on refuse pourtant de désespérer de l’homme ? == Notes et références == {{references|colonnes=2}} == Bibliographie == === Œuvres citées === * Theodor W. Adorno, ''Prismes. Critique de la culture et société'', trad. G. et R. Rochlitz, Paris, Payot, 1986. * Aristote, ''Premiers Analytiques'' (''Organon'', III), trad. J. Tricot, Paris, Vrin, coll. « Bibliothèque des textes philosophiques », 1992. * Aristote, ''Métaphysique'', trad. J. Tricot, Paris, Vrin, 2 vol., 1986. * Albert Camus, ''Le Mythe de Sisyphe'', Paris, Gallimard, 1942 ; repris in ''Essais'', éd. R. Quilliot et L. Faucon, Paris, Gallimard, coll. « Bibliothèque de la Pléiade », 1965. * Albert Camus, ''L’Étranger'', Paris, Gallimard, 1942. * Albert Camus, ''L’Homme révolté'', Paris, Gallimard, 1951. * Cicéron, ''De l’orateur'', texte établi et traduit par E. Courbaud, Paris, Les Belles Lettres, coll. « Collection des universités de France », 3 vol., 1922-1930. * Martin Esslin, ''The Theatre of the Absurd'', New York, Anchor Books, 1961. * Arend Heyting, « Die formalen Regeln der intuitionistischen Logik », ''Sitzungsberichte der Preussischen Akademie der Wissenschaften, Physikalisch-mathematische Klasse'', 1930, p. 42-56. * Søren Kierkegaard, ''Miettes philosophiques'', in ''Œuvres complètes'', trad. P.-H. Tisseau et E.-M. Jacquet-Tisseau, Paris, L’Orante, t. 7, 1973. * George L. Mosse, ''De la Grande Guerre au totalitarisme. La brutalisation des sociétés européennes'', trad. C. Terrier, Paris, Hachette, 1999. * Thomas Nagel, « The Absurd », ''The Journal of Philosophy'', vol. 68, n{{o}} 20, 1971, p. 716-727. * Friedrich Nietzsche, ''Le Gai Savoir'', trad. P. Wotling, Paris, GF-Flammarion, 1997. * Platon, ''Parménide'', trad. L. Brisson, Paris, GF-Flammarion, 1994. * Arthur Schopenhauer, ''Le Monde comme volonté et comme représentation'', trad. A. Burdeau, rév. R. Roos, Paris, PUF, coll. « Quadrige », 1966. * Tertullien, ''La Chair du Christ'' (''De carne Christi''), éd. et trad. J.-P. Mahé, Paris, Le Cerf, coll. « Sources chrétiennes », 1975. === Pour aller plus loin === * Albert Camus, ''Caligula'' suivi de ''Le Malentendu'', Paris, Gallimard, 1944 (pièces du cycle de l’absurde). * Albert Camus, ''Carnets'', 3 vol., Paris, Gallimard, 1962-1989. * Samuel Beckett, ''En attendant Godot'', Paris, Éditions de Minuit, 1952. * Eugène Ionesco, ''Notes et contre-notes'', Paris, Gallimard, coll. « Idées », 1966. * Jean Grenier, ''Les Îles'', Paris, Gallimard, 1933 (arrière-plan de la formation de Camus). * Jean-Paul Sartre, ''La Nausée'', Paris, Gallimard, 1938 (expérience romanesque de la contingence et de l’étrangeté du monde). * Jean-Paul Sartre, ''L’Être et le Néant. Essai d’ontologie phénoménologique'', Paris, Gallimard, 1943. * Thomas Nagel, ''Mortal Questions'', Cambridge, Cambridge University Press, 1979 (reprend « The Absurd ») ; trad. fr. ''Questions mortelles'', Paris, PUF, 1983. * Barbara Cassin (dir.), ''Vocabulaire européen des philosophies. Dictionnaire des intraduisibles'', Paris, Seuil / Le Robert, 2004 (pour les réseaux logique, linguistique et existentiel du terme). * David Sprintzen, ''Camus: A Critical Examination'', Philadelphie, Temple University Press, 1988. * Avi Sagi, ''Albert Camus and the Philosophy of the Absurd'', trad. B. Stein, Amsterdam et New York, Rodopi, 2002. * Olivier Todd, ''Albert Camus. Une vie'', Paris, Gallimard, 1996. {{Autocat}} ilil5qh0dtxoaku4utv5n4zo3oskd0f Dictionnaire de philosophie/Acatalépsie 0 83004 767975 767469 2026-06-18T04:51:20Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 767975 wikitext text/x-wiki {{DicoPhilo|Acatalépsie|lecture=oui}} L''''acatalépsie''' (du grec ancien ἀκαταληψία, ''akatalêpsia'', de α privatif et κατάληψις, ''katálêpsis'', « saisie », « compréhension ») désigne d'abord, dans le contexte de la polémique du scepticisme antique contre les stoïciens, l'impossibilité d'obtenir une saisie cognitive infaillible, c'est-à-dire une représentation vraie qui porterait en elle un critère certain de vérité ; par extension, le terme en vient à désigner l'impossibilité de parvenir à une connaissance certaine. Cette notion s'inscrit au cœur d'un débat épistémologique majeur qui oppose, dès le III{{e}} siècle avant notre ère, les sceptiques de l'Académie (la Moyenne Académie d'Arcésilas, puis la Nouvelle Académie de Carnéade) aux stoïciens, puis se prolonge dans le néo-pyrrhonisme. == Origines et contexte philosophique == L'acatalépsie naît dans le contexte de la polémique entre la Moyenne Académie platonicienne et le stoïcisme naissant (la division entre Ancienne, Moyenne et Nouvelle Académie remonte aux doxographes anciens<ref>Sextus Empiricus, ''Esquisses pyrrhoniennes'', I, 220 ; Cicéron, pour sa part, appelle « Nouvelle Académie » l'école tout entière depuis Arcésilas</ref>). Pour comprendre cette notion, il faut d'abord saisir ce contre quoi elle se définit : la théorie stoïcienne de la connaissance, élaborée par Zénon de Citium (334-262 av. J.-C.), fondateur du Portique<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', VII, 1-38 ; sur la théorie stoïcienne de la représentation, VII, 49-51</ref>. === La katalêpsis stoïcienne === Les stoïciens développent une théorie de la connaissance fondée sur le concept de ''représentation compréhensive'' (φαντασία καταληπτική, ''phantasia katalêptikê''). Selon Zénon, une représentation est compréhensive lorsqu'elle remplit trois conditions : elle provient d'un objet existant, elle reproduit fidèlement cet objet, et elle est imprimée dans l'âme avec une telle netteté qu'elle ne pourrait provenir que de cet objet<ref>Sextus Empiricus, ''Adversus Mathematicos'', VII, 248-252</ref>. La κατάληψις (''katalêpsis''), ou saisie cognitive, traduite en latin par ''comprehensio'', désigne l'état produit lorsque l'âme donne son assentiment à une représentation compréhensive : la représentation, reçue et approuvée, devient saisie. L'assentiment n'est donc pas identique à la saisie ; il en est la condition. Zénon illustrait cette gradation par un geste devenu célèbre : la main ouverte, doigts étendus, figure la représentation ; les doigts légèrement repliés, l'assentiment ; le poing fermé, la saisie (c'est de cette image qu'il aurait tiré le mot ''katalêpsis'') ; le poing serré dans l'autre main, enfin, la science, que seul le sage possède<ref>Cicéron, ''Académiques'', II, 145</ref>. Le sage stoïcien ne donne son assentiment qu'aux représentations compréhensives, garantissant ainsi la certitude de son savoir<ref>Cicéron, ''Académiques'', II, 37-38</ref>. Cette doctrine fait de la perception sensible, correctement utilisée, le fondement de toute connaissance certaine. == Arcésilas et la fondation de l'acatalépsie académicienne == C'est Arcésilas de Pitane (vers 316-241 av. J.-C.), scholarque de la Moyenne Académie à partir des années 268-264 av. J.-C. (à la mort de Cratès, son prédécesseur), qui fait de l'acatalépsie l'enjeu central de sa polémique contre les stoïciens<ref>Sextus Empiricus, ''Esquisses pyrrhoniennes'', I, 232-234</ref>. Rompant avec le dogmatisme platonicien de l'Ancienne Académie, Arcésilas engage une polémique systématique contre la théorie stoïcienne de la connaissance. === La critique de la représentation compréhensive === L'argumentation d'Arcésilas repose sur l'impossibilité de distinguer une représentation vraie d'une représentation fausse. Son argument principal consiste à montrer qu'il n'existe aucune représentation vraie qui ne puisse être en tous points semblable à une représentation fausse. Les rêves, les hallucinations, les erreurs des sens prouvent qu'une impression peut nous apparaître avec la plus grande clarté sans pour autant correspondre à la réalité<ref>Cicéron, ''Académiques'', II, 49-52</ref>. Face à l'affirmation stoïcienne selon laquelle le sage ne donne son assentiment qu'aux représentations compréhensives, Arcésilas pose une alternative : ou bien le sage a des opinions (ce qui est contradictoire avec la sagesse), ou bien il s'abstient entièrement d'affirmer quoi que ce soit. Puisqu'il n'existe pas de critère fiable pour distinguer le vrai du faux, le sage doit suspendre son jugement sur toutes choses<ref>Cicéron, ''Académiques'', I, 45</ref>. === De l'acatalépsie à l'épochè === L'acatalépsie conduit ainsi nécessairement à l'ἐποχή (''épochè''), la suspension du jugement. Si rien ne peut être saisi avec certitude, il faut s'abstenir de toute affirmation dogmatique. Cicéron rapporte qu'Arcésilas soutenait qu'on ne pouvait rien savoir, pas même ce que Socrate s'était finalement accordé, c'est-à-dire le savoir de sa propre ignorance<ref>Cicéron, ''Académiques'', I, 45</ref>. Ce prolongement de l'ignorance socratique jusqu'à ses conséquences extrêmes fait de l'acatalépsie académicienne une position épistémologique forte : elle affirme l'impossibilité de principe de toute connaissance certaine, et non simplement un constat d'ignorance ponctuel. La portée exacte de cette position fait toutefois l'objet d'un débat parmi les interprètes depuis l'article fondateur de Pierre Couissin. Selon la lecture dite dialectique, Arcésilas n'aurait jamais soutenu l'acatalépsie en son nom propre : raisonnant à partir des prémisses de ses adversaires, il se bornerait à montrer que les stoïciens eux-mêmes, une fois admise leur définition de la science et démontrée l'inexistence de la représentation compréhensive, sont contraints de conclure que rien ne peut être saisi et que le sage doit suspendre son jugement. L'acatalépsie serait ainsi une conséquence tirée du système stoïcien et retournée contre lui, non une doctrine académicienne. D'autres témoignages s'accordent avec cette lecture : Diogène Laërce et Sextus indiquent qu'Arcésilas parvenait à la suspension du jugement par la seule opposition des discours contraires, indépendamment des prémisses stoïciennes<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', IV, 28 ; Sextus Empiricus, ''Esquisses pyrrhoniennes'', I, 232. Pour la lecture dialectique : Pierre Couissin, « Le Stoïcisme de la Nouvelle Académie », ''Revue d'histoire de la philosophie'', 3, 1929, p. 241-276 ; contre une interprétation exclusivement dialectique : Anna Maria Ioppolo, ''La testimonianza di Sesto Empirico sull'Accademia scettica'', Naples, Bibliopolis, 2009</ref>. == L'acatalépsie chez Carnéade == Carnéade de Cyrène (214/213-129/128 av. J.-C., selon la chronologie d'Apollodore), le plus célèbre des scholarques sceptiques après Arcésilas, devient le chef de la Nouvelle Académie vers 160 av. J.-C. Son enseignement ne nous est connu qu'indirectement : les écrits de son disciple Clitomaque, qui l'avaient consigné, sont perdus, et nous dépendons des témoignages de Cicéron, lecteur de Clitomaque, et de Sextus Empiricus. Cet enseignement approfondit et nuance la doctrine de l'acatalépsie<ref>Sextus Empiricus, ''Adversus Mathematicos'', VII, 159-189</ref>. === La théorie du probable === Tout en maintenant que rien ne peut être connu avec certitude, Carnéade reconnaît que la vie pratique exige des critères d'action. Il développe donc une théorie du πιθανόν (''pithanon''), du probable ou vraisemblable. Certaines représentations, bien que non compréhensives au sens stoïcien, présentent un degré de probabilité suffisant pour guider l'action<ref>Cicéron, ''Académiques'', II, 99-105</ref>. Le terme πιθανόν, que le latin de Cicéron rend par ''probabile'', signifie d'abord « persuasif », « convaincant » : Carnéade définit la représentation persuasive comme celle qui paraît vraie<ref>Sextus Empiricus, ''Adversus Mathematicos'', VII, 169 et 174</ref>. La traduction par « probable », consacrée par l'usage, ne doit donc pas suggérer un calcul de fréquences : il s'agit d'une qualité phénoménale de la représentation, du degré de créance qu'elle inspire à celui qui la reçoit, non d'une probabilité au sens mathématique du terme<ref>Pierre Couissin, « Le Stoïcisme de la Nouvelle Académie », ''Revue d'histoire de la philosophie'', 3, 1929, p. 241-276 ; Myles Burnyeat, « Can the Sceptic Live his Scepticism? », dans Myles Burnyeat et Michael Frede (dir.), ''The Original Sceptics: A Controversy'', Indianapolis, Hackett, 1997</ref>. Un témoignage rapporté par Eusèbe et généralement attribué à Numénius précise en outre la différence avec Arcésilas : Carnéade aurait refusé d'étendre la suspension du jugement à toutes choses, en distinguant l'insaisissable (ἀκατάληπτον) de l'obscur (ἄδηλον) : toutes choses sont insaisissables, mais toutes ne sont pas obscures<ref>Eusèbe, ''Préparation évangélique'', XIV, 7, 15</ref>. Carnéade distingue trois degrés de probabilité : la représentation simplement probable, celle qui est à la fois probable et non contredite par d'autres représentations, et enfin celle qui est probable, non contredite et soigneusement examinée<ref>Sextus Empiricus, ''Adversus Mathematicos'', VII, 166-189</ref>. Cette gradation permet de maintenir l'acatalépsie comme principe épistémologique tout en autorisant une conduite raisonnable dans la vie quotidienne. === Acatalépsie et action : l'objection de l'apraxia === Les stoïciens objectent aux académiciens que leur doctrine conduit à l'ἀπραξία (''apraxia''), l'impossibilité d'agir. Comment peut-on agir sans croire que telle action est préférable à telle autre ? Cicéron rapporte cette objection : supprimer l'assentiment, c'est supprimer du même coup tout mouvement de l'âme et toute action, et donc bannir l'action de la vie elle-même<ref>Cicéron, ''Académiques'', II, 39 ; l'argument revient en II, 31 et II, 61-62</ref>. La réponse d'Arcésilas, qui précède celle de Carnéade, comporte deux niveaux. Plutarque rapporte d'abord un argument qui dissocie l'action de l'assentiment : des trois mouvements de l'âme que distinguent les stoïciens (représentation, assentiment, impulsion), seul l'assentiment peut être suspendu ; la représentation et l'impulsion suffisent à mettre l'agent en mouvement, sans qu'aucun acte de jugement intervienne<ref>Plutarque, ''Contre Colotès'', 1122 A-D ; sur cette réponse en deux temps : Katja Maria Vogt, « Scepticism and Action », dans Richard Bett (dir.), ''The Cambridge Companion to Ancient Scepticism'', Cambridge University Press, 2010</ref>. Arcésilas ajoute que celui qui suspend son jugement sur toutes choses peut néanmoins régler sa conduite sur le εὔλογον (''eulogon''), le raisonnable : l'action droite est celle qui, une fois accomplie, peut recevoir une justification raisonnable<ref>Sextus Empiricus, ''Adversus Mathematicos'', VII, 158</ref>. La formule retourne contre les stoïciens leur propre définition de l'action appropriée (καθῆκον) : leur théorie admettait déjà qu'à défaut de science, une justification raisonnable suffit à qualifier la conduite ; Arcésilas suggère qu'il faudra s'en contenter en toutes circonstances<ref>Gisela Striker, ''Essays on Hellenistic Epistemology and Ethics'', Cambridge University Press, 1996, en particulier l'essai « Sceptical Strategies »</ref>. La réponse de Carnéade consiste à montrer que l'action ne requiert pas l'assentiment à une vérité certaine, mais seulement le suivi de représentations probables : le sage académicien agit en fonction du πιθανόν, sans jamais tenir le probable pour vrai<ref>Sextus Empiricus, ''Adversus Mathematicos'', VII, 166-175</ref>. Cette solution permet de maintenir l'acatalépsie universelle tout en évitant le reproche de rendre la vie impossible. Le sens exact de cette doctrine divisait déjà les disciples de Carnéade, qui n'écrivit rien. Métrodore de Stratonice, puis Philon de Larissa, comprenaient le maître au pied de la lettre : faute de représentation compréhensive, le sage pourra opiner, c'est-à-dire donner un assentiment révocable à ce qui n'est pas saisi<ref>Cicéron, ''Académiques'', II, 59 et 78</ref>. Clitomaque soutenait au contraire que Carnéade avait avancé cette thèse pour les besoins de la discussion plus qu'il ne l'avait approuvée (''magis ab eo disputatum quam probatum'', rapporte Cicéron, qui se range à cette lecture)<ref>Cicéron, ''Académiques'', II, 78 ; voir aussi II, 108 et II, 148</ref>. Aux yeux de Clitomaque, Carnéade avait accompli un travail comparable à celui d'Hercule en chassant de nos âmes l'assentiment, cette bête sauvage<ref>Cicéron, ''Académiques'', II, 108</ref>. Le débat entre ces deux lectures, celle d'un probabilisme sincère et celle d'une argumentation purement dialectique, se poursuit chez les interprètes modernes<ref>Gisela Striker, « Sceptical Strategies », dans ''Essays on Hellenistic Epistemology and Ethics'', Cambridge University Press, 1996 ; Harald Thorsrud, « Arcesilaus and Carneades », dans Richard Bett (dir.), ''The Cambridge Companion to Ancient Scepticism'', Cambridge University Press, 2010</ref>. == Le pyrrhonisme et l'acatalépsie == Le rapport entre le pyrrhonisme originel de Pyrrhon d'Élis (vers 365-275 av. J.-C.) et l'acatalépsie académicienne est complexe et demeure un sujet de débat parmi les historiens de la philosophie. Pyrrhon lui-même ne semble pas avoir employé le terme d'acatalépsie, mais son attitude philosophique partage avec celle-ci certains traits essentiels<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', IX, 61-108</ref>. === Pyrrhon et l'indétermination des choses === Selon le témoignage d'Aristoclès rapporté par Eusèbe, Timon de Phlionte, disciple de Pyrrhon, rapportait que celui-ci déclarait les choses « également indifférentes, indéterminées et indécises » (ἀδιάφορα καὶ ἀστάθμητα καὶ ἀνεπίκριτα). Par conséquent, « nos sensations et nos opinions ne sont ni vraies ni fausses »<ref>Eusèbe, ''Préparation évangélique'', XIV, 18, 1-4</ref>. Le témoignage s'organise en trois questions que doit examiner quiconque veut être heureux : quelle est la nature des choses ; quelle disposition adopter à leur égard ; ce qui en résultera pour qui adopte cette disposition. La réponse à la deuxième question prescrit de demeurer sans opinions, sans inclination et sans vacillement, en disant de chaque chose qu'elle n'est pas plus qu'elle n'est pas, ou qu'elle est et n'est pas, ou qu'elle n'est ni n'est pas (la formule du οὐ μᾶλλον, « pas plus »). La réponse à la troisième annonce d'abord l'aphasie, le refus de toute assertion, puis l'ataraxie. L'interprétation de ce passage demeure controversée : certains spécialistes y voient une thèse ontologique sur l'indétermination des choses elles-mêmes, d'autres une position épistémologique sur notre incapacité à les saisir. Si l'on adopte la première lecture, Pyrrhon ne se contenterait pas d'affirmer que nous ne pouvons pas saisir les choses, mais que les choses sont par nature indéterminées. Ce débat d'interprétation n'est pas une digression : de la lecture retenue dépend la place de Pyrrhon dans l'histoire de l'acatalépsie. Richard Bett fait valoir en faveur de la lecture ontologique la logique même du texte : l'inférence qu'il contient (les choses sont indéterminées, donc nos sensations et nos opinions ne sont ni vraies ni fausses) reste inintelligible si l'on comprend seulement que nous ne pouvons pas connaître les choses, car de notre ignorance il ne suivrait pas que nos jugements soient privés de toute valeur de vérité ; c'est l'indétermination des choses elles-mêmes qui empêche qu'aucun énoncé à leur sujet soit vrai ou faux<ref>Richard Bett, ''Pyrrho, his Antecedents, and his Legacy'', Oxford University Press, 2000, chap. 1</ref>. Marcel Conche aboutit, par une autre voie, à une conclusion voisine : le pyrrhonisme originel abolit la différence entre l'être et l'apparaître ; il ne reste qu'une apparence universelle, qui n'est l'apparence de rien (d'aucun être caché derrière elle) ni pour personne (pour aucun sujet qui lui resterait extérieur)<ref>Marcel Conche, ''Pyrrhon ou l'apparence'', Paris, PUF, 1994</ref>. Sur ces deux lectures, Pyrrhon n'enseigne pas l'insaisissabilité des choses, faute d'une nature des choses qui resterait à saisir : il se situe en amont du problème que l'acatalépsie académicienne formulera dans le vocabulaire stoïcien de la représentation. Cette différence, si elle est avérée, distinguerait le pyrrhonisme originel de l'acatalépsie académicienne. L'académicien suspend son jugement par prudence épistémologique, faute de critère fiable de vérité. Le pyrrhonien, si l'on suit cette interprétation, reconnaîtrait que les choses sont par nature telles qu'il n'y a tout simplement rien à saisir. Cette position ferait de Pyrrhon non pas un sceptique au sens strict, mais plutôt un philosophe de l'indifférenciation ontologique<ref>Cette lecture ontologique est défendue notamment par Marcel Conche, ''Pyrrhon ou l'apparence'', Paris, PUF, 1994 (1{{re}} éd. 1973), et par Richard Bett, ''Pyrrho, his Antecedents, and his Legacy'', Oxford University Press, 2000 ; Victor Brochard lisait au contraire Pyrrhon avant tout comme un moraliste (''Les Sceptiques grecs'', 1887)</ref>. === Énésidème et la renaissance pyrrhonienne === C'est Énésidème de Cnossos (première moitié du I{{er}} siècle av. J.-C.) qui, plusieurs siècles après Pyrrhon, fonde le néo-pyrrhonisme proprement dit, en réaction contre ce qu'il perçoit comme une dérive dogmatique de l'Académie sous Philon de Larissa (vers 159-84 ou 83 av. J.-C.). Dans son ouvrage ''Discours pyrrhoniens'', dédié à Lucius Tubéron, un Romain qui avait été son condisciple à l'Académie, Énésidème reproche aux académiciens d'affirmer dogmatiquement l'acatalépsie universelle<ref>Photius, ''Bibliothèque'', codex 212</ref>. Le résumé qu'en donne Photius conserve les formules les plus tranchantes : le pyrrhonien ne détermine rien, pas même ceci, que rien n'est déterminé ; les académiciens, surtout ceux d'aujourd'hui, adoptent tant de doctrines stoïciennes (le bien et le mal, le vrai et le faux, le persuasif et le non persuasif) qu'ils ressemblent à des stoïciens en guerre contre des stoïciens, dont ils ne se distinguent plus que sur la question de la représentation compréhensive<ref>Photius, ''Bibliothèque'', codex 212, 169 b - 170 a</ref>. La cible visée est l'Académie du temps de Philon de Larissa, ce qui situe la rédaction de l'ouvrage dans les premières décennies du I{{er}} siècle av. J.-C. Pour Énésidème, affirmer que « rien n'est compréhensible » revient à adopter un « dogmatisme négatif » qui contredit l'attitude sceptique véritable. Le pyrrhonien authentique ne doit pas affirmer l'incompréhensibilité des choses, mais suspendre son jugement sur cette question elle-même. La différence est subtile mais essentielle : selon cette présentation polémique, l'académicien risque de transformer l'incompréhensibilité en thèse négative (« je sais que je ne peux rien savoir »), tandis que le pyrrhonien se borne à dire : « je ne sais pas si je peux ou non savoir quelque chose »<ref>Sextus Empiricus, ''Esquisses pyrrhoniennes'', I, 1-3</ref>. Cette caractérisation, que reprend Aulu-Gelle, ne vaut toutefois pas sans réserve pour Arcésilas et Carnéade, et la recherche moderne l'a contestée : Cicéron atteste qu'ils refusaient précisément de savoir qu'ils ne savaient rien, étendant ainsi le doute à la thèse sceptique elle-même<ref>Aulu-Gelle, ''Nuits attiques'', XI, 5, 8 ; Cicéron, ''Académiques'', I, 45 et II, 28. Sur ce point : Gisela Striker, « On the Difference between the Pyrrhonists and the Academics », dans ''Essays on Hellenistic Epistemology and Ethics'', Cambridge University Press, 1996</ref>. La frontière que tracent Énésidème et Sextus entre les deux scepticismes relèverait donc en partie de la polémique d'école, soucieuse de réserver au pyrrhonisme le privilège de la cohérence. === Sextus Empiricus : la critique définitive de l'acatalépsie dogmatique === Sextus Empiricus (seconde moitié du II{{e}} siècle apr. J.-C., peut-être encore actif au début du III{{e}} siècle), notre principale source sur le pyrrhonisme tardif, systématise cette critique de l'acatalépsie académicienne. Il distingue soigneusement trois attitudes philosophiques : le dogmatisme positif (qui affirme avoir trouvé la vérité), le dogmatisme négatif ou acataleptique (qui affirme que la vérité ne peut être trouvée), et le scepticisme pyrrhonien (qui continue de chercher sans rien affirmer)<ref>Sextus Empiricus, ''Esquisses pyrrhoniennes'', I, 1-4</ref>. Les académiciens, en affirmant l'acatalépsie universelle, appartiennent selon Sextus à la deuxième catégorie. Ils sont dogmatiques parce qu'ils soutiennent une thèse définie sur la nature de la connaissance. Le pyrrhonien, au contraire, se contente de constater qu'il n'a pas encore trouvé de critère fiable de vérité, sans affirmer qu'un tel critère n'existe pas. Cette position lui permet d'éviter toute affirmation dogmatique, positive ou négative<ref>Sextus Empiricus, ''Esquisses pyrrhoniennes'', I, 200-205</ref>. Sextus critique également la doctrine carnéadienne du probable. En acceptant de suivre certaines représentations plutôt que d'autres, l'académicien manifeste une préférence qui implique un jugement de valeur. Or ce jugement présuppose précisément ce qui devrait être mis en doute : la possibilité de distinguer le plus probable du moins probable<ref>Sextus Empiricus, ''Adversus Mathematicos'', VII, 166-189</ref>. Le pyrrhonien, lui, se laisse conduire passivement par les apparences, sans affirmer qu'elles sont plus ou moins probables. == Portée philosophique et épistémologique == === L'acatalépsie comme critique du dogmatisme === L'acatalépsie académicienne et la suspension pyrrhonienne représentent, chacune à sa manière, une critique de toute prétention à la connaissance certaine. Elles mettent en lumière les limites de nos facultés cognitives et la fragilité des critères sur lesquels nous fondons nos croyances. En montrant l'impossibilité de distinguer avec certitude une représentation vraie d'une représentation fausse, elles ébranlent les fondements mêmes de l'épistémologie dogmatique. Cette critique conserve toute sa pertinence philosophique. Les arguments sceptiques contre les critères de vérité anticipent de nombreuses discussions modernes sur les fondements de la connaissance, de Descartes à la philosophie analytique contemporaine. Leur forme la plus achevée se trouve dans les cinq modes attribués à Agrippa : le désaccord, la régression à l'infini, la relativité, l'hypothèse et le diallèle (le cercle vicieux)<ref>Sextus Empiricus, ''Esquisses pyrrhoniennes'', I, 164-177 ; Diogène Laërce, IX, 88-89</ref>. Toute justification, montrent ces modes, s'expose à un trilemme : ou bien elle s'appuie sur une raison qui appelle elle-même une raison, à l'infini ; ou bien elle revient en cercle sur ce qu'elle devait établir ; ou bien elle s'arrête à une hypothèse posée sans preuve, à laquelle on pourra toujours opposer l'hypothèse contraire. Jonathan Barnes a décrit ce dispositif comme un filet dans lequel le sceptique entend prendre le dogmatique, quel que soit le chemin que celui-ci choisit<ref>Jonathan Barnes, ''The Toils of Scepticism'', Cambridge University Press, 1990</ref>. La question posée par l'acatalépsie (comment justifier nos prétentions à la connaissance sans tomber dans ce piège ?) demeure au cœur de l'épistémologie, où le trilemme d'Agrippa continue d'être discuté sous ce nom. === L'acatalépsie et la vie éthique === Au-delà de ses implications épistémologiques, l'acatalépsie possède une dimension éthique et existentielle. En nous libérant de l'attachement aux opinions et aux certitudes, elle ouvre la voie à l'ἀταραξία (''ataraxia''), la tranquillité de l'âme qui constitue le but ultime de la philosophie sceptique<ref>Sextus Empiricus, ''Esquisses pyrrhoniennes'', I, 25-30</ref>. Sextus précise comment cette vie sans opinions reste possible : le sceptique suit les apparences selon une observance quadruple, qui comprend la conduite de la nature, la contrainte des affections (la faim conduit à manger, la soif à boire), la tradition des lois et des coutumes, enfin l'apprentissage des techniques<ref>Sextus Empiricus, ''Esquisses pyrrhoniennes'', I, 23-24</ref>. Dans les choses qui s'imposent à lui malgré tout, comme la douleur ou le froid, il n'atteint pas l'absence de trouble, mais une modération des affections (μετριοπάθεια), allégées de la croyance supplémentaire qu'elles seraient des maux par nature<ref>Sextus Empiricus, ''Esquisses pyrrhoniennes'', I, 30</ref>. Celui qui a reconnu, avec l'académicien, qu'aucune saisie certaine n'est accessible, ou qui suspend son jugement à la manière pyrrhonienne, cesse de se troubler pour des questions qu'il ne peut trancher. Il ne s'agite plus pour défendre des opinions qu'il sait incertaines. Cette attitude philosophique conduit à une forme de détachement serein à l'égard des conflits doctrinaux et des controverses dogmatiques. L'acatalépsie devient ainsi un exercice spirituel, une pratique de libération par rapport aux passions intellectuelles. === L'objection de l'incohérence === Une objection majeure adressée à la doctrine de l'acatalépsie concerne sa cohérence interne. Si rien ne peut être connu avec certitude, comment le sceptique peut-il affirmer cette thèse elle-même ? L'affirmation « rien n'est compréhensible » ne prétend-elle pas à une forme de connaissance certaine qui se contredit elle-même ? Cette objection traverse toute l'histoire du scepticisme antique et trouvera un écho dans la critique d'Augustin<ref>Augustin, ''Contre les Académiciens''</ref>. Les académiciens ont tenté de répondre à cette objection en distinguant différents niveaux de certitude. Clitomaque, disciple de Carnéade, explique que l'acatalépsie ne prétend pas être une vérité absolue, mais seulement la conclusion la plus raisonnable que l'on puisse tirer de l'examen des arguments<ref>Cicéron, ''Académiques'', II, 109-110</ref>. Les pyrrhoniens, pour leur part, évitent cette difficulté en refusant d'affirmer dogmatiquement l'acatalépsie : ils se contentent de dire qu'ils n'ont pas encore trouvé de connaissance certaine, laissant ouverte la possibilité qu'elle existe. Sextus ajoute que les formules sceptiques (« pas plus », « je ne détermine rien ») s'incluent elles-mêmes dans leur propre portée et s'annulent avec le reste, comme les purgatifs qui s'évacuent du corps avec les humeurs qu'ils chassent<ref>Sextus Empiricus, ''Esquisses pyrrhoniennes'', I, 14-15 et I, 206</ref>. == Postérité et influence == === Dans l'Antiquité tardive === L'acatalépsie académicienne exerce une influence étendue et durable sur la philosophie hellénistique et romaine. Cicéron, qui se réclame de la Nouvelle Académie, en fait le fondement de sa méthode philosophique. En refusant toute certitude dogmatique, il peut examiner librement les arguments des différentes écoles sans s'engager définitivement dans aucune<ref>Cicéron, ''De Natura Deorum'', I, 11-12</ref>. Les Pères de l'Église s'emparent de l'acatalépsie pour critiquer la philosophie païenne, mais aussi comme étape vers la foi. Augustin, dans son ''Contre les Académiciens'', retrace son propre cheminement depuis le scepticisme académicien jusqu'à la certitude de la foi chrétienne. L'acatalépsie philosophique devient le prélude à la réception de la vérité révélée<ref>Augustin, ''Contre les Académiciens'', I-III</ref>. === Renaissance et période moderne === La redécouverte des textes sceptiques à la Renaissance, notamment les ''Esquisses pyrrhoniennes'' de Sextus Empiricus, entraîne un regain d'intérêt pour l'acatalépsie. Montaigne, dans son ''Apologie de Raymond Sebond'', reprend plusieurs motifs sceptiques proches de l'acatalépsie, sans que son scepticisme, où se mêlent sources pyrrhoniennes, académiciennes et fidéistes, s'y réduise. Sa devise « Que sais-je ? » fait écho à la suspension du jugement sceptique<ref>Montaigne, ''Essais'', II, 12</ref>. Cette « crise pyrrhonienne » de la Renaissance joue un rôle déterminant dans la formation de la philosophie moderne. Descartes élabore sa méthode du doute et son projet de fondation métaphysique dans un contexte marqué par la redécouverte des arguments sceptiques antiques, dont l'acatalépsie est l'une des composantes. Le cogito cartésien se présente comme la vérité première qui échappe au doute sceptique et fonde la possibilité de toute connaissance certaine<ref>Richard H. Popkin, ''Histoire du scepticisme d'Érasme à Spinoza'', trad. Christine Hivet, Paris, PUF, 1995</ref>. === Résonances contemporaines === Dans la philosophie contemporaine, l'acatalépsie trouve des échos dans différents courants. L'épistémologie fallibiliste, qui soutient que toute connaissance humaine est révisable et faillible, reprend certains thèmes de l'acatalépsie académicienne sans en adopter les conclusions les plus extrêmes. Les débats sur le relativisme épistémique, sur les limites du constructivisme social, ou sur la nature de la justification épistémique font tous résonner, de manière plus ou moins directe, les questions soulevées par la doctrine antique de l'incompréhensibilité. Plus généralement, l'acatalépsie interroge notre rapport à la vérité et à la certitude. Elle invite à une forme de modestie intellectuelle : reconnaître les limites de nos prétentions au savoir, mesurer la fragilité des critères dont nous disposons, sans renoncer pour autant à l'effort de la pensée critique ni à l'examen des raisons. == Notes et références == {{references|colonnes=2}} == Bibliographie == === Sources anciennes === * Cicéron, ''Académiques'', trad. José Kany-Turpin, Paris, GF-Flammarion, 2010 * Diogène Laërce, ''Vies et doctrines des philosophes illustres'', trad. sous la direction de Marie-Odile Goulet-Cazé, Paris, La Pochothèque, 1999 * Sextus Empiricus, ''Esquisses pyrrhoniennes'', trad. Pierre Pellegrin, Paris, Seuil, 1997 * Sextus Empiricus, ''Contre les professeurs'', trad. sous la direction de Pierre Pellegrin, Paris, Seuil, 2002 (ce volume couvre les livres I à VI de l'ouvrage cité comme ''Adversus Mathematicos'') * Sextus Empiricus, ''Against the Logicians'' (''Adversus Mathematicos'', VII-VIII, c'est-à-dire les deux livres du ''Contre les logiciens'', abondamment cités dans le présent article), trad. Richard Bett, Cambridge University Press, 2005 === Études modernes === * Annas Julia & Barnes Jonathan, ''The Modes of Scepticism'', Cambridge University Press, 1985 * Bailey Alan, ''Sextus Empiricus and Pyrrhonean Scepticism'', Oxford University Press, 2002 * Barnes Jonathan, ''The Toils of Scepticism'', Cambridge University Press, 1990 * Bett Richard, ''Pyrrho, his Antecedents, and his Legacy'', Oxford University Press, 2000 * Bett Richard (dir.), ''The Cambridge Companion to Ancient Scepticism'', Cambridge University Press, 2010 * Brochard Victor, ''Les Sceptiques grecs'', Paris, Imprimerie nationale, 1887 ; 2{{e}} éd. Paris, Vrin, 1923 ; rééd. Paris, Le Livre de Poche, 2002 (présentation de Jean-François Balaudé) * Brunschwig Jacques, ''Papers in Hellenistic Philosophy'', Cambridge University Press, 1994 * Burnyeat Myles & Frede Michael (dir.), ''The Original Sceptics: A Controversy'', Indianapolis, Hackett, 1997 * Conche Marcel, ''Pyrrhon ou l'apparence'', Paris, PUF, 1994 (1{{re}} éd. Villers-sur-Mer, Éditions de Mégare, 1973) * Couissin Pierre, « Le Stoïcisme de la Nouvelle Académie », ''Revue d'histoire de la philosophie'', 3, 1929, p. 241-276 * Decleva Caizzi Fernanda, ''Pirrone. Testimonianze'', Naples, Bibliopolis, 1981 * Hankinson Robert James, ''The Sceptics'', Londres et New York, Routledge, 1995 * Ioppolo Anna Maria, ''La testimonianza di Sesto Empirico sull'Accademia scettica'', Naples, Bibliopolis, 2009 * Lévy Carlos, ''Les Scepticismes'', Paris, PUF, coll. « Que sais-je ? », 2008 * Long Anthony & Sedley David, ''Les Philosophes hellénistiques'', trad. Jacques Brunschwig et Pierre Pellegrin, 3 vol., Paris, GF-Flammarion, 2001 * Popkin Richard H., ''Histoire du scepticisme d'Érasme à Spinoza'', trad. Christine Hivet, Paris, PUF, coll. « Léviathan », 1995 * Striker Gisela, ''Essays on Hellenistic Epistemology and Ethics'', Cambridge University Press, 1996 {{Autocat}} gur0cga21kmjmdwq3v325rjcmr7wwlj Dictionnaire de philosophie/Absolu 0 83011 767971 766536 2026-06-18T04:50:40Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 767971 wikitext text/x-wiki {{DicoPhilo|Absolu|lecture=oui}} L’absolu désigne ce qui existe par soi-même, sans dépendance à l’égard d’autre chose. Cette notion occupe une place centrale dans l’histoire de la philosophie occidentale, du platonisme à l’idéalisme allemand, et traverse les grandes interrogations métaphysiques sur l’être, la connaissance et la perfection. On peut d’emblée distinguer, sans les séparer artificiellement, trois grands sens récurrents du terme : l’absolu comme indépendance (ce qui ne dépend de rien d’autre pour être), comme perfection (ce à quoi rien ne manque) et comme totalité (ce qui englobe ou comprend tout le reste). À l’inverse, on appellera « relatif » ce qui n’existe que sous certaines conditions, en relation avec autre chose ; par exemple une température « supportable » ou un jugement « valable dans tel contexte » sont relatifs, parce qu’ils supposent un point de vue, des paramètres, des limites. == Étymologie et définitions == Le terme « absolu » provient du latin ''absolutus'', participe passé du verbe ''absolvere'', qui signifie « délier », « détacher », mais aussi « parfaire », « achever »<ref>Ramond, Charles, ''Le vocabulaire de Spinoza'', Paris, Ellipses, 1999, p. 10.</ref>. L’absolu désigne donc, originairement, ce qui est « délié », dégagé de tout lien : ce qui est détaché de toute relation, de toute condition, de toute dépendance. Cette racine étymologique confère au concept une double signification : d’une part, l’absolu est ce qui n’a besoin de rien d’autre pour être (autonomie ontologique) ; d’autre part, il est ce qui est achevé, complet, parfait (plénitude d’être). Dans son usage philosophique, l’absolu s’oppose au relatif<ref>Larousse, « Absolu », dans ''Encyclopédie philosophique'', Paris, Larousse, 1996.</ref>. Est relatif ce qui n’existe qu’en relation avec autre chose, ce qui dépend de conditions extérieures, ce qui est limité ou imparfait : par exemple la beauté d’une œuvre « pour tel public », la [[Manuel de terminale de philosophie/Justice|justice]] d’une décision « dans tel contexte », ou la solidité d’un bâtiment « à telle pression et à telle température ». L’absolu, au contraire, est inconditionnel, autosuffisant et sans restriction. Il ne se définit pas par référence à autre chose, mais par soi et à partir de soi. Chez Spinoza, la notion d’absolu se laisse éclairer à partir de sa distinction entre ce qui est infini « en son genre » et ce qui est « absolument infini » : est infini ''en son genre'' ce qui n’est limité par rien d’autre dans un certain ordre déterminé ; est ''absolument infini'' ce qui « comprend en soi tout ce qui exprime une essence » sans restriction<ref>Spinoza, Baruch, ''Éthique'', I, déf. 6, trad. Charles Appuhn, Paris, Garnier-Flammarion, 1965, p. 22.</ref>. L’absolu n’est donc pas seulement ce qui est complet relativement à un certain domaine, mais ce qui, d’une manière ou d’une autre, prétend à une totalité sans reste. On retrouve ici les trois accents signalés plus haut. L’absolu peut être conçu principalement comme : * indépendance radicale : il ne dépend de rien (Dieu comme ''causa sui'', le Moi absolu chez Fichte) ; * perfection sans manque : il réunit toutes les perfections possibles (le Dieu cartésien, l’Acte pur aristotélicien) ; * totalité englobante : il est la totalité du réel pensé comme un tout (la substance unique de Spinoza, l’Esprit absolu de Hegel). Cette opposition entre absolu et relatif permet de préciser quelques conséquences classiques, même si elles sont discutées. Premièrement, l’absolu ne se conçoit pas comme une grandeur susceptible de degrés : on peut être plus ou moins mouillé, mais non plus ou moins absolu. Deuxièmement, du point de vue de certaines traditions (notamment apophatiques), l’absolu ne peut être défini de manière positive sans risque de contradiction, puisque toute définition fixe des déterminations qui, en limitant le concept, semblent contredire ce qui, par essence, doit être sans limite<ref>Larousse, « Absolu », dans ''Encyclopédie philosophique'', Paris, Larousse, 1996.</ref>. D’où le recours à des voies négatives (dire ce que l’absolu n’est pas) ou analogiques. D’autres traditions, au contraire (par exemple l’idéalisme hégélien), soutiennent que l’absolu peut et doit être pensé positivement, mais au prix d’une logique spécifique (dialectique) dépassant la logique ordinaire de la détermination finie. == L’absolu dans l’Antiquité grecque == === Platon et l’Idée du [[Dictionnaire de philosophie/Bien|Bien]] === Dans la pensée platonicienne, l’absolu prend la forme de l’Idée du Bien, sommet de la hiérarchie des Formes intelligibles. Dans la ''République'', Platon présente le Bien comme ce qui dépasse même l’être en dignité et en puissance (''epekeina tês ousias'')<ref>Platon, ''République'', VI, 509b, trad. Georges Leroux, Paris, GF‑Flammarion, 2002, p. 339.</ref>. Le Bien n’est pas simplement la plus haute des Idées ; il est le principe qui confère aux autres Idées leur intelligibilité et leur être même. Par l’analogie du Soleil (''République'', livre VI), Platon montre que le Bien joue, dans le monde intelligible, le même rôle que le Soleil dans le monde sensible<ref>Platon, ''République'', VI, 508a‑509c, trad. Georges Leroux, Paris, GF‑Flammarion, 2002, p. 338‑340.</ref>. De même que le Soleil rend visibles les objets et rend possible la vision, le Bien rend intelligibles les réalités et rend possible la connaissance. Plus encore, le Bien est la cause de l’existence et de l’essence de toutes choses. À ce titre, il assume trois fonctions essentielles : ontologique (cause de l’être), épistémologique (condition de la connaissance) et axiologique (norme du jugement de valeur)<ref>Ferrari, Franco, « L’Idée du Bien chez Platon », dans ''Laval théologique et philosophique'', vol. 62, nᵒ 2, 2006, p. 229‑241.</ref>. Cette position du Bien comme principe absolu soulève pourtant une difficulté majeure : comment penser ce qui, par définition, excède l’être et l’intelligible ordinaires ? Platon lui‑même reconnaît qu’on ne peut saisir le Bien que de manière indirecte, par images, analogies et métaphores. Le Bien apparaît ainsi comme un sommet à la fois nécessaire pour rendre [[Manuel de terminale de philosophie/Raison|raison]] de tout, et en même [[Manuel de terminale de philosophie/Temps|temps]] largement rétif à la détermination conceptuelle. Cette tension entre nécessité et inaccessibilité préfigure les débats ultérieurs sur la possibilité de penser l’absolu sans le réduire. === [[Dictionnaire de philosophie/Aristote|Aristote]] et le Premier Moteur === Aristote propose une autre configuration de l’absolu à travers la doctrine du Premier Moteur immobile. Dans la ''[[Dictionnaire de philosophie/Métaphysique|Métaphysique]]'' (livre Λ), il établit l’existence d’un principe premier qui meut toutes choses sans être lui‑même mû<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a‑1073a, trad. Jules Tricot, Paris, Vrin, 1991, p. 655‑662.</ref>. Ce Premier Moteur est ''pure actualité'' (''energeia'') : il ne comporte en lui aucune puissance, et par conséquent aucun devenir ni changement. L’absoluité du Premier Moteur réside dans son autosuffisance ontologique totale. Il n’a besoin de rien d’autre pour exister ou pour agir. Sa vie consiste en une contemplation éternelle de soi, ''pensée de la pensée'' (''noêsis noêseôs''), qui constitue la félicité parfaite<ref>Aristote, ''Métaphysique'', Λ, 7, 1072b, trad. Jules Tricot, Paris, Vrin, 1991, p. 656.</ref>. À la différence de l’Idée du Bien, qui demeure séparée et ne joue pas de rôle causal direct dans le mouvement des choses, le Premier Moteur exerce une causalité réelle sur le monde : il meut en tant qu’objet de désir et d’amour, attirant toutes choses vers lui comme fin suprême. L’absolu aristotélicien est ainsi à la fois principe d’intelligibilité et principe de mouvement, même si la comparaison avec Platon doit rester prudente : le Bien platonicien fonde déjà, d’une certaine manière, l’être et l’intelligibilité des autres Idées. == L’absolu dans la philosophie médiévale == === Thomas d’Aquin et l’Être absolu === Thomas d’Aquin opère une transformation décisive en identifiant l’absolu à Dieu compris comme l’Être subsistant par soi (''Ipsum Esse Subsistens'')<ref>Thomas d’Aquin, ''Somme théologique'', Ia, q. 3, a. 4, trad. A.‑M. Roguet, Paris, Cerf, 1984, vol. 1, p. 178‑181.</ref>. Cette identification s’enracine dans l’interprétation philosophique du passage de l’''Exode'' où Dieu se révèle à Moïse sous le nom de « Celui qui est » (''Ego sum qui sum'', Exode 3, 14). Pour Thomas, Dieu est l’être absolu en ce sens qu’en lui l’essence et l’existence coïncident<ref>Thomas d’Aquin, ''De ente et essentia'', chap. 4, trad. Alain de Libera et Cyrille Michon, Paris, Vrin, 1996, p. 56‑58.</ref>. Dans les créatures, l’essence (ce qu’une chose est) se distingue de l’existence (le fait qu’elle soit) : il est possible de définir ce qu’est un homme sans que cette définition implique nécessairement qu’un homme existe effectivement. En Dieu, au contraire, l’essence n’est rien d’autre que l’acte d’exister lui‑même. Dieu est ainsi l’Être qui existe de manière absolue et nécessaire, tandis que les créatures ne possèdent qu’un être dérivé, reçu par participation à cet Être premier<ref>Thomas d’Aquin, ''Somme théologique'', Ia, q. 4, a. 2, trad. A.‑M. Roguet, Paris, Cerf, 1984, vol. 1, p. 193‑195.</ref>. Cette doctrine entraîne plusieurs conséquences métaphysiques importantes. Premièrement, Dieu est absolument simple, sans composition d’aucune sorte, car toute composition impliquerait une dépendance entre parties et une certaine potentialité<ref>Thomas d’Aquin, ''Somme théologique'', Ia, q. 3, a. 7, trad. A.‑M. Roguet, Paris, Cerf, 1984, vol. 1, p. 186‑188.</ref>. Deuxièmement, Dieu possède toutes les perfections de manière éminente : tout ce qui est perfection dans les créatures (vie, intelligence, bonté) se trouve en Dieu à un degré supérieur et sans limitation. Troisièmement, Dieu est cause première de l’être de toutes choses, non seulement de leur mouvement comme chez Aristote, mais de leur existence même. Thomas développe également une théorie de la connaissance de Dieu par analogie. L’absolu divin ne peut être connu directement dans cette vie, mais seulement indirectement, à partir de ses effets dans la création<ref>Thomas d’Aquin, ''Somme théologique'', Ia, q. 13, a. 5, trad. A.‑M. Roguet, Paris, Cerf, 1984, vol. 1, p. 267‑270.</ref>. Les attributs que nous prédiquons de Dieu (bonté, sagesse, puissance) ne s’appliquent ni au même sens qu’aux créatures (univocité), ni en un sens entièrement différent (équivocité), mais ''analogiquement'' : ce sont des perfections réellement présentes en Dieu, mais selon un mode qui excède celui que nous connaissons dans les êtres finis. == L’absolu dans la philosophie moderne == === Descartes et la perfection divine === Descartes réintroduit la question de l’absolu dans le cadre de sa recherche de fondements certains pour la connaissance. Dans les ''Méditations métaphysiques'', Dieu apparaît comme l’être absolument parfait, dont l’existence est démontrée à partir de l’idée d’infini que nous trouvons en nous<ref>Descartes, René, ''Méditations métaphysiques'', Méditation III, AT VII 40‑45, trad. Michelle et Jean‑Marie Beyssade, Paris, GF‑Flammarion, 1992, p. 95‑105.</ref>. L’argument cartésien repose sur le principe de causalité appliqué aux idées : il doit y avoir au moins autant de réalité dans la cause que dans l’effet. L’idée d’un être infini et parfait que je découvre en moi ne peut avoir été causée par moi‑même, être fini et imparfait. Elle doit donc avoir été « mise en moi » par un être qui possède effectivement la perfection infinie, c’est‑à‑dire par Dieu lui‑même. Cette perfection absolue inclut nécessairement l’existence, ce qui fonde la version cartésienne de l’argument ontologique : Dieu, être souverainement parfait, ne peut manquer d’exister<ref>Descartes, René, ''Méditations métaphysiques'', Méditation V, AT VII 65‑66, trad. Michelle et Jean‑Marie Beyssade, Paris, GF‑Flammarion, 1992, p. 135‑137.</ref>. La perfection divine joue un rôle décisif dans l’édifice cartésien. C’est elle qui garantit la fiabilité de nos idées claires et distinctes et nous permet de sortir du doute hyperbolique. Un Dieu parfaitement bon ne peut être trompeur, car la tromperie implique une forme d’imperfection<ref>Descartes, René, ''Méditations métaphysiques'', Méditation IV, AT VII 53, trad. Michelle et Jean‑Marie Beyssade, Paris, GF‑Flammarion, 1992, p. 116.</ref>. L’absolu divin fonde ainsi la possibilité même d’une connaissance certaine du monde. === Spinoza et la substance unique === Spinoza propose une conception moniste de l’absolu en l’identifiant à l’unique substance, qu’il nomme indifféremment Dieu ou [[Manuel de terminale de philosophie/Nature|Nature]] (''Deus sive Natura'')<ref>Spinoza, Baruch, ''Éthique'', IV, Préface, trad. Bernard Pautrat, Paris, Seuil, 1988, p. 331.</ref>. Dans l’''Éthique'', il définit Dieu comme « une substance constituée par une infinité d’attributs, dont chacun exprime une essence éternelle et infinie »<ref>Spinoza, Baruch, ''Éthique'', I, déf. 6, trad. Bernard Pautrat, Paris, Seuil, 1988, p. 19.</ref>. Cette substance absolue a plusieurs traits caractéristiques. Elle est ''cause de soi'' (''causa sui''), c’est‑à‑dire que son essence enveloppe nécessairement son existence<ref>Spinoza, Baruch, ''Éthique'', I, déf. 1, trad. Bernard Pautrat, Paris, Seuil, 1988, p. 17.</ref>. Elle est absolument infinie, non pas seulement « en son genre », mais de manière illimitée. Elle est enfin cause ''immanente'' de toutes choses : les modes (les choses particulières finies) ne sont pas des réalités créées ''à côté'' de Dieu, mais des affections, des manières d’être de l’unique substance<ref>Spinoza, Baruch, ''Éthique'', I, prop. 18, trad. Bernard Pautrat, Paris, Seuil, 1988, p. 47.</ref>. L’absoluité de la substance spinoziste implique un déterminisme universel : tout ce qui existe découle nécessairement de la [[Manuel de terminale de philosophie/Nature|nature]] divine selon des lois éternelles<ref>Spinoza, Baruch, ''Éthique'', I, prop. 29, trad. Bernard Pautrat, Paris, Seuil, 1988, p. 59.</ref>. Il n’y a pas de contingence au sens strict dans la Nature, mais seulement des choses qui nous semblent contingentes parce que nous ignorons leurs causes. L’absolu spinoziste se présente ainsi comme un système nécessaire et complet, où chaque chose a sa raison d’être. Cette conception soulève cependant une difficulté classique : comment concilier l’infinité absolue de la substance avec la réalité des choses singulières et finies ? Si Dieu est absolument infini, comment peut‑il se déterminer en modes finis sans perdre son infinité ? Spinoza soutient que la finitude des modes n’affecte pas l’infinité de la substance : les choses singulières expriment l’essence divine selon un certain degré de réalité, mais n’en constituent jamais la mesure ni la limite<ref>Spinoza, Baruch, ''Éthique'', I, prop. 8, scholie 2, trad. Bernard Pautrat, Paris, Seuil, 1988, p. 35‑37.</ref>. === Kant et les limites de la raison === Kant rompt de façon décisive avec les métaphysiques de l’absolu au sens classique, en contestant la possibilité même d’une connaissance théorique de l’absolu. Dans la ''Critique de la raison pure'', il établit que notre connaissance est limitée au domaine des phénomènes, c’est‑à‑dire aux objets tels qu’ils nous apparaissent dans les formes a priori de la sensibilité (espace et temps) et selon les catégories de l’entendement<ref>Kant, Emmanuel, ''Critique de la raison pure'', Préface de la seconde édition (B), trad. Alain Renaut, Paris, GF‑Flammarion, 2006, p. 73‑87.</ref>. La ''chose en soi'' (''Ding an sich''), c’est‑à‑dire la réalité telle qu’elle est indépendamment de nos conditions de connaissance, demeure inconnaissable pour la raison théorique<ref>Kant, Emmanuel, ''Critique de la raison pure'', B XXVI‑XXVIII, trad. Alain Renaut, Paris, GF‑Flammarion, 2006, p. 81‑82.</ref>. Elle n’est pas un objet possible d’expérience, mais un concept‑limite qui indique les bornes de notre savoir. Kant critique ainsi les prétentions de la métaphysique traditionnelle à connaître l’absolu (l’âme, le monde comme totalité, Dieu) par la seule raison spéculative. Pour autant, l’idée d’absolu n’est pas sans fonction. Dans la ''[[Dictionnaire de philosophie/Dialectique|Dialectique]] transcendantale'', Kant montre que les Idées de la raison (âme, monde, Dieu) jouent un rôle ''régulateur'' essentiel : elles orientent la recherche de l’entendement vers une unité systématique toujours plus grande, sans jamais pouvoir elles‑mêmes devenir objets de connaissance<ref>Kant, Emmanuel, ''Critique de la raison pure'', A642‑643/B670‑671, trad. Alain Renaut, Paris, GF‑Flammarion, 2006, p. 632‑633.</ref>. Par ailleurs, dans la philosophie pratique, les idées de Dieu, de liberté et d’immortalité de l’âme trouvent une nouvelle légitimité comme ''postulats de la raison pratique'', nécessaires pour penser la cohérence du [[Manuel de terminale de philosophie/Devoir|devoir]] moral et la possibilité du souverain bien<ref>Kant, Emmanuel, ''Critique de la raison pratique'', Dialectique, chap. II, trad. François Picavet, Paris, PUF, 1943, p. 125‑148.</ref>. == L’absolu dans l’idéalisme allemand == === Fichte et le Moi absolu === Fichte inaugure l’idéalisme allemand en posant le Moi absolu comme principe premier et inconditionné de toute réalité. Dans la ''Doctrine de la [[Manuel de terminale de philosophie/Science|science]]'' (1794), il affirme que le Moi se pose lui‑même (''Das Ich setzt sich selbst'') dans un acte originaire qui fonde à la fois son existence et celle du monde<ref>Fichte, Johann Gottlieb, ''La Doctrine de la science'' (1794), § 1, trad. Isabelle Thomas‑Fogiel, Paris, LGF, 1999, p. 58‑62.</ref>. Le Moi absolu n’est pas le moi empirique de la [[Dictionnaire de philosophie/Conscience|conscience]] individuelle, mais le principe transcendantal qui rend possible toute expérience et toute connaissance. Il est absolu en ce qu’il est inconditionné (il ne dépend de rien d’extérieur), infini (il n’est limité par rien d’originaire) et libre (il se détermine par sa propre activité)<ref>Fichte, Johann Gottlieb, ''Fondement du droit naturel selon les principes de la Doctrine de la science'', Introduction, trad. Alain Renaut, Paris, PUF, 1984, p. 41‑54.</ref>. La philosophie fichtéenne se déploie selon une dialectique ternaire : le Moi se pose, pose un Non‑Moi (le monde objectif) comme opposé à lui, puis opère une synthèse dans le Moi fini, qui se sait à la fois limité par le Non‑Moi et originairement libre<ref>Fichte, Johann Gottlieb, ''La Doctrine de la science'' (1794), § 3, trad. Isabelle Thomas‑Fogiel, Paris, LGF, 1999, p. 78‑89.</ref>. La limitation du Moi par le Non‑Moi n’est pas une contrainte étrangère, mais le résultat de l’activité du Moi lui‑même qui, pour se connaître, doit se donner un objet. L’absoluité du Moi se manifeste ultimement dans la liberté : le Moi est libre parce qu’il est la source de toute détermination véritable, et cette liberté trouve son expression la plus haute dans la loi morale que le Moi rationnel se donne à lui‑même<ref>Fichte, Johann Gottlieb, ''Le Système de l’éthique selon les principes de la Doctrine de la science'' (1798), trad. Paul Naulin, Paris, PUF, 1986, p. 102‑115.</ref>. === Schelling et l’identité absolue === Schelling développe ensuite une philosophie de l’identité absolue qui cherche à dépasser l’opposition fichtéenne entre le Moi et la Nature, entre l’idéalisme et le réalisme. Dans le ''Système de l’idéalisme transcendantal'' (1800) et dans ''Bruno ou du principe divin et naturel des choses'' (1802), il soutient que l’absolu est l’identité originaire du subjectif et de l’objectif, de l’idéal et du réel<ref>Schelling, Friedrich Wilhelm Joseph, ''Système de l’idéalisme transcendantal'', Introduction, trad. Christian Dubois, Paris, Allia, 2023, p. 21‑35.</ref>. L’absolu schellingien n’est ni esprit ni nature pris isolément, mais leur unité indifférenciée. Il est cette identité où toutes les oppositions sont suspendues, où les contraires coïncident dans une unité plus haute<ref>Veto, Miklos, « L’absolu et la philosophie de Schelling », dans ''Laval théologique et philosophique'', vol. 41, nᵒ 2, 1985, p. 157‑170.</ref>. Cette identité n’est toutefois pas statique : elle est le processus par lequel l’absolu se manifeste dans la Nature et dans l’Esprit. La Nature est ainsi comprise comme « esprit [[Manuel de terminale de philosophie/Inconscient|inconscient]] », tandis que l’Esprit est la Nature devenue consciente d’elle‑même<ref>Schelling, Friedrich Wilhelm Joseph, ''Idées pour une philosophie de la nature'', trad. François‑Xavier Chenet et Emmanuel Martineau, Paris, Vrin, 2000, p. 45‑67.</ref>. La connaissance de l’absolu ne peut, selon Schelling, se faire simplement par concepts, car tout concept détermine et oppose. Elle requiert une ''intuition intellectuelle'', faculté de saisir immédiatement l’unité originaire. Dans ses écrits ultérieurs, Schelling accordera une place privilégiée à l’[[Dictionnaire de philosophie/Art|art]] comme révélation de l’absolu : l’œuvre d’art réalise en effet l’union singulière du conscient et de l’inconscient, de la liberté de la création et de la nécessité interne de la forme<ref>Schelling, Friedrich Wilhelm Joseph, ''Système de l’idéalisme transcendantal'', § 6, trad. Christian Dubois, Paris, Allia, 2023, p. 289‑315.</ref>. === Hegel et l’Esprit absolu === Hegel offre la construction la plus systématique de l’absolu. L’absolu hégélien n’est ni une substance figée ni un sujet isolé, mais le processus dialectique par lequel l’Esprit se réalise en se différenciant et en revenant à soi<ref>Hegel, Georg Wilhelm Friedrich, ''Phénoménologie de l’Esprit'', Préface, trad. Jean‑Pierre Lefebvre, Paris, Aubier, 1991, p. 55‑73.</ref>. Dans la ''Phénoménologie de l’Esprit'' (1807), Hegel décrit le parcours par lequel la conscience s’élève progressivement du savoir sensible immédiat jusqu’au ''savoir absolu'', c’est‑à‑dire jusqu’à la compréhension de la totalité comme processus rationnel<ref>Hegel, Georg Wilhelm Friedrich, ''Phénoménologie de l’Esprit'', VIII, « Le savoir absolu », trad. Jean‑Pierre Lefebvre, Paris, Aubier, 1991, p. 645‑662.</ref>. Le savoir absolu n’est pas une information supplémentaire qui viendrait s’ajouter au terme de l’histoire, mais la compréhension rétrospective de la nécessité de l’ensemble du développement de l’Esprit. Dans l’''Encyclopédie des sciences philosophiques'', Hegel articule son système en trois moments : la Logique (science de l’Idée en soi), la Philosophie de la Nature (science de l’Idée dans son extériorisation) et la Philosophie de l’Esprit (science de l’Idée revenue à soi)<ref>Hegel, Georg Wilhelm Friedrich, ''Encyclopédie des sciences philosophiques'', Introduction, § 18, trad. Bernard Bourgeois, Paris, Vrin, 1970, p. 281‑285.</ref>. L’Esprit absolu désigne le moment où l’Esprit se saisit lui‑même comme totalité, ce qui se réalise au plus haut degré dans l’art, la [[Manuel de terminale de philosophie/Religion|religion]] et la philosophie<ref>Hegel, Georg Wilhelm Friedrich, ''Encyclopédie des sciences philosophiques'', III, § 553‑577, trad. Bernard Bourgeois, Paris, Vrin, 1988, p. 321‑360.</ref>. L’absoluité de l’Esprit hégélien se manifeste dans sa capacité à intégrer toutes les déterminations et toutes les contradictions en un mouvement cohérent. L’absolu n’est pas au‑delà des différences et des oppositions, il est le processus même par lequel celles‑ci sont produites, mises en tension, puis dépassées (''Aufhebung'')<ref>Baum, Manfred, « Absolu (Absolut/das Absolute) », dans Bernard Mabille (dir.), ''Hegel. Lexique'', Paris, Ellipses, 2016, p. 21‑26.</ref>. « Le vrai est le tout », écrit Hegel, mais ce tout n’est vrai que comme résultat de son propre devenir<ref>Hegel, Georg Wilhelm Friedrich, ''Phénoménologie de l’Esprit'', Préface, § 20, trad. Jean‑Pierre Lefebvre, Paris, Aubier, 1991, p. 63.</ref>. La conception hégélienne implique ainsi une historicisation de l’absolu. L’Esprit absolu ne préexiste pas, tout formé, à ses manifestations historiques ; il se constitue à travers elles. L’histoire de la philosophie, l’histoire de l’art, l’histoire politique ne sont pas de simples approximations d’une vérité intemporelle, mais les moments nécessaires à travers lesquels l’absolu vient à lui‑même<ref>Hegel, Georg Wilhelm Friedrich, ''Leçons sur l’histoire de la philosophie'', Introduction, trad. Jean Gibelin, Paris, Gallimard, 1954, p. 33‑58.</ref>. == L’absolu dans la philosophie contemporaine == === Critiques de l’absolu === La notion d’absolu a fait l’objet de critiques importantes dans la philosophie moderne et contemporaine. Dès le XIXe siècle, Schopenhauer conteste l’idée d’un absolu rationnel en posant la Volonté comme chose en soi irrationnelle et aveugle<ref>Schopenhauer, Arthur, ''Le Monde comme volonté et comme représentation'', livre II, § 23‑29, trad. Auguste Burdeau, Paris, PUF, 1966, p. 133‑170.</ref>. La Volonté schopenhauerienne est absolue en ce sens qu’elle est inconditionnée et ne dépend d’aucune raison suffisante, mais cette absoluité est celle d’une force dépourvue de finalité et de sens, étrangère à toute téléologie rationnelle. Au XXe siècle, la critique de l’absolu prend des formes variées. La phénoménologie husserlienne, tout en poursuivant le projet d’une fondation rigoureuse du savoir, met en lumière la corrélation essentielle entre conscience et monde : toute prétention à l’« absolu » doit être repensée à partir de la structure intentionnelle de la conscience, ce qui relativise l’idée d’un point de vue surplombant totalement indépendant de toute subjectivité<ref>Husserl, Edmund, ''Méditations cartésiennes'', § 8‑9, trad. Gabrielle Peiffer et Emmanuel Levinas, Paris, Vrin, 1953, p. 26‑32.</ref>. L’existentialisme sartrien affirme que l’existence précède l’essence et qu’il n’y a pas de « nature humaine » préalablement fixée dans un absolu métaphysique<ref>Sartre, Jean‑Paul, ''L’existentialisme est un humanisme'', Paris, Nagel, 1946, p. 17‑19.</ref>. Du côté de la philosophie dite « analytique », plusieurs auteurs du début du XXe siècle – en particulier Russell et Moore – ont pris pour cible l’idéalisme absolu dominant dans l’université britannique, notamment chez Bradley et McTaggart. Bradley interprétait la réalité ultime comme un Absolu unique auquel se ramènent, en dernière analyse, les relations et les jugements, ce qui l’amenait à minimiser la réalité des individus et des faits particuliers<ref>Bradley, Francis Herbert, ''Appearance and Reality. A Metaphysical Essay'', Oxford, Clarendon Press, 1893, chap. XIII‑XIV.</ref>. Russell et Moore défendent au contraire un réalisme pluraliste : ils soutiennent l’existence d’individus et de faits particuliers, dotés de relations externes, et refusent de réduire ces relations au sein d’un Tout unique<ref>''Philosophie analytique (A)'', Encyclo‑philo, en ligne : section sur Russell et Moore.</ref>. La métaphysique des « atomes logiques » et le souci d’analyse deviennent ainsi, chez eux, des moyens de s’opposer aux constructions globales de l’Absolu. === Résurgences contemporaines et ouvertures interculturelles === Malgré ces critiques, l’idée d’absolu ne disparaît pas ; elle se transforme et resurgit sous d’autres formes. Dès la fin du XIXe siècle, l’idéalisme britannique de Francis Herbert Bradley (1846‑1924) développe une conception de l’Absolu comme « expérience totale » indifférenciée, au‑delà des distinctions et relations du monde de l’apparence<ref>Bradley, Francis Herbert, ''Appearance and Reality. A Metaphysical Essay'', Oxford, Clarendon Press, 1893, chap. XIII‑XIV.</ref>. Plus près de nous, divers courants néo‑hégéliens ou « idéalistes spéculatifs » revendiquent l’idée d’une rationalité immanente au réel, contre les philosophies de la fragmentation ou du pur hasard<ref>Voir, par exemple, ''L’idéalisme britannique : histoire et actualité'', ''Philosophiques'', vol. 36, nᵒ 1, 2009.</ref>. Certains représentants du réalisme spéculatif, notamment Quentin Meillassoux, entreprennent de penser un « absolu » non corrélationniste, c’est‑à‑dire une réalité qui existe indépendamment de toute relation à la pensée et dont certaines propriétés (par exemple la contingence des lois de la nature) peuvent, selon eux, être connues a priori<ref>Meillassoux, Quentin, ''Après la finitude. Essai sur la nécessité de la contingence'', Paris, Seuil, 2006, p. 35‑58.</ref>. Sans assimiler hâtivement des traditions très diverses à la métaphysique occidentale de l’absolu, on peut signaler, avec prudence, l’existence de concepts qui jouent, dans d’autres contextes, le rôle de principe ultime ou de réalité suprême. Dans certaines formes de pensée indienne, le ''brahman'' est présenté comme la réalité ultime, indifférenciée, au‑delà de toute qualification, à laquelle peut être identifié le ''âtman'', le « Soi » le plus intime<ref>Sur l’advaita‑vedānta, voir par exemple ''La philosophie indienne'', site ''Les‑philosophes.fr'', section « Âtman et Brahman ».</ref>. Dans certaines interprétations du bouddhisme, le ''nirvāṇa'' est décrit comme un « au‑delà » de la souffrance et de l’enchaînement des renaissances, parfois compris comme une réalité ultime qui échappe aux catégories ordinaires<ref>Voir, par exemple, F. Chenet, « Approches indiennes du non‑être, du néant et de la vacuité », ''Cahiers de philosophie de l’Université de Caen'', 43, 2006.</ref>. Ces comparaisons ne doivent pas faire oublier que les structures conceptuelles, les problèmes et les styles de pensée sont très différents : parler d’« analogies » signifie seulement que certaines traditions ont éprouvé le besoin de nommer ce qui, pour elles, vaut comme ultime ou inconditionné, sans postuler pour autant l’identité de ces notions. Dans le champ de la philosophie politique, la question de l’absolu resurgit parfois à propos de l’universalisme, des droits humains ou de la souveraineté. La tension entre relativisme culturel et revendication de normes universelles conduit à s’interroger sur la possibilité de principes véritablement absolus, c’est‑à‑dire valables indépendamment de tout contexte historique ou culturel. Ces débats, qui excèdent le cadre de cet article, portent moins sur un « Absolu » métaphysique que sur le statut de certaines valeurs tenues pour inconditionnelles. == Enjeux et difficultés == La notion d’absolu soulève, tout au long de son histoire, plusieurs difficultés philosophiques majeures. En premier lieu se pose le problème de la définition : comment définir l’absolu sans le limiter ? Toute définition implique une détermination, donc une exclusion : définir, c’est tracer une frontière. Or l’absolu, par essence, est conçu comme illimité. D’où la tentation, déjà visible dans la théologie négative, de recourir à des approches ''apophatiques'' (dire ce que l’absolu n’est pas) ou analogiques, plutôt qu’à des définitions strictement positives. En second lieu, se pose le problème de la connaissance : comment un esprit fini peut‑il connaître l’infini ? Si l’absolu est pensé comme transcendant, il semble échapper à toute prise conceptuelle directe. S’il est pensé comme immanent, se pose la question de son distinctif : en quoi diffère‑t‑il alors du monde fini lui‑même ? Les réponses oscillent entre un rationalisme confiant (l’absolu est connaissable rationnellement) et un recours à des formes d’intuition, d’expérience mystique ou artistique censées donner accès à une dimension autrement inatteignable. En troisième lieu apparaît le problème du rapport de l’absolu au monde : comment ce qui est parfait, complet et inconditionné peut‑il être la source d’un monde marqué par l’imperfection, la finitude et le mal ? La théologie classique affronte ce problème à travers la question du mal et des modalités de la création ; les métaphysiques de l’émanation ou de la manifestation (Plotin, certaines formes de mystique, l’idéalisme allemand) y répondent par l’image d’une dérivation graduelle du multiple à partir de l’Un. Mais aucune de ces réponses n’est exempte de difficultés. En quatrième lieu enfin, se pose le problème de l’un et du multiple : l’absolu doit‑il être pensé comme un principe unique (monisme), ou peut‑on concevoir une pluralité d’absolus (par exemple dans certaines formes de polythéisme ou de relativisme de valeurs ultimes) ? Le monisme risque de rendre énigmatique la diversité réelle du monde ; le pluralisme, s’il multiplie les « absolus », semble menacer le concept même d’absolu en le relativisant. == Conclusion == La notion d’absolu occupe une place paradoxale dans l’histoire de la philosophie. D’un côté, elle représente l’horizon ultime de la pensée métaphysique, ce vers quoi tend toute recherche de fondements inconditionnés et de [[Dictionnaire de philosophie/Vérité|vérité]]s dernières. De l’autre, elle ne cesse de mettre la raison en difficulté, en l’obligeant à se confronter à ses propres limites. Les grandes philosophies de l’absolu (Platon, Thomas d’Aquin, Spinoza, Hegel) constituent autant de tentatives marquantes pour penser la totalité du réel à partir d’un principe unitaire. Elles témoignent d’une exigence de rationalité intégrale qui refuse de se contenter d’explications partielles ou fragmentaires. Les critiques de l’absolu (Kant, Schopenhauer, certaines formes de phénoménologie et d’existentialisme, plusieurs courants de la philosophie analytique) rappellent, quant à elles, les risques d’une métaphysique trop ambitieuse et la nécessité de reconnaître la finitude de notre raison. Au‑delà des débats techniques, la question de l’absolu touche à des interrogations existentielles décisives : y a‑t‑il un fondement ultime qui donne sens et valeur à notre vie ? Sommes‑nous en droit d’espérer un savoir définitif, ou devons‑nous accepter que notre pensée demeure toujours en deçà d’un réel qui la dépasse ? L’histoire philosophique de l’absolu suggère peut‑être que ces questions, même si elles ne reçoivent jamais de solution pleinement satisfaisante, demeurent constitutives de l’effort philosophique lui‑même : elles en marquent à la fois l’ambition et la limite. == Notes et références == {{references}} == Voir aussi == {{MotPhilo|Être}}, {{MotPhilo|Essence}}, {{MotPhilo|Existence}}, {{MotPhilo|Dieu}}, {{MotPhilo|Infini}}, {{MotPhilo|Substance}}, {{MotPhilo|Idéalisme}}, {{MotPhilo|Monisme}}, {{MotPhilo|Transcendance}} {{Autocat}} [[Catégorie:Métaphysique]] [[Catégorie:Ontologie]] [[Catégorie:Philosophie de la religion]] [[Catégorie:Idéalisme allemand]] hegddfxu0cdm66ehaf4qqrgdxsw9fta Dictionnaire de philosophie/Accident 0 83012 767976 762072 2026-06-18T04:51:30Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 767976 wikitext text/x-wiki {{DicoPhilo|Accident|lecture=oui}} '''Accident''' (du latin ''accidens'', participe présent du verbe ''accidere'', « arriver à », traduction du grec ancien ''συμβεβηκός'', ''symbebèkos'', « ce qui va avec ») est un terme qui recouvre, dans la tradition philosophique, plusieurs sens techniques distincts et irréductibles les uns aux autres. Sur le plan ontologique, il désigne, depuis Aristote, ce qui existe dans une substance (''en hupokeimenô'') sans en constituer l'essence — qu'il lui appartienne de manière contingente (l'accident au sens strict de ''Métaphysique'' Δ, 30) ou qu'il en découle nécessairement sans entrer dans sa définition (l'« accident par soi » des ''Seconds Analytiques''). Sur le plan logique, dans la tradition des prédicables issue de Porphyre, l'accident désigne un mode de prédication irréductible au genre, à l'espèce, à la différence et au propre, et admet lui-même une subdivision entre accidents séparables et inséparables. La tradition scolastique, enfin, a enrichi ces acceptions en les intégrant dans une métaphysique de l'être où le statut ontologique de l'accident fait l'objet de controverses majeures, notamment autour de la question eucharistique. Ces différentes acceptions se sont entrecroisées et enrichies mutuellement tout au long de l'histoire de la philosophie, de l'Antiquité à la métaphysique analytique contemporaine. == Origine et fondements aristotéliciens == === La distinction substance-accident chez Aristote === Le concept d'accident trouve son origine dans la philosophie d'Aristote, qui établit une distinction fondamentale entre ce qui existe par soi (la substance, ''ousia'') et ce qui existe en autre chose (l'accident). Dans les ''Catégories'', Aristote introduit deux relations — « être dit d'un sujet » et « être dans un sujet » — dont le croisement produit ce que les commentateurs ont appelé le « carré ontologique », une division quadripartite des étants.<ref>Aristote, ''Catégories'', 1a20-1b9, trad. J. Tricot, Paris, Vrin, 1984, p. 4-6.</ref> Cette reconstruction, devenue classique, doit cependant être accueillie avec prudence. Aristote ne présente pas explicitement ces deux relations sous forme de tableau et ne définit formellement que l'une d'entre elles (« être dans un sujet »), laissant l'autre (« être dit d'un sujet ») sans caractérisation complète. Les interprètes divergent sur la portée exacte de cette seconde relation : certains y voient une relation de prédication essentielle, d'autres un rapport d'instanciation entre l'universel et le particulier. La question de savoir si la case des « accidents universels » (ce qui est à la fois « dit d'un sujet » et « dans un sujet ») est réellement occupée par des entités distinctes fait également débat.<ref>S. Marc Cohen, « Aristotle's Categories », dans ''Stanford Encyclopedia of Philosophy'', éd. E. N. Zalta, 2022, section 5.</ref><ref>Paul Studtmann, « Aristotle's Categories », dans ''Stanford Encyclopedia of Philosophy'', éd. E. N. Zalta, 2021, section 2.</ref> Le lecteur doit donc garder à l'esprit que la présentation qui suit reflète une lecture standard mais non unanime du texte aristotélicien. Selon cette division, les substances premières (comme cet homme particulier) ne sont ni dites d'un sujet ni dans un sujet. Les accidents particuliers (comme cette blancheur particulière) sont dans un sujet mais ne sont pas dits d'un sujet. Les substances secondes (comme l'espèce « homme ») sont dites d'un sujet mais ne sont pas dans un sujet. Enfin, les accidents universels (comme la blancheur en général) sont à la fois dits d'un sujet et dans un sujet. L'accident se définit donc par son mode d'être : il existe ''dans'' une substance (''en hupokeimenô''), c'est-à-dire qu'il ne peut exister séparément de celle-ci. Comme l'écrit Aristote : « J'appelle être dans un sujet ce qui, existant dans quelque chose, non à la manière d'une partie, ne peut exister séparément de ce dans quoi il est. »<ref>Aristote, ''Catégories'', 1a24-25, op. cit., p. 4.</ref> === Les différents sens de l'accident === Dans la ''Métaphysique'', Aristote distingue plusieurs acceptions du terme accident. Au livre Delta (Δ, 30), il définit l'accident comme « ce qui appartient à un être et dont l'attribution est vraie, mais qui n'est ni nécessaire ni constant ».<ref>Aristote, ''Métaphysique'', Δ, 30, 1025a14-15, trad. J. Tricot, Paris, Vrin, 1991, tome I, p. 281.</ref> Cette définition met l'accent sur le caractère contingent de l'accident : il peut appartenir ou ne pas appartenir à une substance sans que celle-ci cesse d'être ce qu'elle est. Aristote distingue également entre les accidents simplement dits (''kata symbebèkos'') et les « accidents par soi » (''kath'hauto symbebèkota''). Ces derniers, présentés dans les ''Seconds Analytiques'', sont des propriétés qui découlent nécessairement de l'essence d'une chose sans pour autant appartenir à sa définition. Par exemple, avoir la somme de ses angles égale à deux droits est un accident par soi du triangle : cette propriété découle nécessairement de ce qu'est un triangle, mais n'entre pas dans sa définition première.<ref>Aristote, ''Seconds Analytiques'', I, 4, 73a34-73b5, trad. J. Tricot, Paris, Vrin, 1987, p. 18-19.</ref> === Les neuf catégories d'accidents === Aristote classe les accidents en neuf catégories, qui s'ajoutent à la catégorie de substance pour former les dix catégories de l'être : la quantité (''poson''), la qualité (''poion''), la relation (''pros ti''), le lieu (''pou''), le temps (''pote''), la position (''keisthai''), la possession ou l'état (''echein''), l'action (''poiein'') et la passion (''paschein'').<ref>Aristote, ''Catégories'', 4, 1b25-2a4, op. cit., p. 7-8.</ref> Cette classification vise à épuiser les différentes manières dont les accidents peuvent se prédire d'une substance. Chaque catégorie d'accident représente un mode spécifique d'inhérence dans la substance. La quantité concerne la mesure et l'étendue (grand, petit, deux coudées) ; la qualité désigne les dispositions et les affections (blanc, musicien, chaud) ; la relation exprime les rapports entre les choses (double, moitié, plus grand) ; le lieu indique la position dans l'espace (au Lycée, à l'Agora) ; le temps situe dans la durée (hier, l'an dernier) ; la position désigne l'arrangement des parties (assis, couché) ; l'état marque la condition (chaussé, armé) ; l'action signifie l'activité (couper, brûler) ; et la passion désigne le fait de subir (être coupé, être brûlé). == L'accident comme prédicable : Porphyre et la tradition logique == === Les cinq prédicables et la place de l'accident === La notion d'accident ne relève pas seulement de l'ontologie de la substance : elle occupe aussi une place centrale dans la logique des prédicables. C'est dans l{{'}}''Isagoge'' de Porphyre de Tyr (IIIe siècle), introduction aux ''Catégories'' d'Aristote qui devint l'un des textes les plus commentés de la tradition philosophique, que cette dimension est systématisée. Porphyre identifie cinq prédicables, c'est-à-dire cinq manières dont un prédicat peut être attribué à un sujet : le genre (''genos''), l'espèce (''eidos''), la différence spécifique (''diaphora''), le propre (''idion'') et l'accident (''symbebèkos'').<ref>Porphyre, ''Isagoge'', trad. A. de Libera et A.-Ph. Segonds, Paris, Vrin, 1998, p. 1-3.</ref> Dans ce cadre, l'accident se distingue des quatre autres prédicables par le fait qu'il n'entre ni dans la définition de son sujet (contrairement au genre et à la différence), ni ne convertit avec lui (contrairement au propre). Le genre « animal » entre dans la définition de l'homme ; la différence « raisonnable » spécifie l'homme au sein du genre animal ; le propre « capable de rire » convertit avec l'homme (tout homme est capable de rire et tout être capable de rire est un homme) sans entrer dans sa définition. L'accident, quant à lui, n'entre pas dans la définition et ne convertit pas avec le sujet : il peut aussi bien appartenir qu'être absent.<ref>Porphyre, ''Isagoge'', op. cit., p. 13-16.</ref> === Accidents séparables et accidents inséparables === Porphyre introduit en outre une distinction importante entre les accidents séparables et les accidents inséparables. Un accident séparable est celui qui peut quitter son sujet sans que celui-ci soit détruit : le sommeil, par exemple, est un accident séparable de l'homme, car on peut cesser de dormir. Un accident inséparable est celui qui accompagne de fait son sujet de manière permanente, bien qu'il ne soit pas logiquement impossible de l'en séparer : Porphyre prend l'exemple classique de la noirceur du corbeau, dont on peut concevoir qu'elle soit absente sans que l'animal cesse d'être un corbeau, mais qui en fait ne le quitte jamais.<ref>Porphyre, ''Isagoge'', op. cit., p. 15-16.</ref> Cette distinction est décisive pour comprendre la tradition logique médiévale. Les accidents inséparables, bien qu'ils accompagnent toujours leur sujet, ne doivent pas être confondus avec les propriétés essentielles ou le propre : ils n'entrent pas dans la définition du sujet et ne sont pas démontrables à partir de l'essence. Ils se situent dans une zone intermédiaire entre la nécessité de l'essence et la pure contingence, qui sera abondamment discutée par les commentateurs néoplatoniciens (Ammonius, Simplicius, Boèce) puis par les logiciens médiévaux. === La transmission médiévale === La théorie des cinq prédicables, transmise à l'Occident latin par la traduction et le commentaire de Boèce (début du VIe siècle), constitua le point d'entrée de l'enseignement de la logique dans les universités médiévales.<ref>Boèce, ''In Isagogen Porphyrii commentorum editio secunda'', éd. S. Brandt, dans ''Corpus Scriptorum Ecclesiasticorum Latinorum'', vol. 48, Vienne, 1906, p. 135-348.</ref> L{{'}}''Isagoge'' figurait en tête du corpus de l{{'}}''Organon'' et précédait l'étude des ''Catégories'' elles-mêmes. Cette position pédagogique explique que, pour les médiévaux, la notion d'accident était simultanément un concept ontologique (ce qui existe dans une substance) et un concept logique (un mode de prédication), les deux dimensions étant indissociables dans le cadre de leur réflexion. == Développements médiévaux == === Thomas d'Aquin et la dépendance ontologique === Thomas d'Aquin approfondit considérablement la conception aristotélicienne de l'accident en l'intégrant dans sa métaphysique de l'être. Pour l'Aquinate, l'accident se caractérise par une dépendance ontologique radicale à l'égard de la substance. Cette dépendance s'exprime dans la formule : « l'être de l'accident est d'être dans » (''accidentis esse est inesse'').<ref>Thomas d'Aquin, ''In Metaphysicam Aristotelis commentaria'', lib. VII, lect. 1, n° 1256, éd. M.-R. Cathala et R. M. Spiazzi, Turin, Marietti, 1964, p. 321.</ref> Cette formulation signifie que l'acte d'être de l'accident n'est pas un acte d'être absolu, mais l'acte d'être de la substance modifiée par cet accident. Quand nous disons que la blancheur de cette feuille existe, nous ne signifions pas que la blancheur possède un acte d'être indépendant, mais que la feuille existe de manière qualifiée, c'est-à-dire qu'elle existe « comme blanche ». L'accident ne possède donc pas l'être au sens propre, mais seulement de manière dérivée et dépendante. Thomas d'Aquin développe également une théorie de l'analogie de l'être qui permet de penser le rapport entre la substance et l'accident. L'être ne se dit pas de manière univoque de la substance et de l'accident, mais de manière analogique : la substance possède l'être de manière première et absolue (''per se''), tandis que l'accident le possède de manière seconde et relative (''per accidens'').<ref>Thomas d'Aquin, ''Summa Theologiae'', Ia, q. 45, a. 4, trad. A.-M. Roguet, Paris, Cerf, 1984, tome 1, p. 453.</ref> Cette doctrine de l'analogie de l'être fonde métaphysiquement la distinction entre substance et accident tout en permettant de dire que les deux « sont », mais selon des modes différents. === La question eucharistique === La théologie chrétienne du Moyen Âge confère une importance particulière à la notion d'accident dans le contexte de la doctrine de la transsubstantiation. Selon cette doctrine, lors de la consécration eucharistique, la substance du pain et du vin est transformée en substance du corps et du sang du Christ, tandis que les accidents (couleur, saveur, forme, etc.) demeurent inchangés. Cette doctrine pose un problème métaphysique majeur : comment des accidents peuvent-ils subsister sans substance, puisque, par définition, l'accident existe dans une substance et ne peut exister séparément ?<ref>Thomas d'Aquin, ''Summa Theologiae'', IIIa, q. 77, a. 1, trad. A.-M. Roguet, Paris, Cerf, 1986, tome 4, p. 453-455.</ref> Thomas d'Aquin résout ce problème en affirmant que, par miracle, Dieu maintient les accidents du pain et du vin dans l'être sans qu'ils inhèrent à aucune substance. Ces accidents ne changent pas de nature – ils conservent leur tendance naturelle à inhérer dans une substance –, mais leur mode d'existence devient surnaturel. L'un des accidents (en l'occurrence la quantité) sert de support aux autres accidents, jouant en quelque sorte le rôle de quasi-substance.<ref>Thomas d'Aquin, ''Summa Theologiae'', IIIa, q. 77, a. 2, op. cit., p. 456-457.</ref> Cette problématique théologique a eu des répercussions philosophiques considérables. Elle a conduit les philosophes scolastiques à affiner leur analyse de la notion d'accident et à s'interroger sur la possibilité logique et métaphysique de l'existence séparée des accidents. Certains penseurs, comme Jean Buridan, ont maintenu que les accidents ne peuvent jamais exister séparément de toute substance, tandis que d'autres, comme Marsile d'Inghen, ont admis la possibilité d'une existence miraculeuse des accidents séparés.<ref>Paul J. J. M. Bakker, « Aristotelian Metaphysics and Eucharistic Theology: John Buridan and Marsilius of Inghen on the Ontological Status of Accidental Being », dans ''The Metaphysics and Natural Philosophy of John Buridan'', éd. J. M. M. H. Thijssen et J. Zupko, Leyde, Brill, 2001, p. 247-264.</ref> === Duns Scot et l'accident absolu === Jean Duns Scot introduit une distinction importante entre les accidents absolus et les accidents respectifs (ou relatifs). Les accidents absolus, comme la qualité et la quantité, possèdent une certaine réalité propre et ne se définissent pas essentiellement par leur relation à autre chose. Les accidents respectifs, comme la relation, se définissent essentiellement par référence à un terme extérieur.<ref>Jean Duns Scot, ''Ordinatio'', II, d. 1, q. 4-5, dans ''Opera Omnia'', éd. C. Balić, Cité du Vatican, Typis Polyglottis Vaticanis, 1950-2013, vol. VII, p. 68-103.</ref> Cette distinction permet à Duns Scot de défendre l'idée que certains accidents (notamment la quantité et la qualité) possèdent une entité réelle distincte de la substance et des autres accidents. Cette position s'oppose à celle d'Henri de Gand, qui considérait que les accidents n'ajoutent aucune réalité à la substance. Pour Duns Scot, la blancheur de Socrate est une entité réelle distincte de Socrate lui-même, bien qu'elle dépende de Socrate pour exister. Cette conception d'accidents « réellement distincts » de leur substance aura une influence considérable sur les débats métaphysiques ultérieurs. == Critiques et transformations modernes == === Le rejet cartésien des accidents réels === René Descartes rompt avec la tradition scolastique en rejetant la notion d'accident réel. Dans les ''Réponses aux Sixièmes Objections'', il critique l'idée selon laquelle les accidents seraient des entités réelles distinctes de la substance.<ref>René Descartes, ''Méditations métaphysiques'', « Réponses aux Sixièmes Objections », dans ''Œuvres'', éd. C. Adam et P. Tannery, Paris, Vrin, 1996, tome IX, p. 236.</ref> Pour Descartes, la seule substance au sens propre et absolu est Dieu, c'est-à-dire un être qui n'a besoin d'aucune autre chose pour exister. Cependant, le terme de substance s'applique également, en un sens dérivé, aux choses créées qui n'ont besoin pour exister que du concours de Dieu ; sous ce rapport, Descartes distingue deux sortes de substances créées : la substance pensante (''res cogitans'') et la substance étendue (''res extensa'').<ref>René Descartes, ''Principes de la philosophie'', I, art. 51-52, dans ''Œuvres'', op. cit., tome IX, p. 46-47.</ref> Ce qu'on appelle traditionnellement « accidents » ne sont en réalité que des modes de ces substances, c'est-à-dire des manières d'être qui ne possèdent aucune réalité indépendante de la substance. La forme, la grandeur et le mouvement, par exemple, ne sont que des modes de la substance étendue, et non des entités distinctes qui viendraient s'ajouter à elle.<ref>René Descartes, ''Principes de la philosophie'', I, art. 56, dans ''Œuvres'', op. cit., tome IX, p. 49-50.</ref> Ce changement terminologique de l'accident au mode reflète une transformation métaphysique profonde. Alors que l'accident scolastique impliquait une certaine réalité propre et une distinction réelle d'avec la substance, le mode cartésien n'est qu'une façon dont la substance existe à un moment donné. Le mode n'ajoute rien à la substance ; il est simplement la substance elle-même considérée sous un certain aspect. Cette conception annonce la dissolution progressive de la métaphysique substance-accident dans la philosophie moderne. === Locke et les qualités === John Locke remplace largement le vocabulaire de la substance et de l'accident par celui du support (''substratum'') et des qualités. Pour Locke, ce que nous appelons substance n'est qu'un « je-ne-sais-quoi » qui est supposé supporter les qualités observables.<ref>John Locke, ''Essai sur l'entendement humain'', II, xxiii, § 2, trad. J.-M. Vienne, Paris, Vrin, 2001, p. 415-416.</ref> Les qualités sont les pouvoirs qu'ont les objets de produire des idées en nous (qualités premières comme la solidité, l'étendue, la figure, le mouvement) ou de produire en nous des sensations qui ne ressemblent pas aux objets eux-mêmes (qualités secondes comme les couleurs, les sons, les odeurs). Cette transformation lockéenne marque un déplacement épistémologique : on passe d'une interrogation sur la structure ontologique du réel (substance et accidents) à une interrogation sur nos facultés de connaître et les limites de notre expérience. La notion d'accident, comprise comme une propriété réelle inhérente à la substance, cède la place à celle de qualité, comprise comme un pouvoir de produire des idées dans l'esprit percevant. === Hume et la dissolution du substrat === David Hume radicalise la critique lockéenne en contestant l'idée même d'une substance support des accidents. Selon Hume, nous n'avons aucune impression d'une substance distincte de ses qualités. Ce que nous appelons « substance » n'est qu'une collection de qualités unies par l'imagination selon les principes d'association (ressemblance, contiguïté, causalité).<ref>David Hume, ''Traité de la nature humaine'', I, i, 6, trad. P. Baranger et P. Saltel, Paris, GF-Flammarion, 1995, p. 92-94.</ref> Cette « théorie du faisceau » (''bundle theory'') élimine complètement la notion de substance comme substrat distinct de ses propriétés. Il n'y a plus de substance qui « aurait » des accidents ; il n'y a qu'un ensemble de qualités co-présentes que notre esprit unit en un seul objet. La distinction substance-accident, pilier de la métaphysique occidentale depuis Aristote, se trouve ainsi dissoute dans une conception empiriste radicale qui ne reconnaît que ce qui est donné dans l'expérience sensible. == Perspectives contemporaines == === Le débat essence-accident === La philosophie analytique contemporaine a renouvelé l'intérêt pour la distinction entre propriétés essentielles et accidentelles, souvent sans référence explicite au cadre substance-accident. Une propriété est essentielle à un objet si cet objet ne pourrait exister sans posséder cette propriété ; elle est accidentelle si l'objet la possède mais pourrait exister sans elle.<ref>Teresa Robertson Ishii, « Essential vs. Accidental Properties », ''Stanford Encyclopedia of Philosophy'', éd. E. N. Zalta, 2008, révisé 2020, section 1.</ref> Cette caractérisation modale de la distinction essence-accident, qui définit l'essentiel en termes de nécessité et l'accidentel en termes de contingence, a été critiquée par Kit Fine. Selon Fine, la simple nécessité ne suffit pas à capturer la notion d'essence, car un objet peut avoir nécessairement une propriété sans que cette propriété soit essentielle à ce qu'il est. Par exemple, Socrate possède nécessairement la propriété d'appartenir à l'ensemble {Socrate}, mais cette propriété ne définit pas ce qu'est Socrate.<ref>Kit Fine, « Essence and Modality », ''Philosophical Perspectives'', vol. 8, 1994, p. 1-16.</ref> Fine propose de revenir à une conception définitionnelle de l'essence : les propriétés essentielles d'un objet sont celles qui figurent dans sa définition, dans ce qui dit ce que l'objet est. Cette approche renoue avec la tradition aristotélicienne en mettant l'accent sur la définition (''horismos'') plutôt que sur la simple nécessité. Elle permet de distinguer les propriétés qui constituent l'identité d'un objet de celles qui, bien que nécessaires, n'en découlent que comme conséquences. === L'ontologie des tropes === Certains métaphysiciens contemporains, comme D. C. Williams et Keith Campbell, ont développé une ontologie des tropes qui transforme radicalement le rapport entre substance et accident. Les tropes sont des propriétés particulières concrètes : non pas « la blancheur » en général, mais « cette blancheur particulière » qui existe ici et maintenant.<ref>D. C. Williams, « On the Elements of Being », ''Review of Metaphysics'', vol. 7, 1953, p. 3-18, 171-192.</ref> Dans cette perspective, ce que la tradition appelait « substance » n'est qu'un faisceau de tropes co-présents. Un objet ordinaire, comme cette pomme, est constitué de tropes de couleur, de forme, de masse, de goût, etc., tous liés entre eux. Il n'y a pas de substrat distinct qui « possèderait » ces propriétés ; il n'y a que les tropes eux-mêmes et leurs relations. Cette ontologie élimine la distinction traditionnelle entre substance et accident en ne reconnaissant qu'un seul type d'entité fondamentale : les propriétés particulières. === La métaphysique néo-aristotélicienne === D'autres philosophes contemporains, comme E. J. Lowe et David Oderberg, défendent une métaphysique néo-aristotélicienne qui réhabilite la distinction substance-accident. Lowe élabore une « ontologie des quatre catégories » (''four-category ontology'') qui distingue quatre types fondamentaux d'étants selon deux axes : la distinction entre le substantiel et le non-substantiel, d'une part, et la distinction entre le particulier et l'universel, d'autre part.<ref>E. J. Lowe, ''The Four-Category Ontology: A Metaphysical Foundation for Natural Science'', Oxford, Clarendon Press, 2006, p. 23-45.</ref> Les quatre catégories sont ainsi : les particuliers substantiels (''substantial particulars'', par exemple Socrate), les particuliers non substantiels ou modes (''non-substantial particulars'', par exemple la sagesse de Socrate), les universaux substantiels ou genres et espèces (''substantial universals'', par exemple l'espèce humaine) et les universaux non substantiels ou propriétés et relations (''non-substantial universals'', par exemple la sagesse en général). Les modes, équivalents contemporains des accidents aristotéliciens, sont des particuliers non substantiels qui dépendent existentiellement des substances : la sagesse de Socrate ne peut exister sans Socrate. Mais les substances individuelles, quant à elles, ne dépendent pour leur existence d'aucune autre entité particulière (bien qu'elles dépendent de leur espèce ou genre). Cette ontologie néo-aristotélicienne tente de répondre aux objections modernes contre la métaphysique substance-accident tout en préservant l'intuition fondamentale qu'il existe une différence catégorielle entre les choses qui existent indépendamment (les substances) et celles qui existent de manière dépendante (les accidents ou modes). == Conclusion == La notion d'accident, héritée d'Aristote et systématisée par Porphyre dans le cadre des prédicables puis développée par la scolastique médiévale, a structuré la métaphysique et la logique occidentales pendant plus de deux millénaires. Elle exprime l'intuition selon laquelle les êtres possèdent une structure hiérarchique : certains aspects d'une chose (sa substance) sont fondamentaux et permanents, tandis que d'autres (ses accidents) sont secondaires et variables. Cette distinction permet de penser à la fois l'identité et le changement : une chose peut changer accidentellement tout en demeurant substantiellement la même. Les critiques modernes, de Descartes à Hume, ont progressivement érodé cette conception traditionnelle, remplaçant le couple substance-accident par de nouveaux cadres conceptuels (substance-mode, support-qualités, faisceau de propriétés). Néanmoins, les débats contemporains en métaphysique analytique témoignent de la persistance des questions soulevées par la tradition aristotélicienne : comment distinguer ce qui est essentiel de ce qui est accidentel ? Comment penser le rapport entre un objet et ses propriétés ? Quelle est la structure ontologique fondamentale du réel ? Ces interrogations, formulées dans un vocabulaire renouvelé, prolongent et transforment les problématiques inaugurées par Aristote. La notion d'accident, même si elle n'est plus au centre des discussions philosophiques contemporaines, continue d'exercer une influence sur notre façon de penser l'être, l'identité et le changement. == Notes et références == <references/> == Bibliographie == === Sources anciennes === * Aristote, ''Catégories'', trad. J. Tricot, Paris, Vrin, 1984. * Aristote, ''Métaphysique'', 2 tomes, trad. J. Tricot, Paris, Vrin, 1991. * Aristote, ''Seconds Analytiques'', trad. J. Tricot, Paris, Vrin, 1987. * Porphyre, ''Isagoge'', trad. A. de Libera et A.-Ph. Segonds, Paris, Vrin, 1998. === Sources médiévales === * Boèce, ''In Isagogen Porphyrii commentorum editio secunda'', éd. S. Brandt, dans ''Corpus Scriptorum Ecclesiasticorum Latinorum'', vol. 48, Vienne, 1906. * Thomas d'Aquin, ''In Metaphysicam Aristotelis commentaria'', éd. M.-R. Cathala et R. M. Spiazzi, Turin, Marietti, 1964. * Thomas d'Aquin, ''Somme théologique'', trad. A.-M. Roguet, 4 tomes, Paris, Cerf, 1984-1986. * Jean Duns Scot, ''Ordinatio'', dans ''Opera Omnia'', éd. C. Balić, Cité du Vatican, Typis Polyglottis Vaticanis, 1950-2013. === Sources modernes === * Descartes, René, ''Méditations métaphysiques'', dans ''Œuvres'', éd. C. Adam et P. Tannery, tome IX, Paris, Vrin, 1996. * Descartes, René, ''Principes de la philosophie'', dans ''Œuvres'', éd. C. Adam et P. Tannery, tome IX, Paris, Vrin, 1996. * Locke, John, ''Essai sur l'entendement humain'', trad. J.-M. Vienne, Paris, Vrin, 2001. * Hume, David, ''Traité de la nature humaine'', trad. P. Baranger et P. Saltel, Paris, GF-Flammarion, 1995. === Études contemporaines === * Bakker, Paul J. J. M., « Aristotelian Metaphysics and Eucharistic Theology: John Buridan and Marsilius of Inghen on the Ontological Status of Accidental Being », dans ''The Metaphysics and Natural Philosophy of John Buridan'', éd. J. M. M. H. Thijssen et J. Zupko, Leyde, Brill, 2001, p. 247-264. * Cohen, S. Marc, « Aristotle's Categories », ''Stanford Encyclopedia of Philosophy'', éd. E. N. Zalta, 2022. * Correia, Fabrice, « Essential versus accidental properties », dans ''Metaphysics: An Introduction'', éd. A. Maurin et J. T. Cumpa, London, Bloomsbury, 2024, p. 119-138. * Fine, Kit, « Essence and Modality », ''Philosophical Perspectives'', vol. 8, 1994, p. 1-16. * Gorman, Michael, « The Essential and The Accidental », ''Ratio'', vol. 18, n° 3, 2005, p. 276-289. * Lowe, E. J., ''The Four-Category Ontology: A Metaphysical Foundation for Natural Science'', Oxford, Clarendon Press, 2006. * Robertson Ishii, Teresa, « Essential vs. Accidental Properties », ''Stanford Encyclopedia of Philosophy'', éd. E. N. Zalta, 2008, révisé 2020. * Studtmann, Paul, « Aristotle's Categories », ''Stanford Encyclopedia of Philosophy'', éd. E. N. Zalta, 2021. * Williams, D. C., « On the Elements of Being », ''Review of Metaphysics'', vol. 7, 1953, p. 3-18, 171-192. [[Catégorie:Métaphysique]] [[Catégorie:Logique]] [[Catégorie:Philosophie médiévale]] [[Catégorie:Aristote]] [[Catégorie:Scolastique]] {{Autocat}} k8u4iq08yq94exxxt25qr2e7ikpkhka Dictionnaire de philosophie/Abstraction 0 83013 767973 764755 2026-06-18T04:51:00Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 767973 wikitext text/x-wiki {{DicoPhilo|Abstraction|lecture=oui}} == Définition et problématique générale == L''''abstraction''' désigne à la fois un processus mental et son résultat : l'opération par laquelle l'esprit isole certaines caractéristiques d'un objet ou d'une pluralité d'objets en négligeant les autres, et le concept général ainsi obtenu. Cette notion occupe une place centrale dans toute théorie de la connaissance depuis l'Antiquité, car elle pose la question fondamentale des rapports entre le particulier et l'[[Philosophie/Repères|universel]], entre l'expérience sensible et la pensée conceptuelle.<ref>Armstrong, David M., ''Universals. An Opinionated Introduction'', Boulder, Westview Press, 1989, p. 1-15.</ref> Le terme vient du latin ''abstractio'', dérivé du verbe ''abstrahere'' (« tirer de », « séparer »), qui traduit le grec ''aphairesis''. Cette étymologie révèle la dimension essentielle du processus : il s'agit d'extraire quelque chose d'un ensemble plus vaste, de faire un prélèvement sur la richesse du donné pour ne retenir que certains aspects.<ref>Klima, Gyula, "The Medieval Problem of Universals", ''Stanford Encyclopedia of Philosophy'', 2008 (version en ligne).</ref> L'abstraction apparaît ainsi comme un mouvement de simplification qui écarte volontairement certaines particularités pour saisir ce qui est commun à plusieurs objets ou situations. Cette capacité d'abstraction constitue l'un des traits distinctifs de la cognition humaine. Elle permet de former des concepts généraux à partir d'expériences singulières, de classer les objets en catégories, de formuler des lois scientifiques et de développer des raisonnements mathématiques.<ref>Martínez, Sergio F. et Huang, Xiang, "Epistemic Groundings of Abstraction and Their Cognitive Dimension", ''Philosophy of Science'', vol. 78, n° 3, 2011, p. 490-511.</ref> Sans elle, toute pensée serait enfermée dans l'immédiateté du particulier et ne pourrait s'élever vers la compréhension des structures et des régularités qui organisent le réel. Pourtant, l'abstraction soulève des difficultés philosophiques considérables. Comment ce qui est général peut-il exister, alors que seuls les objets [[Dictionnaire de philosophie/Individu|individuels]] semblent avoir une réalité concrète ? Les concepts abstraits correspondent-ils à quelque chose dans le monde, ou ne sont-ils que des constructions mentales ? Le processus d'abstraction nous éloigne-t-il de la [[Dictionnaire de philosophie/Vérité|vérité]] en nous faisant perdre la richesse du concret, ou nous en rapproche-t-il en nous permettant de saisir l'essentiel ? Avant d'entrer dans l'histoire de la notion, il importe de distinguer plusieurs sens de l'abstraction qui, bien que liés, relèvent de problèmes hétérogènes et ne peuvent être confondus sans dommage. Premièrement, l'abstraction désigne une opération psychologique de généralisation par laquelle l'esprit dégage, à partir d'expériences particulières, des représentations communes à plusieurs objets : c'est le sens qu'explorent principalement la tradition [[Dictionnaire de philosophie/Empirisme|empiriste]], de Locke à Hume, et la psychologie cognitive contemporaine. Deuxièmement, elle renvoie à une question ontologique portant sur le statut des universaux (genres, espèces, propriétés) et, plus largement, des « objets abstraits » (nombres, ensembles, propositions) dont la réalité fait l'objet de controverses entre réalistes, conceptualistes et nominalistes. Troisièmement, elle peut désigner une condition transcendantale ou eidétique de la connaissance : chez Kant, les formes pures ne sont pas abstraites du sensible mais le structurent [[Dictionnaire de philosophie/A priori|a priori]] ; chez Husserl, l'intuition eidétique suppose une variation imaginative libre qui ne se réduit pas à l'omission de traits particuliers au sens lockéen. Quatrièmement, comme le montrera Marx, l'abstraction peut être saisie comme forme sociale historiquement déterminée, produite par les rapports marchands avant même toute réflexion philosophique.<ref>Pour cette cartographie des sens de l'abstraction, voir Rosen, Gideon, "Abstract Objects", ''Stanford Encyclopedia of Philosophy'', 2020 (version en ligne) ; Horsten, Leon et Leitgeb, Hannes, "How Abstraction Works", ''Philosophia Mathematica'', vol. 17, n° 3, 2009, p. 334-358.</ref> Ces quatre registres mobilisent des méthodes différentes (psychologie, ontologie, philosophie transcendantale, critique sociale) ; les confondre revient à traiter comme un seul problème ce qui engage en réalité des champs conceptuels distincts. La suite de cet article s'efforce de les articuler sans les confondre. == Histoire philosophique de la notion == === Antiquité : Platon et Aristote === La réflexion sur l'abstraction prend naissance avec la philosophie grecque, qui affronte pour la première fois le problème des universaux de manière systématique. Platon (428-348 av. J.-C.) développe sa théorie des [[Pour lire Platon/Vocabulaire|Formes]] (ou Idées) pour expliquer comment il peut exister une connaissance stable et universelle alors que le monde sensible est en perpétuel changement.<ref>Platon, ''République'', Livre VI-VII, trad. fr. G. Leroux, Paris, Flammarion, 2002.</ref> Les Formes platoniciennes sont des réalités transcendantes, éternelles et immuables qui existent dans un monde intelligible séparé du monde sensible. La Forme du Beau, par exemple, existe indépendamment de tous les objets beaux particuliers et constitue leur cause formelle : c'est parce qu'ils participent à cette Forme que les objets sensibles peuvent être dits beaux. Dans cette perspective, l'abstraction n'est pas une construction de l'esprit mais une réminiscence : connaître, c'est se souvenir des Formes que l'[[Dictionnaire de philosophie/Âme|âme]] a contemplées avant sa chute dans le corps.<ref>Platon, ''Phédon'', 72e-76e, trad. fr. M. Dixsaut, Paris, Flammarion, 1991, p. 221-235.</ref> Le processus de connaissance consiste à s'élever du sensible vers l'intelligible, du particulier changeant vers l'universel éternel. Cette ascension dialectique, décrite notamment dans l'allégorie de la caverne, constitue le mouvement même de la philosophie. Aristote (384-322 av. J.-C.), élève de Platon, rejette la séparation platonicienne entre le monde sensible et le monde des Formes.<ref>Aristote, ''Métaphysique'', Livre I, 9, 990b-991b, trad. fr. M.-P. Duminil et A. Jaulin, Paris, Flammarion, 2008, p. 83-87.</ref> Pour lui, les universaux n'existent pas indépendamment des particuliers : ils existent ''dans'' les choses individuelles comme leur forme substantielle. La forme d'un cheval n'existe pas séparément dans un monde intelligible, mais seulement actualisée dans les chevaux individuels. Cette théorie hylémorphique (de ''hylè'', matière, et ''morphè'', forme) affirme que toute substance est composée d'une matière et d'une forme indissociables dans l'existence concrète. L'abstraction devient chez Aristote un processus mental authentique : c'est l'intellect agent (''nous poiètikos'') qui extrait la forme intelligible des données sensibles fournies par la phantasia.<ref>Aristote, ''De l'âme'', III, 4-5, 429a-430a, trad. fr. R. Bodéüs, Paris, Flammarion, 1993, p. 217-222.</ref> Ce processus ne crée pas artificiellement l'universel, mais le dégage de la gangue du particulier où il est immanent. L'abstraction aristotélicienne procède par négation progressive des conditions matérielles : on peut abstraire la forme géométrique d'un objet en faisant abstraction de sa couleur, de sa texture, de son poids, pour ne retenir que sa configuration spatiale. Cette divergence entre Platon et Aristote inaugure un débat qui traversera toute l'histoire de la philosophie : les universaux existent-ils avant les choses (''ante res''), dans les choses (''in rebus''), ou seulement après les choses, comme produits de l'esprit (''post res'') ? === Scolastique médiévale : le problème des universaux === La philosophie médiévale hérite de cette question à travers Boèce (c. 480-524), qui transmet au Moyen Âge latin le problème formulé par Porphyre dans l'Isagoge : les genres et les espèces subsistent-ils réellement ou seulement dans la pensée ? S'ils subsistent réellement, sont-ils corporels ou incorporels ? Sont-ils séparés des choses sensibles ou existent-ils en elles ?<ref>Porphyre, ''Isagoge'', trad. fr. A. de Libera et A.-P. Segonds, Paris, Vrin, 1998, p. 1-3.</ref> Thomas d'Aquin (1225-1274) développe une solution qui synthétise l'aristotélisme et la théologie chrétienne.<ref>Thomas d'Aquin, ''Somme théologique'', Ia, q. 84-85, trad. fr. A.-M. Roguet, Paris, Cerf, 1984, vol. I, p. 714-772.</ref> Pour lui, l'universel possède un triple statut. D'abord, la nature commune (''natura communis'') existe dans les choses individuelles : l'humanité existe réellement dans Socrate et dans Platon, mais sans y être universelle, elle n'y est présente qu'individualisée. Ensuite, cette même nature existe dans l'intellect humain comme concept universel, après avoir été abstraite par l'intellect agent à partir des images sensibles (''phantasmata''). Enfin, les natures existent aussi dans l'intellect divin comme modèles exemplaires de la création. Le processus d'abstraction thomiste comporte plusieurs degrés. L'abstraction ''totale'' permet de former les concepts de genres et d'espèces en considérant l'essence commune indépendamment des [[Dictionnaire de philosophie/Individu|individus]]. L'abstraction ''formelle'' permet de saisir la forme sans la matière sensible, donnant accès aux objets mathématiques.<ref>Thomas d'Aquin, ''De ente et essentia'', chap. 3, in ''L'Être et l'essence'', trad. fr. C. Capelle, Paris, Vrin, 1985, p. 38-45.</ref> Mais Thomas insiste sur le fait que, bien que l'intellect puisse considérer séparément ce qui n'existe pas séparément dans la réalité, cette séparation mentale n'est pas une falsification mais une condition de la connaissance intellectuelle. Guillaume d'Ockham (c. 1287-1347) rompt avec ce réalisme modéré en affirmant que seuls les individus existent réellement : il n'y a rien de commun dans la réalité entre Socrate et Platon si ce n'est qu'ils peuvent être désignés par le même terme « homme ».<ref>Guillaume d'Ockham, ''Summa logicae'', I, 14-17, dans ''Philosophical Writings'', éd. et trad. P. Boehner, Indianapolis, Hackett, 1990, p. 32-41.</ref> Les universaux ne sont que des signes mentaux (''termini'') ou vocaux qui, par convention, se réfèrent à plusieurs individus. Cette position nominaliste, qui refuse toute réalité extramentale aux universaux, aura des conséquences considérables pour l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] moderne. === Empirisme moderne : de Locke à Hume === John Locke (1632-1704) renouvelle la théorie de l'abstraction dans le cadre de son [[Dictionnaire de philosophie/Empirisme|empirisme]]. Dans l{{'}}''Essai sur l'entendement humain'' (1690), il affirme que l'esprit est initialement une ''tabula rasa'', une page blanche sur laquelle l'expérience vient inscrire toutes nos idées.<ref>Locke, John, ''Essai sur l'entendement humain'', II, 1, §2, trad. fr. J.-M. Vienne, Paris, Vrin, 2001, p. 105.</ref> Les idées simples proviennent directement de la sensation ou de la réflexion, tandis que les idées complexes sont construites par l'esprit à partir des idées simples. L'abstraction lockéenne consiste à séparer mentalement certaines idées qui accompagnent un objet pour ne retenir que celles qui sont communes à plusieurs objets. Ainsi, pour former l'idée générale de « blanc », l'esprit observe cette couleur dans la craie ou la neige, la considère isolément en faisant abstraction du lieu, du moment et des autres qualités, et lui donne le nom de « blancheur » qui peut alors s'appliquer à tous les objets partageant cette apparence.<ref>Locke, John, ''Essai sur l'entendement humain'', III, 3, §6-9, op. cit., p. 393-396.</ref> Les idées abstraites sont donc formées par omission des particularités et conservation des ressemblances. George Berkeley (1685-1753) soumet cette théorie à une critique serrée dans le ''Traité des principes de la connaissance humaine'' (1710).<ref>Berkeley, George, ''Traité des principes de la connaissance humaine'', Introduction, §10-15, trad. fr. D. Berlioz, Paris, Flammarion, 1991, p. 63-69.</ref> Il argue qu'il est impossible de former l'idée abstraite générale d'un triangle qui ne serait ni scalène, ni isocèle, ni équilatéral, ni grand, ni petit, mais tous ces triangles à la fois. Une telle idée serait contradictoire. Berkeley conclut que les soi-disant idées abstraites de Locke sont psychologiquement impossibles : nous ne pouvons concevoir que des idées particulières, même si nous pouvons utiliser ces idées particulières de manière générale en ne prêtant attention qu'à certains de leurs aspects. Cette critique révèle une tension interne à l'empirisme : si toute connaissance provient de l'expérience sensible, qui ne nous donne que du particulier, comment peut-on former des concepts généraux authentiquement universels ? Le nominalisme de Berkeley résout le problème en niant qu'il existe véritablement des idées générales : il n'y a que des mots généraux appliqués à des idées toujours particulières. David Hume (1711-1776) prolonge la critique berkeleyenne des idées abstraites tout en déplaçant son centre de gravité. Dans le ''Traité de la nature humaine'' (1739-1740), il souscrit explicitement à la thèse selon laquelle « toutes les idées générales ne sont rien que des idées particulières, attachées à un certain terme qui leur donne une signification plus étendue, et qui les fait rappeler à l'occasion d'autres idées individuelles qui leur ressemblent ».<ref>Hume, David, ''Traité de la nature humaine. Livre I : De l'entendement'', Partie I, Section VII, trad. fr. P. Baranger et P. Saltel, Paris, GF-Flammarion, 1995, p. 73.</ref> Ce que nous prenons pour une idée abstraite est en réalité une idée particulière accompagnée d'une disposition à évoquer d'autres idées qui lui ressemblent. Hume rejoint ainsi le nominalisme berkeleyen, mais il l'adosse à une analyse psychologique plus développée des mécanismes par lesquels l'esprit manipule les représentations générales. La nouveauté humienne tient dans le rôle attribué à l'association des idées. Pour Hume, l'esprit ne saisit pas une essence commune par inspection directe : il forme des regroupements sous l'effet de trois principes associatifs, la ressemblance, la contiguïté dans l'espace ou le temps, et la causalité, qui agissent comme des habitudes mentales acquises par la répétition des expériences.<ref>Hume, David, ''Traité de la nature humaine'', Livre I, Partie I, Section IV, op. cit., p. 60-63.</ref> Un terme général comme « homme » ne renvoie donc pas à une essence universelle préexistante, mais déclenche un faisceau variable d'idées particulières selon le contexte d'énonciation et les habitudes acquises par le locuteur. L'habitude, et non l'intellection d'un universel, constitue le ressort effectif de la généralité. Cette analyse naturalise l'abstraction : elle la rabat sur des mécanismes cognitifs descriptibles empiriquement, sans faire appel à une faculté spéciale d'intellection des universaux. Dans l{{'}}''Enquête sur l'entendement humain'' (1748), Hume accentue cette réduction en insistant sur l'origine expérientielle de toutes nos idées et sur le caractère conventionnel des dénominations générales.<ref>Hume, David, ''Enquête sur l'entendement humain'', Section II, trad. fr. A. Leroy revue par M. Beyssade, Paris, GF-Flammarion, 2008, p. 70-76.</ref> Le même mouvement explique, pour Hume, l'idée de cause : elle n'est pas saisie dans l'expérience mais produite par l'habitude née de la conjonction constante de deux événements. La théorie humienne de l'abstraction est ainsi solidaire d'une théorie générale de la connaissance où les régularités mentales remplacent les nécessités logiques ou essentielles. L'héritage humien se déploie dans plusieurs directions. La psychologie associationniste du XIXe siècle (James Mill, Alexander Bain) développera cette analyse des idées générales comme sédimentations d'associations. Kant, dans la préface de la seconde édition de la ''Critique de la raison pure'', reconnaît avoir été « réveillé de son sommeil dogmatique » par Hume ; mais il inverse la démarche humienne en soutenant que les catégories ne peuvent être ramenées à des habitudes associatives sans rendre inintelligible la nécessité des lois scientifiques.<ref>Kant, Emmanuel, ''Prolégomènes à toute métaphysique future qui pourra se présenter comme science'', Préface, trad. fr. L. Guillermit, Paris, Vrin, 2001, p. 13-15.</ref> Le différend n'est pas anecdotique : il oppose deux conceptions inconciliables de l'abstraction, l'une qui la réduit à la psychologie de l'habitude, l'autre qui cherche au contraire les conditions [[Dictionnaire de philosophie/A priori|a priori]] qui rendent toute habitude elle-même possible. Ce débat traversera, sous des formes renouvelées, tout le XIXe et le XXe siècle. === Rationalisme : Descartes et le refus de l'abstractionnisme === René Descartes (1596-1650) n'aborde pas frontalement la question de l'abstraction sous ce nom, mais sa théorie des idées innées constitue une contestation implicite du modèle abstractionniste. Si les idées les plus importantes, celle de Dieu, celles de l'étendue, de la pensée, des vérités mathématiques, ne sont pas formées par extraction à partir de l'expérience sensible mais sont trouvées dans l'entendement, alors l'abstraction cesse d'être la source privilégiée de la connaissance : elle en devient au mieux un cas dérivé et subordonné.<ref>Descartes, René, ''Méditations métaphysiques'', III, AT VII, p. 37-52, in ''Œuvres de Descartes'', éd. C. Adam et P. Tannery, Paris, Vrin, 1996, vol. VII.</ref> Dans les ''Méditations métaphysiques'' (1641), Descartes distingue trois types d'idées : les idées adventices (qui semblent venir du dehors), les idées factices (que l'esprit construit), et les idées innées (qui appartiennent originellement à la nature de l'esprit). L'idée de Dieu est innée, car aucune expérience finie ne peut être la cause adéquate d'une représentation de l'infini. Les idées mathématiques le sont également : elles ne dérivent pas de l'abstraction à partir de figures sensibles mais sont saisies par l'intellect pur.<ref>Descartes, René, ''Méditations métaphysiques'', V, AT VII, p. 63-71, op. cit.</ref> L'exemple cartésien du chiliogone (figure à mille côtés) dans la Sixième Méditation est éloquent sur ce point : je conçois clairement cette figure et puis en démontrer rigoureusement les propriétés, alors même que je ne puis en former aucune image particulière distincte de celle d'un myriagone ou d'un polygone quelconque à grand nombre de côtés.<ref>Descartes, René, ''Méditations métaphysiques'', VI, AT VII, p. 72-73, op. cit.</ref> La conception intellectuelle ne repose donc pas sur la capacité à former une représentation imageante à partir d'instances sensibles : l'ordre de l'intellection et celui de l'imagination se séparent. Cette position ne supprime pas toute place pour l'abstraction chez Descartes. La distinction entre une substance et ses [[Dictionnaire de philosophie/Attribut|attributs]], ou entre l'étendue et telle figure particulière qui la modifie, repose sur une opération que l'on peut qualifier d'abstractive : la ''distinction de raison'' des ''Principes de la philosophie'' (1644) sépare mentalement ce qui ne peut exister séparément.<ref>Descartes, René, ''Principes de la philosophie'', I, §§53-54, trad. fr. D. Moreau, Paris, Vrin, 2009, p. 96-98.</ref> Mais cette opération secondaire présuppose l'intuition préalable de natures simples, claires et distinctes. L'ordre cartésien inverse donc l'ordre empiriste : ce ne sont pas les abstractions qui fondent la connaissance des essences, ce sont les essences intellectuellement saisies qui permettent, en aval, des abstractions contrôlées. Cette inversion annonce le geste kantien consistant à chercher dans l'entendement lui-même les conditions formelles de toute abstraction empirique, quoiqu'avec des présupposés métaphysiques très différents, puisque Kant rejettera la théologie cartésienne de l'innéité au profit d'une analyse transcendantale des structures a priori. === Kant : abstraction et catégories a priori === Emmanuel Kant (1724-1804) opère une synthèse entre empirisme et rationalisme en distinguant la forme et la matière de la connaissance.<ref>Kant, Emmanuel, ''Critique de la raison pure'', « Esthétique transcendantale » et « Analytique transcendantale », trad. fr. A. Tremesaygues et B. Pacaud, Paris, PUF, 2012 [1781/1787], p. 53-223.</ref> Dans la ''Critique de la raison pure'' (1781, 1787), il montre que l'expérience n'est possible que si l'esprit impose ses formes [[Dictionnaire de philosophie/A priori|a priori]] (l'espace, le temps, les catégories) à la matière sensible fournie par l'intuition. Les catégories kantiennes, quantité, qualité, relation, modalité, ne sont pas abstraites de l'expérience mais constituent les conditions transcendantales de possibilité de toute expérience.<ref>Kant, Emmanuel, ''Critique de la raison pure'', « Analytique des concepts », §10-13, op. cit., p. 105-119.</ref> Elles appartiennent à la structure même de l'entendement et s'appliquent nécessairement à tous les phénomènes. La déduction transcendantale démontre que les objets doivent se conformer aux catégories pour pouvoir être objets d'expérience. Ce renversement copernicien transforme le statut de l'abstraction. Les concepts empiriques peuvent certes être formés par abstraction à partir de l'expérience : je peux former le concept de « chien » en comparant différents chiens, en réfléchissant sur leurs points communs et en faisant abstraction de leurs différences. Mais les concepts purs de l'entendement (les catégories) ne proviennent pas de cette abstraction empirique : ils sont les formes mêmes selon lesquelles l'entendement structure l'expérience. Kant distingue ainsi l'abstraction comme processus de formation des concepts empiriques de l'analyse transcendantale qui dévoile les structures a priori de la connaissance. Cette distinction pèsera durablement sur la philosophie ultérieure, même si ses interprétations ont divergé : les idéalistes allemands y verront l'amorce d'une histoire de la raison, les néokantiens (Cohen, Cassirer) une doctrine des formes symboliques, tandis que les lectures analytiques contemporaines (Sellars, Brandom) en réinvestiront le noyau normatif pour critiquer le « mythe du donné ».<ref>Sellars, Wilfrid, "Empiricism and the Philosophy of Mind", in ''Science, Perception and Reality'', Atascadero, Ridgeview, 1963, p. 127-196 ; Cassirer, Ernst, ''La Philosophie des formes symboliques'', trad. fr. O. Hansen-Løve et J. Lacoste, Paris, Minuit, 1972, 3 vol.</ref> Ce partage entre concepts empiriques et concepts purs continue de structurer les débats contemporains sur la possibilité d'une théorie générale de l'abstraction. === Hegel : dialectique du concret et de l'abstrait === Georg Wilhelm Friedrich Hegel (1770-1831) bouleverse la conception traditionnelle de l'abstraction en montrant que le [[Philosophie/Repères|concret]] authentique n'est pas le donné immédiat mais le résultat d'un processus de médiation.<ref>Hegel, Georg Wilhelm Friedrich, ''Science de la logique'', Livre I, « La doctrine de l'être », trad. fr. P.-J. Labarrière et G. Jarczyk, Paris, Aubier, 1972, p. 53-78.</ref> Dans la ''Science de la logique'' (1812-1816) et l{{'}}''Encyclopédie des sciences philosophiques'' (1817-1827), Hegel critique l'entendement abstrait (''Verstand'') qui isole et fige les déterminations, et lui oppose la raison dialectique (''Vernunft'') qui saisit le mouvement vivant des concepts. Pour Hegel, l'abstrait n'est pas le général opposé au particulier, mais l'unilatéral opposé au concret. Est abstrait ce qui est séparé de ses conditions, de ses relations, de son devenir historique.<ref>Hegel, Georg Wilhelm Friedrich, ''Encyclopédie des sciences philosophiques'', I, « La Science de la Logique », §82, Add., trad. fr. B. Bourgeois, Paris, Vrin, 1970, p. 343-345.</ref> Ainsi, l'être pur dont part la Logique est la catégorie la plus abstraite parce qu'elle est la plus indéterminée, la plus pauvre en contenu. Le concret, au contraire, est « l'unité du divers », la synthèse de multiples déterminations. Cette inversion a des conséquences épistémologiques majeures. La connaissance ne procède pas du concret vers l'abstrait en appauvrissant progressivement le réel, mais de l'abstrait vers le concret en enrichissant la pensée par l'intégration dialectique de déterminations toujours plus nombreuses. Le concept hégélien (''Begriff'') n'est pas une représentation générale obtenue par abstraction, mais la structure rationnelle immanente à la chose même, saisie dans son automouvement. Dans ses écrits critiques, Hegel dénonce l'« abstraction » au sens péjoratif : la pensée qui s'en tient aux oppositions rigides et aux identités figées au lieu de comprendre les contradictions vivantes et les transitions dialectiques. Dans son célèbre texte « Qui pense abstraitement ? » (1807), il montre ironiquement que c'est la pensée commune qui pense abstraitement en réduisant un meurtrier à son crime, tandis que la pensée philosophique pense concrètement en le comprenant dans la totalité de ses déterminations sociales et historiques.<ref>Hegel, Georg Wilhelm Friedrich, « Qui pense abstraitement ? », in ''Écrits sur la critique'', trad. fr. M. Jacob, Paris, Aubier-Montaigne, 1978, p. 113-121.</ref> === Marx : critique de l'abstraction capitaliste === [[Dictionnaire de philosophie/Karl Marx|Karl Marx]] (1818-1883) hérite de la dialectique hégélienne mais la transforme en la plaçant sur ses bases matérielles. Dans les ''Grundrisse'' (1857-1858) et le ''Capital'' (1867), il développe une méthode qui part des abstractions les plus simples pour reconstituer le concret comme « synthèse de multiples déterminations ».<ref>Marx, Karl, ''Grundrisse. Fondements de la critique de l'économie politique'', « Introduction de 1857 », trad. fr. J.-P. Lefebvre, Paris, Éditions sociales, 2011, p. 34-42.</ref> La section « La méthode de l'économie politique » des Grundrisse expose cette démarche. Les économistes du XVIIe siècle commençaient par la population, la nation, l'État, totalités concrètes mais confuses. L'analyse économique classique a produit des concepts abstraits : division du travail, monnaie, valeur. Ces abstractions ne sont pas de simples constructions mentales mais correspondent à des réalités sociales historiquement déterminées. Marx distingue soigneusement deux mouvements. Le premier va du concret chaotique (la représentation d'ensemble) aux déterminations abstraites simples par analyse. Le second reconstruit le concret par synthèse des déterminations abstraites : « Le concret est concret parce qu'il est la synthèse de multiples déterminations, donc unité du divers ».<ref>Marx, Karl, ''Grundrisse'', op. cit., p. 38.</ref> Cette méthode d'ascension de l'abstrait au concret est la seule scientifiquement correcte parce qu'elle reproduit dans la pensée le processus réel de constitution de l'objet. Mais Marx apporte une dimension critique essentielle. L'abstraction n'est pas seulement un procédé méthodologique : elle est inscrite dans la réalité sociale elle-même. Le capitalisme produit des abstractions réelles. La valeur d'échange abstrait de la diversité concrète des valeurs d'usage : toutes les marchandises deviennent commensurables en tant qu'incarnations de travail abstrait.<ref>Marx, Karl, ''Le Capital. Critique de l'économie politique, Livre I'', section I, chapitre 1, trad. fr. J.-P. Lefebvre, Paris, PUF, 1993, p. 39-93.</ref> La monnaie est l'abstraction par excellence, l'équivalent général qui efface toutes les différences qualitatives. Cette abstraction sociale réelle engendre ce que Marx nomme le « fétichisme de la marchandise » : les rapports sociaux entre personnes prennent la forme de rapports entre choses.<ref>Marx, Karl, ''Le Capital'', Livre I, section I, chapitre 1, §4, op. cit., p. 82-93.</ref> Les travailleurs ne se rapportent plus les uns aux autres directement mais à travers les marchandises qu'ils échangent. Cette inversion, où les abstractions (valeur, capital, argent) semblent dotées d'une vie propre tandis que les relations humaines concrètes disparaissent, constitue l'[[Philosophie/Aliénation|aliénation]] fondamentale de la société capitaliste. L'analyse marxienne révèle ainsi que l'abstraction n'est pas un simple outil cognitif neutre mais un processus historiquement situé qui structure les formes de vie sociale. La critique de l'économie politique devient critique des abstractions réelles produites par le mode de production capitaliste. === Phénoménologie : Husserl et l'intuition eidétique === Edmund Husserl (1859-1938) renouvelle la question en opérant une distinction explicite entre deux opérations que la tradition avait souvent confondues. Dans les ''Recherches logiques'' (1900-1901) et ''Idées directrices pour une phénoménologie'' (1913), il oppose l'abstraction au sens classique, l'isolement d'un « moment non-indépendant » d'un tout concret, comme lorsqu'on abstrait la couleur d'une surface étendue dont elle est inséparable, à l'idéation ou ''intuition eidétique'' (''Wesensschau''), saisie directe d'une essence (''Eidos'') qui ne se confond pas avec la généralisation empirique.<ref>Husserl, Edmund, ''Recherches logiques'', tome 2, Recherche II, §§1-10, trad. fr. H. Élie, A. L. Kelkel et R. Schérer, Paris, PUF, 1961, p. 117-144.</ref> La différence méthodologique est essentielle et doit être soulignée contre toute lecture qui assimilerait la phénoménologie à un raffinement de l'abstraction lockéenne. L'abstraction empiriste, telle que l'entendent Locke ou Hume, procède par comparaison inductive entre plusieurs cas particuliers réellement observés ; elle suppose une pluralité d'expériences effectives et aboutit à une représentation générale qui subsume les ressemblances remarquées. L'intuition eidétique husserlienne, au contraire, peut partir d'un unique exemple, réel ou seulement imaginé, et procède par ''variation imaginative libre'' (''freie Variation''). En faisant varier mentalement tous les traits possibles de l'objet considéré, le phénoménologue cherche à identifier ce qui ne peut être supprimé sans que l'objet cesse d'être ce qu'il est : on saisit ainsi son essence comme ''structure d'invariance modale'', comme ce qui doit nécessairement se maintenir pour qu'un tel type d'objet soit possible.<ref>Husserl, Edmund, ''Expérience et jugement. Recherches en vue d'une généalogie de la logique'', §§87-93, trad. fr. D. Souche-Dagues, Paris, PUF, 1970, p. 409-436.</ref> Ce procédé n'est donc pas une simple omission de traits particuliers au sens lockéen. Pour saisir l'essence du triangle, on n'additionne pas des caractères communs observés empiriquement ; on explore la variation libre des triangles possibles, équilatéraux, isocèles, scalènes, aussi déformés que l'on voudra, pour voir ce qui demeure nécessairement là pour que l'on ait encore affaire à un triangle. La faillibilité de l'abstraction empirique, toujours vulnérable au contre-exemple non encore rencontré, cède la place à une saisie des structures modales de l'objet, réputée porter sur des nécessités eidétiques.<ref>Husserl, Edmund, ''Idées directrices pour une phénoménologie et une philosophie phénoménologique pures. Livre premier'', §§4, 69-70, trad. fr. P. Ricœur, Paris, Gallimard, 1950, p. 22-26, 228-236.</ref> Les essences husserliennes ne sont dès lors ni des universaux platoniciens séparés dans un monde intelligible, ni de simples concepts psychologiques, ni de pures abréviations nominalistes. Elles sont des structures idéales appréhendées dans l'acte même de connaissance, corrélats noématiques d'un type particulier d'intentionnalité. La ''réduction eidétique'', distincte de la réduction transcendantale, met entre parenthèses (''epoché'') l'existence factuelle de l'objet pour se concentrer sur son essence pure. Elle permet de constituer des sciences eidétiques a priori qui fondent les sciences empiriques : la géométrie pure fonde la physique géométrique, l'ontologie formelle fonde toute théorie déductive. La prétention phénoménologique à livrer des nécessités essentielles par la variation imaginative a toutefois été contestée. Theodor Adorno, dans sa ''Métacritique de la théorie de la connaissance'' (1956), soutient que la libre variation suppose toujours un horizon de variantes historiquement et culturellement circonscrit, et que l'« essence » ainsi obtenue peut n'être que la cristallisation des préjugés de celui qui varie.<ref>Adorno, Theodor W., ''Sur la métacritique de la théorie de la connaissance. Études sur Husserl et les antinomies phénoménologiques'', trad. fr. C. David, Paris, Payot, 1976, p. 190-225.</ref> Des objections analogues ont été formulées, depuis des perspectives pourtant très différentes, par les tenants d'une philosophie naturaliste de l'esprit, pour qui aucune intuition, fût-elle eidétique, n'est à l'abri de déterminations empiriques et conceptuelles préalables. Ces critiques n'invalident pas la distinction husserlienne entre abstraction empiriste et intuition eidétique, mais elles interrogent la portée ontologique des essences ainsi obtenues. == Théories contemporaines == === Frege et les principes d'abstraction === Gottlob Frege (1848-1925) introduit une approche logique rigoureuse de l'abstraction dans les ''Fondements de l'arithmétique'' (1884) et les ''Lois fondamentales de l'arithmétique'' (1893-1903).<ref>Frege, Gottlob, ''Les Fondements de l'arithmétique'', §§62-69, trad. fr. C. Imbert, Paris, Seuil, 1969, p. 179-198.</ref> Frege formule des principes d'abstraction de la forme : « l'abstrait de a = l'abstrait de b si et seulement si a et b sont dans la relation R », où R est une relation d'équivalence. Le principe qu'il baptise d'après Hume, par exemple, énonce que « le nombre des F = le nombre des G si et seulement si les F et les G peuvent être mis en correspondance bi-univoque ».<ref>Frege, Gottlob, ''Les Fondements de l'arithmétique'', §63, op. cit., p. 180-182.</ref> Ce principe définit implicitement les nombres cardinaux en spécifiant leurs conditions d'identité à partir d'une relation (l'équinumérosité) qui ne les présuppose pas. L'intérêt philosophique de cette approche est qu'elle permet d'introduire des objets abstraits (les nombres) non comme des entités mystérieuses préexistantes mais comme corrélats d'une opération logique sur des concepts. L'abstraction frégéenne transforme ainsi une relation d'équivalence entre concepts en une relation d'identité entre objets, en quoi elle fournit une réponse nouvelle au problème empiriste : les objets abstraits n'ont pas à être extraits du sensible, ils sont introduits par leurs conditions d'identité logiques. Frege lui-même rencontre cependant une difficulté interne, désignée depuis dans la littérature comme le « problème de César » (''Caesar problem''). Le principe d'abstraction fixe les conditions d'identité entre deux nombres, mais ne détermine pas celles qui permettraient de trancher une identité mixte comme « Jules César est-il ou non identique au nombre 7 ? ».<ref>Frege, Gottlob, ''Les Fondements de l'arithmétique'', §§56, 66, op. cit., p. 164-166, 190-192.</ref> Frege juge cette lacune rédhibitoire : si la définition implicite laisse une question d'identité indéterminée, elle ne suffit pas à fixer la référence des termes en cause. C'est l'une des raisons pour lesquelles il rejette le principe de Hume comme définition autosuffisante et entreprend, dans les ''Lois fondamentales'', de remplacer les principes d'abstraction par des définitions explicites des nombres comme extensions de concepts. Le système ainsi obtenu s'avère pourtant inconsistant. La Loi fondamentale V, qui associe à chaque concept son extension et généralise de la sorte les principes d'abstraction, conduit à la contradiction mise en évidence par Bertrand Russell en 1902 : l'extension du concept « ensemble qui ne se contient pas lui-même » engendre un paradoxe logique.<ref>Russell, Bertrand, lettre à Frege du 16 juin 1902, in Jean van Heijenoort (dir.), ''From Frege to Gödel. A Source Book in Mathematical Logic, 1879-1931'', Cambridge, Harvard University Press, 1967, p. 124-125.</ref> L'échec de la Loi V met en lumière un problème général : tous les principes d'abstraction ne se valent pas, et certains, apparemment naturels, engendrent des contradictions logiques. Le néo-logicisme contemporain, développé notamment par Crispin Wright et Bob Hale depuis les années 1980, reprend le programme frégéen en cherchant des principes d'abstraction à la fois consistants et suffisamment puissants pour fonder les mathématiques.<ref>Wright, Crispin, ''Frege's Conception of Numbers as Objects'', Aberdeen, Aberdeen University Press, 1983, p. 106-180.</ref> L'observation-clé du programme est que le principe de Hume, contrairement à la Loi V, s'avère consistant relativement à l'arithmétique classique et permet de dériver l'arithmétique du second ordre (axiomes de Dedekind-Peano) à partir de la seule logique du second ordre augmentée de ce principe : c'est ce que la littérature appelle le « théorème de Frege », redécouvert par George Boolos.<ref>Boolos, George, "The Consistency of Frege's ''Foundations of Arithmetic''", in ''Logic, Logic, and Logic'', Cambridge, Harvard University Press, 1998, p. 183-201 ; Hale, Bob et Wright, Crispin, ''The Reason's Proper Study. Essays towards a Neo-Fregean Philosophy of Mathematics'', Oxford, Clarendon Press, 2001, p. 1-39.</ref> Le néo-logicisme affronte cependant deux difficultés structurelles qui alimentent des débats analytiques nourris et n'ont pas reçu de solution consensuelle. La première, dite ''bad company problem'' (« problème de la mauvaise compagnie »), peut se formuler ainsi : si la Loi V est inconsistante alors que le principe de Hume est consistant, comment justifier l'acceptation du second et le rejet de la première sur des bases non arbitraires ?<ref>Linnebo, Øystein, "Bad Company Tamed", ''Synthese'', vol. 170, n° 3, 2009, p. 371-391 ; Weir, Alan, "Neo-Fregeanism: An Embarrassment of Riches", ''Notre Dame Journal of Formal Logic'', vol. 44, n° 1, 2003, p. 13-48.</ref> Plusieurs principes d'abstraction peuvent être pris individuellement consistants mais se révéler collectivement incompatibles ; d'autres, comme le « principe de parité » (qui associe le même objet aux concepts dont les extensions diffèrent d'un cardinal pair), sont consistants mais paraissent intuitivement illégitimes car ils engendrent des objets sans motivation conceptuelle claire. Divers critères de légitimité ont été proposés, conservativité, stabilité, irénisme, invariance, sans qu'aucun ne fasse accord. La seconde difficulté est la réapparition du problème de César dans le cadre néo-frégéen lui-même : le principe de Hume ne détermine toujours pas si Jules César est ou non identique au nombre trois, ce qui semble indiquer que les conditions d'identité fournies par les principes d'abstraction sont insuffisantes pour fixer pleinement la référence des termes abstraits.<ref>Hale, Bob, "Grundlagen §64", in ''Philosophical Papers'', Oxford, Clarendon Press, 2001, p. 203-237 ; Rosen, Gideon, "The Refutation of Nominalism (?)", ''Philosophical Topics'', vol. 21, n° 2, 1993, p. 149-186.</ref> Ces discussions engagent la possibilité même de définir les objets abstraits par des équivalences conceptuelles. Elles prolongent la question frégéenne initiale, à quelles conditions un principe d'abstraction peut-il être légitimement posé et quelle est la nature des objets qu'il introduit ?, en montrant que la réponse logique, si séduisante soit-elle, ne dissipe pas la perplexité métaphysique qui entoure les entités abstraites. Le débat contemporain sur ces principes constitue aujourd'hui l'un des laboratoires les plus actifs de la philosophie des mathématiques, à la croisée de la logique formelle, de la métaphysique analytique et de l'épistémologie. === Débat contemporain : nominalisme contre platonisme === La philosophie contemporaine est traversée par un débat fondamental sur le statut des entités abstraites. Les nominalistes affirment que seuls les objets concrets, localisés dans l'espace et le temps, existent réellement.<ref>Field, Hartry, ''Science without Numbers'', Oxford, Blackwell, 1980, p. 1-43.</ref> Les universaux, les nombres, les ensembles, les propositions ne sont que des façons de parler, des instruments utiles mais dépourvus de réalité ontologique propre. Les arguments nominalistes font valoir le principe de parcimonie ontologique (le rasoir d'Ockham) : il ne faut pas multiplier les entités sans nécessité. Les entités abstraites posent aussi un problème épistémologique : comment pourrions-nous connaître des objets qui n'ont aucune relation causale avec nous, qui n'agissent pas dans l'espace et le temps ?<ref>Benacerraf, Paul, "Mathematical Truth", ''Journal of Philosophy'', vol. 70, n° 19, 1973, p. 661-679.</ref> Les platonistes ou réalistes répondent que les entités abstraites sont indispensables à la science et aux mathématiques. Les théories scientifiques quantifient sur des ensembles, des fonctions, des espaces abstraits. Si nous devons prendre nos meilleures théories scientifiques au sérieux, alors nous devons accepter l'existence de ce sur quoi elles quantifient (argument d'indispensabilité de Quine et Putnam).<ref>Quine, W. V. O., "On What There Is", in ''From a Logical Point of View'', Cambridge, Harvard University Press, 1953, p. 1-19.</ref> Le débat se poursuit sur plusieurs fronts. Certains nominalistes tentent de montrer qu'on peut reformuler les théories scientifiques sans référence aux entités mathématiques abstraites. D'autres, comme les fictionnalistes, admettent l'utilité des mathématiques tout en niant que les énoncés mathématiques soient littéralement vrais. Les structuralistes, de leur côté, proposent que les mathématiques ne portent pas sur des objets abstraits individuels mais sur des structures relationnelles.<ref>Shapiro, Stewart, ''Philosophy of Mathematics: Structure and Ontology'', Oxford, Oxford University Press, 1997, p. 72-104.</ref> Cette controverse touche aux fondements mêmes de notre compréhension du langage, de la [[Dictionnaire de philosophie/Vérité|vérité]] et de la réalité. Elle montre que la question de l'abstraction n'est pas un problème technique isolé mais engage toute une vision du monde. === Dimensions cognitives et épistémologiques === La psychologie cognitive et les neurosciences contemporaines ont renouvelé l'étude empirique des processus d'abstraction. Ces recherches montrent que l'abstraction n'est pas un processus unitaire mais implique différents mécanismes cognitifs : catégorisation perceptuelle, généralisation conceptuelle, représentation schématique, raisonnement analogique.<ref>Murphy, Gregory L., ''The Big Book of Concepts'', Cambridge, MIT Press, 2002, p. 11-43.</ref> Les travaux sur les concepts montrent que la formation de représentations abstraites commence très tôt dans le développement cognitif. Dès les premiers mois, les nourrissons manifestent des capacités de catégorisation qui leur permettent de regrouper des objets selon leurs propriétés communes. Ces compétences précoces suggèrent que certaines formes d'abstraction pourraient être innées ou du moins contraintes par l'architecture cognitive.<ref>Mandler, Jean M., "How to Build a Baby: II. Conceptual Primitives", ''Psychological Review'', vol. 99, n° 4, 1992, p. 587-604.</ref> D'un point de vue [[Dictionnaire de philosophie/Épistémologie|épistémologique]], les philosophes débattent du statut des concepts abstraits : sont-ils des entités mentales privées ou des structures publiques partagées ? Comment les concepts se rapportent-ils aux propriétés des objets ? Quelle est la relation entre les concepts scientifiques théoriques (comme « quark » ou « sélection naturelle ») et l'expérience ordinaire ? Certains philosophes, comme Wilfrid Sellars, défendent un nominalisme psychologique selon lequel toute conscience de similitudes, de types et de structures est médiatisée par le langage et les pratiques sociales.<ref>Sellars, Wilfrid, "Empiricism and the Philosophy of Mind", in ''Science, Perception and Reality'', Atascadero, Ridgeview, 1963, p. 127-196.</ref> Cette perspective souligne la dimension sociale et historique de la formation des concepts abstraits, rejoignant ainsi certaines intuitions de la tradition marxiste sur les abstractions réelles. == Enjeux philosophiques == L'abstraction soulève des questions qui touchent au cœur de la philosophie. Premièrement, elle interroge la nature de l'universel et son rapport au particulier. Les universaux ont-ils une existence indépendante des particuliers qui les instancient, ou ne sont-ils que des produits de l'activité classificatoire de l'esprit ? Cette question engage toute une métaphysique. Deuxièmement, l'abstraction pose le problème de la référence : comment nos concepts abstraits se rapportent-ils au monde ? Quelle garantie avons-nous que nos catégories mentales correspondent à de véritables articulations du réel et ne sont pas de simples projections anthropomorphiques ? Cette interrogation est centrale pour l'épistémologie et la philosophie des sciences. Troisièmement, comme l'a montré [[Dictionnaire de philosophie/Karl Marx|Marx]], l'abstraction n'est pas seulement une opération cognitive mais aussi un processus social et historique. Les formes d'abstraction dominantes dans une société reflètent et reproduisent les rapports sociaux de production. Ainsi, l'abstraction marchande qui réduit tous les produits du travail à des quantités de valeur échangeable correspond à la structure du mode de production capitaliste. Cette dimension sociale de l'abstraction révèle son caractère idéologique potentiel. Quatrièmement, l'abstraction soulève une question normative : quel est le bon niveau d'abstraction pour comprendre un phénomène ? Une abstraction excessive conduit à l'appauvrissement et à la perte du réel, comme le dénonce Hegel. Mais une absence d'abstraction empêche toute compréhension théorique. La science doit constamment négocier entre ces deux écueils, cherchant les abstractions fécondes qui révèlent l'essentiel tout en restant suffisamment riches pour rendre compte de la complexité du donné. Cinquièmement, l'abstraction a une dimension politique. Les catégories abstraites par lesquelles nous pensons le monde social, classe, race, genre, nation, [[Dictionnaire de philosophie/Individu|individu]], ne sont jamais neutres. Elles structurent notre perception de la réalité et orientent notre action. C'est pourquoi la critique des abstractions dominantes constitue un moment essentiel de toute pensée émancipatrice. == Notes et références == {{Références|colonnes = 2}} == Bibliographie == === Textes classiques === * Aristote, ''De l'âme'', trad. fr. R. Bodéüs, Paris, Flammarion, 1993 * Aristote, ''Métaphysique'', trad. fr. M.-P. Duminil et A. Jaulin, Paris, Flammarion, 2008 * Berkeley, George, ''Traité des principes de la connaissance humaine'', trad. fr. D. Berlioz, Paris, Flammarion, 1991 * Descartes, René, ''Méditations métaphysiques'', in ''Œuvres de Descartes'', éd. C. Adam et P. Tannery, Paris, Vrin, 1996, vol. VII * Descartes, René, ''Principes de la philosophie'', trad. fr. D. Moreau, Paris, Vrin, 2009 * Frege, Gottlob, ''Les Fondements de l'arithmétique'', trad. fr. C. Imbert, Paris, Seuil, 1969 * Guillaume d'Ockham, ''Summa logicae'', dans ''Philosophical Writings'', éd. et trad. P. Boehner, Indianapolis, Hackett, 1990 * Hegel, Georg Wilhelm Friedrich, ''Science de la logique'', trad. fr. P.-J. Labarrière et G. Jarczyk, Paris, Aubier, 1972-1981, 3 vol. * Hegel, Georg Wilhelm Friedrich, ''Encyclopédie des sciences philosophiques'', I, « La Science de la Logique », trad. fr. B. Bourgeois, Paris, Vrin, 1970 * Hegel, Georg Wilhelm Friedrich, « Qui pense abstraitement ? », in ''Écrits sur la critique'', trad. fr. M. Jacob, Paris, Aubier-Montaigne, 1978 * Hume, David, ''Traité de la nature humaine. Livre I : De l'entendement'', trad. fr. P. Baranger et P. Saltel, Paris, GF-Flammarion, 1995 * Hume, David, ''Enquête sur l'entendement humain'', trad. fr. A. Leroy revue par M. Beyssade, Paris, GF-Flammarion, 2008 * Husserl, Edmund, ''Recherches logiques'', tome 2, trad. fr. H. Élie, A. L. Kelkel et R. Schérer, Paris, PUF, 1961 * Husserl, Edmund, ''Idées directrices pour une phénoménologie et une philosophie phénoménologique pures. Livre premier'', trad. fr. P. Ricœur, Paris, Gallimard, 1950 * Husserl, Edmund, ''Expérience et jugement. Recherches en vue d'une généalogie de la logique'', trad. fr. D. Souche-Dagues, Paris, PUF, 1970 * Kant, Emmanuel, ''Critique de la raison pure'', trad. fr. A. Tremesaygues et B. Pacaud, Paris, PUF, 2012 [1781/1787] * Kant, Emmanuel, ''Prolégomènes à toute métaphysique future qui pourra se présenter comme science'', trad. fr. L. Guillermit, Paris, Vrin, 2001 * Locke, John, ''Essai sur l'entendement humain'', trad. fr. J.-M. Vienne, Paris, Vrin, 2001 * Marx, Karl, ''Grundrisse. Fondements de la critique de l'économie politique'', trad. fr. J.-P. Lefebvre, Paris, Éditions sociales, 2011 * Marx, Karl, ''Le Capital. Critique de l'économie politique, Livre I'', trad. fr. J.-P. Lefebvre, Paris, PUF, 1993 * Platon, ''République'', trad. fr. G. Leroux, Paris, Flammarion, 2002 * Platon, ''Phédon'', trad. fr. M. Dixsaut, Paris, Flammarion, 1991 * Porphyre, ''Isagoge'', trad. fr. A. de Libera et A.-P. Segonds, Paris, Vrin, 1998 * Thomas d'Aquin, ''Somme théologique'', trad. fr. A.-M. Roguet, Paris, Cerf, 1984-1986, 4 vol. * Thomas d'Aquin, ''De ente et essentia'', in ''L'Être et l'essence'', trad. fr. C. Capelle, Paris, Vrin, 1985 === Études contemporaines === * Adorno, Theodor W., ''Sur la métacritique de la théorie de la connaissance. Études sur Husserl et les antinomies phénoménologiques'', trad. fr. C. David, Paris, Payot, 1976 * Armstrong, David M., ''Universals. An Opinionated Introduction'', Boulder, Westview Press, 1989 * Bäck, Allan, "Aristotle's Abstract Ontology", ''Proceedings of the Society for Ancient Greek Philosophy'', 2008 * Benacerraf, Paul, "Mathematical Truth", ''Journal of Philosophy'', vol. 70, n° 19, 1973, p. 661-679 * Boolos, George, ''Logic, Logic, and Logic'', Cambridge, Harvard University Press, 1998 * Burgess, John P. et Rosen, Gideon, ''A Subject with No Object: Strategies for Nominalistic Interpretation of Mathematics'', Oxford, Clarendon Press, 1997 * Cassirer, Ernst, ''La Philosophie des formes symboliques'', trad. fr. O. Hansen-Løve et J. Lacoste, Paris, Minuit, 1972, 3 vol. * Cocchiarella, Nino B., ''Conceptual Realism as a Formal Ontology'', dans Roberto Poli et Peter Simons (dir.), ''Formal Ontology'', Dordrecht, Kluwer, 1996, p. 27-60 * Dummett, Michael, ''Frege: Philosophy of Mathematics'', Cambridge, Harvard University Press, 1991 * Field, Hartry, ''Science without Numbers'', Oxford, Blackwell, 1980 * Fine, Kit, "The Question of Ontology", dans David J. Chalmers, David Manley et Ryan Wasserman (dir.), ''Metametaphysics'', Oxford, Oxford University Press, 2009, p. 157-177 * Goodman, Nelson, ''The Structure of Appearance'', Cambridge, Harvard University Press, 1951 * Gordon, Liran, "Reconstructing Aquinas's Process of Abstraction", ''Revista Española de Filosofía Medieval'', vol. 25, 2018, p. 41-67 * Hale, Bob, ''Abstract Objects'', Oxford, Blackwell, 1987 * Hale, Bob, ''Philosophical Papers'', Oxford, Clarendon Press, 2001 * Hale, Bob et Wright, Crispin, ''The Reason's Proper Study. Essays towards a Neo-Fregean Philosophy of Mathematics'', Oxford, Clarendon Press, 2001 * Horsten, Leon et Leitgeb, Hannes, "How Abstraction Works", ''Philosophia Mathematica'', vol. 17, n° 3, 2009, p. 334-358 * Ilyenkov, Evald, "The Dialectics of the Abstract and the Concrete in Marx's Capital", Moscou, Progress Publishers, 1982 * Klima, Gyula, "The Medieval Problem of Universals", ''Stanford Encyclopedia of Philosophy'', Edward N. Zalta (dir.), 2008 (version en ligne) * Kriegel, Uriah, "Nominalism and Material Plenitude", ''Res Philosophica'', vol. 98, 2021, p. 89-112 * Linnebo, Øystein, "Bad Company Tamed", ''Synthese'', vol. 170, n° 3, 2009, p. 371-391 * Linnebo, Øystein, ''Philosophy of Mathematics'', Princeton, Princeton University Press, 2017 * Linsky, Bernard et Zalta, Edward N., "In Defense of the Simplest Quantified Modal Logic", ''Philosophical Perspectives'', vol. 8, 1994, p. 431-458 * Lowe, E. J., ''The Possibility of Metaphysics: Substance, Identity, and Time'', Oxford, Clarendon Press, 1998 * Mandler, Jean M., "How to Build a Baby: II. Conceptual Primitives", ''Psychological Review'', vol. 99, n° 4, 1992, p. 587-604 * Martínez, Sergio F. et Huang, Xiang, "Epistemic Groundings of Abstraction and Their Cognitive Dimension", ''Philosophy of Science'', vol. 78, n° 3, 2011, p. 490-511 * Murphy, Gregory L., ''The Big Book of Concepts'', Cambridge, MIT Press, 2002 * Quine, W. V. O., "On What There Is", in ''From a Logical Point of View'', Cambridge, Harvard University Press, 1953, p. 1-19 * Rodriguez-Pereyra, Gonzalo, ''Resemblance Nominalism: A Solution to the Problem of Universals'', Oxford, Clarendon Press, 2002 * Rosen, Gideon, "The Refutation of Nominalism (?)", ''Philosophical Topics'', vol. 21, n° 2, 1993, p. 149-186 * Rosen, Gideon, "Abstract Objects", ''Stanford Encyclopedia of Philosophy'', Edward N. Zalta (dir.), 2020 (version en ligne) * Russell, Bertrand, lettre à Frege du 16 juin 1902, in Jean van Heijenoort (dir.), ''From Frege to Gödel. A Source Book in Mathematical Logic, 1879-1931'', Cambridge, Harvard University Press, 1967, p. 124-125 * Sellars, Wilfrid, "Empiricism and the Philosophy of Mind", in ''Science, Perception and Reality'', Atascadero, Ridgeview, 1963, p. 127-196 * Shapiro, Stewart, ''Philosophy of Mathematics: Structure and Ontology'', Oxford, Oxford University Press, 1997 * Sohn-Rethel, Alfred, ''Intellectual and Manual Labour: A Critique of Epistemology'', Londres, Macmillan, 1978 * Strevens, Michael, "The Essentialist Aspect of Naive Theories", ''Cognition'', vol. 74, 2000, p. 149-175 * Taylor, C. C. W., "Berkeley's Theory of Abstract Ideas", ''Philosophical Quarterly'', vol. 28, n° 111, 1978, p. 97-115 * Weir, Alan, "Neo-Fregeanism: An Embarrassment of Riches", ''Notre Dame Journal of Formal Logic'', vol. 44, n° 1, 2003, p. 13-48 * Wright, Crispin, ''Frege's Conception of Numbers as Objects'', Aberdeen, Aberdeen University Press, 1983 == Voir aussi == * Universel, général, particulier, singulier * [[Dictionnaire de philosophie/Concept|Concept]] * [[Dictionnaire de philosophie/Attribut|Attribut (propriétés et catégories)]] * [[Dictionnaire de philosophie/Individu|Individu]] * [[Dictionnaire de philosophie/Empirisme|Empirisme]] * [[Dictionnaire de philosophie/A priori|A priori]] * [[Dictionnaire de philosophie/Épistémologie|Épistémologie]] * [[Dictionnaire de philosophie/Karl Marx|Karl Marx]] * [[Philosophie/Aliénation|Aliénation]] * [[Dictionnaire de philosophie/Vérité|Vérité]] * Abstrait et concret {{Autocat}} [[Catégorie:Logique]] [[Catégorie:Métaphysique]] eve35yb3a9qmyb3fsgmrgmcnz0sbh67 Dictionnaire de philosophie/Altruisme 0 83029 767936 767671 2026-06-17T16:40:09Z PandaMystique 119061 767936 wikitext text/x-wiki {{DicoPhilo|Altruisme|lecture=oui}} [[Fichier:Auguste Comte.jpg|vignette|upright=1.1|Auguste Comte, qui forgea le terme « altruisme » au milieu du XIX{{e}}&nbsp;siècle.]] L''''altruisme''' désigne la disposition ou le comportement consistant à se préoccuper du bien-être d'autrui pour lui-même, indépendamment de tout avantage personnel immédiat. Le terme, forgé par Auguste Comte au milieu du XIX{{e}}&nbsp;siècle à partir de l'italien ''altrui'' (« autrui »), s'oppose à l'égoïsme et constitue un concept central dans les débats éthiques, psychologiques, biologiques et sociaux. Loin d'être une simple curiosité morale, l'altruisme interroge la nature humaine, les fondements de la moralité et les conditions de possibilité du vivre-ensemble. ==Genèse et définition du concept== Bien que la préoccupation pour autrui soit présente dans de nombreuses traditions philosophiques et religieuses anciennes, le concept d'altruisme en tant que tel est une invention moderne. Auguste Comte, dans son ''Système de politique positive'' (1851-1854), introduit le terme pour désigner le principe moral consistant à « vivre pour autrui »<ref>Auguste Comte, ''Système de politique positive'', tome I, Paris, 1851, p. 613.</ref>. Pour Comte, l'altruisme constitue le fondement de la [[Dictionnaire de philosophie/Morale|morale]] positive, celle qui doit succéder aux morales théologiques et [[Dictionnaire de philosophie/Métaphysique|métaphysiques]]. Il s'agit d'une disposition qui pousse l'individu à subordonner son intérêt personnel au bien d'autrui, que cet autrui soit un individu particulier, un groupe ou l'humanité tout entière. Si le terme est récent, la chose ne l'est pas. Le souci d'autrui possède une longue histoire morale et religieuse, dont Comte hérite plus qu'il ne l'invente. De nombreuses traditions valorisent, chacune dans son langage propre, le souci d'autrui : don, aumône, compassion, bienveillance ou justice<ref>Jacob Neusner et Bruce D. Chilton (dir.), ''Altruism in World Religions'', Washington, Georgetown University Press, 2005, cités par Andrew M. Flescher et Daniel L. Worthen, ''The Altruistic Species. Scientific, Philosophical, and Religious Perspectives of Human Benevolence'', West Conshohocken, Templeton Press, 2007, p. 201-202.</ref>. Le christianisme place en son centre l'agapè, l'amour du prochain pour lui-même, et la ''caritas'' qui en procède ; le judaïsme nomme ''tsedaka'' une aumône dont le nom même la rattache à la justice ; l'islam fait de la ''zakat'', l'aumône légale, l'un de ses cinq piliers ; le bouddhisme cultive la ''karuna'', compassion pour tous les êtres sensibles, liée à la doctrine du non-soi ; le confucianisme fait du ''ren'', la bienveillance ou le sens de l'humain, la vertu première des rapports entre les hommes. La règle d'or, qui invite à ne pas faire à autrui ce qu'on ne voudrait pas subir, traverse plusieurs d'entre elles. Comte invente donc moins un sentiment qu'un mot, destiné à fonder en raison, hors de toute théologie, ce que les morales antérieures rapportaient à Dieu ou au ciel. La définition comtienne établit d'emblée une tension fondamentale : l'altruisme est-il un sentiment naturel, une disposition innée de l'être humain, ou bien une construction sociale et culturelle, voire une exigence morale qui va contre nos penchants spontanés ? Cette question traverse toute l'histoire de la réflexion sur l'altruisme. Il convient de distinguer plusieurs dimensions de l'altruisme. L'altruisme psychologique renvoie aux motivations de l'agent : une action est psychologiquement altruiste si elle est accomplie pour le bien d'autrui comme fin en soi, et non comme moyen pour satisfaire ses propres intérêts. L'altruisme comportemental, quant à lui, désigne simplement des actions qui, de fait, bénéficient à autrui, indépendamment des motivations sous-jacentes. En biologie, l'altruisme évolutionniste caractérise des comportements qui diminuent la valeur sélective (en anglais ''fitness''), c'est-à-dire l'aptitude reproductive, de l'individu qui les adopte tout en augmentant celle d'autres individus<ref>Elliott Sober et David Sloan Wilson, ''Unto Others: The Evolution and Psychology of Unselfish Behavior'', Cambridge, Harvard University Press, 1998.</ref>. Cette distinction entre altruisme psychologique et altruisme biologique est cruciale car les mécanismes explicatifs diffèrent nettement selon qu'on s'intéresse aux motifs conscients des agents ou aux conséquences évolutives de leurs comportements. ==Les précurseurs : sympathie et bienveillance== Avant que Comte ne forge le terme d'altruisme, plusieurs philosophes des Lumières avaient déjà exploré les dispositions qui poussent les êtres humains à se soucier d'autrui. [[Fichier:David Hume Ramsay.jpg|vignette|upright=1.1|David Hume fait de la sympathie le ressort de la vie morale.]] David Hume, dans son ''Traité de la nature humaine'' (1739-1740), fait de la sympathie le ressort principal de la vie morale, la définissant comme la capacité à ressentir les émotions d'autrui par une sorte de contagion affective<ref>David Hume, ''Traité de la nature humaine'', Livre II, partie I, section XI, trad. fr. Philippe Saltel, Paris, GF-Flammarion, 1999, p. 411-424.</ref>. Pour Hume, la sympathie n'est pas un simple calcul rationnel, mais un mécanisme psychologique fondamental : lorsque nous observons les expressions de joie ou de tristesse d'autrui, nous sommes naturellement portés à éprouver des sentiments similaires. Cette capacité sympathique constitue, selon Hume, le fondement naturel de la moralité, car elle nous rend sensibles au bien-être et aux souffrances des autres. Adam Smith, dans sa ''Théorie des sentiments moraux'' (1759), développe une analyse encore plus fine de la sympathie<ref>Adam Smith, ''Théorie des sentiments moraux'', trad. fr. Michaël Biziou, Claude Gautier et Jean-François Pradeau, Paris, PUF, 1999.</ref>. Smith distingue la sympathie de la pitié pure : sympathiser avec quelqu'un, c'est se mettre imaginativement à sa place, adopter son point de vue pour comprendre ce qu'il ressent. Cette capacité de « changement de place » est au cœur de notre vie morale, car elle nous permet de juger nos propres actions comme le ferait un « spectateur impartial ». Smith insiste sur le fait que la sympathie peut s'exercer non seulement à l'égard de la souffrance, mais aussi à l'égard de toutes les passions humaines. Contrairement à ce que laisse entendre une lecture superficielle de son œuvre économique ultérieure (''La Richesse des nations'', 1776), Smith ne considère nullement que l'égoïsme soit le seul moteur de l'action humaine. La sympathie, comme disposition à partager et à comprendre les sentiments d'autrui, est pour lui tout aussi naturelle et fondamentale que l'intérêt personnel. Francis Hutcheson, maître de Smith, avait déjà soutenu l'existence d'un « sens moral » naturel qui nous fait spontanément approuver la bienveillance et désapprouver la malveillance<ref>Francis Hutcheson, ''Recherche sur l'origine de nos idées de la beauté et de la vertu'' (1725), trad. fr. Anne-Dominique Balmès, Paris, Vrin, 1991.</ref>. Pour Hutcheson, cette approbation n'est pas le fruit d'un calcul utilitaire, mais une réaction immédiate de notre nature morale. La bienveillance universelle constitue la vertu suprême, car elle vise le plus grand [[Dictionnaire de philosophie/Bonheur|bonheur]] du plus grand nombre. On reconnaît ici l'une des sources de l'utilitarisme, doctrine qui sera développée plus tard par Jeremy Bentham et John Stuart Mill. Jean-Jacques Rousseau, dans son ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'' (1755), introduit quant à lui la notion de pitié naturelle<ref>Jean-Jacques Rousseau, ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'', in ''Œuvres complètes'', tome III, Paris, Gallimard, « Bibliothèque de la Pléiade », 1964, p. 154-156.</ref>. La pitié, pour Rousseau, est un sentiment immédiat, antérieur à toute réflexion, qui nous fait souffrir de voir souffrir un être sensible. Elle existe même chez les animaux et représente, avec l'amour de soi (distinct de l'amour-propre égoïste), l'un des deux principes antérieurs à la raison qui gouvernent l'homme à l'[[Dictionnaire de philosophie/État de nature|état de nature]]. La pitié naturelle est ce qui tempère l'ardeur de l'amour de soi et constitue ainsi la source de toutes les vertus sociales. C'est elle qui, dans l'état de nature, remplace les lois, les mœurs et la vertu, en nous détournant spontanément de nuire à autrui. Rousseau inscrit donc l'altruisme, avant la lettre, dans notre constitution naturelle, tout en reconnaissant que la société peut l'affaiblir ou le pervertir. Ces analyses du XVIII{{e}}&nbsp;siècle établissent que la capacité à se soucier d'autrui n'est pas nécessairement le produit d'un calcul rationnel ou d'une éducation morale, mais peut relever de dispositions naturelles, ancrées dans notre constitution affective et psychologique. Elles préparent ainsi le terrain pour les débats ultérieurs sur la nature et les fondements de l'altruisme. ==L'égoïsme psychologique et ses critiques== Face à cette tradition qui affirme l'existence de dispositions altruistes naturelles, une autre école de pensée soutient que tous les comportements humains, y compris ceux qui semblent les plus désintéressés, sont en réalité motivés par l'intérêt personnel. Cette position, appelée égoïsme psychologique, a pris diverses formes au cours de l'histoire. [[Fichier:Thomas Hobbes (portrait).jpg|vignette|upright=1.1|Thomas Hobbes : à l'état de nature, l'homme cherche d'abord à se conserver.]] Thomas Hobbes, dans le ''Léviathan'' (1651), défend une vision de l'être humain comme égoïste par nature<ref>Thomas Hobbes, ''Léviathan'', trad. fr. François Tricaud, Paris, Sirey, 1971, chapitres 13-14.</ref>. À l'état de nature, chaque individu cherche à préserver sa propre vie et à augmenter son pouvoir. Les relations humaines sont structurées par la compétition, la défiance et la recherche de la gloire. Dans cette « guerre de tous contre tous », il n'y a ni bien ni mal, ni justice ni injustice, car ces notions n'ont de sens que dans le cadre d'une société organisée sous l'autorité d'un souverain. Si les hommes acceptent de renoncer à une partie de leur liberté naturelle pour instituer un pouvoir commun, c'est uniquement par calcul rationnel, pour échapper aux dangers mortels de l'état de nature. Même les comportements apparemment généreux s'expliquent, selon Hobbes, par l'espoir d'un avantage futur ou par le plaisir égoïste que procure la manifestation de son pouvoir. Cette thèse de l'égoïsme universel a été vigoureusement contestée par plusieurs philosophes. Joseph Butler, dans ses ''Sermons'' (1726), propose une critique méthodique de l'égoïsme psychologique<ref>Joseph Butler, ''Fifteen Sermons Preached at the Rolls Chapel'' (1726), sermons I et XI ; éd. Stephen Darwall, ''Five Sermons Preached at the Rolls Chapel and A Dissertation upon the Nature of Virtue'', Indianapolis, Hackett, 1983.</ref>. Butler distingue l'amour de soi (self-love) des passions particulières. L'amour de soi est le principe qui nous fait chercher notre bonheur ou notre intérêt à long terme. Mais nous avons aussi des désirs immédiats qui portent sur des objets particuliers : la faim nous fait désirer de la nourriture, la curiosité nous pousse à rechercher la connaissance, la bienveillance nous incite à aider autrui. Ces désirs particuliers ne sont pas tous réductibles à l'amour de soi. Butler souligne que, pour éprouver du plaisir en satisfaisant un désir, il faut d'abord avoir ce désir de manière authentique : le plaisir de voir autrui heureux suppose qu'on désire son bonheur pour lui-même, et non pas seulement pour le plaisir que nous en retirons. Vouloir réduire tous nos désirs à la recherche du plaisir personnel conduit à une régression infinie et méconnaît la structure réelle de notre vie affective. Henry Sidgwick, dans ''Les Méthodes de l'éthique'' (1874), examine minutieusement les arguments en faveur de l'égoïsme psychologique et conclut qu'ils reposent sur des confusions conceptuelles<ref>Henry Sidgwick, ''The Methods of Ethics'', 7{{e}}&nbsp;édition, London, Macmillan, 1907, Livre I, chapitre IV.</ref>. Le fait que toute action soit accompagnée d'un certain plaisir ne signifie pas que le plaisir soit toujours le but de l'action. De même, le fait que nous désirions toujours quelque chose ne signifie pas que nous désirions toujours quelque chose pour nous-mêmes. Sidgwick reconnaît que la question de savoir si l'altruisme psychologique existe réellement est une question empirique, mais il considère que l'observation ordinaire de la vie humaine apporte de nombreux témoignages en sa faveur. Au XX{{e}}&nbsp;siècle, le psychologue américain Daniel Batson a mené une série d'expériences ingénieuses pour tester l'hypothèse de l'altruisme empathique<ref>C. Daniel Batson, ''The Altruism Question: Toward a Social-Psychological Answer'', Hillsdale, Erlbaum, 1991 ; ''Altruism in Humans'', New York, Oxford University Press, 2011.</ref>. Selon cette hypothèse, le souci empathique pour autrui (empathic concern) génère une motivation proprement altruiste, c'est-à-dire une motivation dont le but ultime est d'améliorer le bien-être d'autrui. Batson a conçu des situations expérimentales permettant de distinguer cette explication de plusieurs explications égoïstes rivales : réduire la détresse que l'on éprouve soi-même devant la souffrance d'autrui, éviter une sanction sociale ou un blâme intérieur, ou rechercher une récompense, qu'il s'agisse d'approbation, de la joie d'avoir aidé ou d'un simple soulagement de l'humeur. Le dispositif type croise deux variables : on suscite chez les participants une empathie faible ou forte, puis on leur laisse une issue facile ou difficile pour se soustraire à la situation. Si seule comptait la réduction de sa propre détresse, une fuite facile devrait suffire ; si la motivation vise le bien d'autrui, la fuite ne règle rien, et l'on aide quand même. Après une trentaine d'expériences, Batson conclut que l'empathie peut produire une motivation altruiste authentique : les données écartent les six explications égoïstes envisagées, ainsi que leurs combinaisons<ref>C. Daniel Batson, ''Altruism in Humans'', chapitres 5-6 et appendices B-G.</ref>. Ces travaux ont contribué à réhabiliter scientifiquement l'idée d'un altruisme psychologique réel, contre la vision dominante de l'égoïsme universel qui prévalait dans les sciences humaines du XX{{e}}&nbsp;siècle. Cette idée d'une disposition altruiste enracinée dans notre nature trouve un appui du côté de la psychologie du développement. Les conduites prosociales apparaissent tôt dans la vie de l'enfant, avant toute éducation morale élaborée. Dans des études d'observation, la plupart des enfants de dix-huit mois partagent spontanément un objet avec autrui<ref>Carolyn Zahn-Waxler, E. Mark Cummings et Ronald Iannotti (dir.), ''Altruism and Aggression. Social and Biological Origins'', Cambridge, Cambridge University Press, 1991, p. 166 (renvoyant à Rheingold et al., 1976, et à Zahn-Waxler et Radke-Yarrow, 1982).</ref> ; entre dix-huit et vingt-quatre mois, les tout-petits réagissent à la détresse d'un autre en lui offrant aide, objets ou réconfort. La capacité d'être affecté par la situation d'autrui ne serait donc pas une acquisition culturelle tardive, mais une donnée précoce de notre constitution, ce qui confirme par l'observation l'intuition de Hume et de Rousseau. La prudence reste de mise : qu'un enfant partage ne prouve pas qu'il poursuive le bien de l'autre comme but ultime, au sens où l'entend Batson. Reste qu'une sensibilité aux besoins d'autrui se manifeste spontanément, et de bonne heure. ==L'altruisme en biologie évolutionniste== [[Fichier:Charles Darwin 01.jpg|vignette|upright=1.1|Charles Darwin s'interroge sur les comportements coûteux pour l'individu mais utiles au groupe.]] L'émergence de la biologie évolutionniste au XIX{{e}}&nbsp;siècle a introduit une nouvelle dimension dans la réflexion sur l'altruisme. Charles Darwin lui-même, dans ''L'Origine des espèces'' (1859) et surtout dans ''La Filiation de l'homme'' (1871), s'est confronté au problème posé par l'existence de comportements apparemment altruistes dans le monde animal<ref>Charles Darwin, ''La Filiation de l'homme et la sélection liée au sexe'' (1871), trad. fr. Michel Prum, Paris, Syllepse, 1999, chapitres III-V.</ref>. Comment expliquer, par la sélection naturelle, que certains individus adoptent des comportements coûteux pour eux-mêmes mais bénéfiques pour d'autres ? Le cas des insectes sociaux, où des ouvrières stériles travaillent sans relâche pour la colonie, semblait particulièrement problématique. Darwin a parfois raisonné en termes d'avantage pour le groupe, surtout pour rendre compte des vertus sociales humaines. Dans ''La Filiation de l'homme'', il avance qu'une tribu comptant davantage d'individus courageux, dévoués et fidèles l'emporterait sur une tribu d'égoïstes : la sélection jouerait alors entre groupes, et non entre individus<ref>Charles Darwin, ''La Filiation de l'homme'', chapitre V (sur les vertus sociales et la concurrence entre tribus). Sur l'usage darwinien d'une sélection entre groupes pour la morale humaine, voir aussi {{lien web|url=https://iep.utm.edu/altruism-and-group-selection/|titre=Altruism and Group Selection|site=Internet Encyclopedia of Philosophy|consulté le=17 juin 2026}}.</ref>. Il ne s'agit pas chez lui d'une théorie stabilisée et générale, applicable à tout le vivant, mais d'un raisonnement réservé pour l'essentiel au cas de la moralité humaine. La biologie de la seconde moitié du XX{{e}}&nbsp;siècle a reformulé le problème : à partir des années 1960, des biologistes comme George Williams, John Maynard Smith et William Hamilton lui ont substitué des explications fondées sur la sélection individuelle ou génique, autour de la sélection de parentèle, de la valeur sélective inclusive et, plus tard, de la sélection multiniveau. Avant que ces débats ne se déplacent vers le gène, une autre voix s'était élevée contre la lecture guerrière de l'évolution. Le géographe et théoricien [[Dictionnaire de philosophie/Anarchisme|anarchiste]] [[Dictionnaire de philosophie/Pierre Kropotkine|Pierre Kropotkine]], dans ''L'Entraide. Un facteur de l'évolution'' (1902), réplique à Thomas Huxley, qui dépeignait la nature comme une arène de gladiateurs où chacun lutte contre tous. Kropotkine ne nie pas la lutte ; il conteste qu'elle soit l'unique ressort du vivant. S'appuyant sur le sens large que Darwin lui-même donnait à la « lutte pour l'existence » (lutte contre les conditions adverses du milieu, et non seulement concurrence entre individus d'une même espèce) et sur une conférence du zoologiste Karl Kessler « sur la loi du soutien mutuel » (1880), il défend une thèse simple : l'entraide est elle aussi un facteur de l'évolution<ref>Pierre Kropotkine, ''L'Entraide. Un facteur de l'évolution'' (''Mutual Aid: A Factor of Evolution'', 1902), trad. fr. 1906, chapitres I-II.</ref>. Les espèces où la lutte individuelle se réduit et où l'entraide se développe, observe-t-il, sont aussi les plus nombreuses, les plus prospères, les mieux armées pour durer ; les espèces insociables déclinent. Fourmis et abeilles, oiseaux migrateurs, troupeaux de ruminants lui fournissent ses exemples : la sociabilité serait l'arme la plus efficace dans la lutte pour la vie entendue au sens large. Kropotkine étend cette analyse à l'histoire humaine, des sociétés dites primitives aux communes médiévales et aux institutions modernes de solidarité. Au passage, il vise la fiction hobbesienne d'une guerre de tous contre tous : ni l'observation des animaux ni celle des premiers groupes humains, soutient-il, ne la confirment. La portée de l'ouvrage est donc autant politique que scientifique. Son explication, il est vrai, relève davantage de la sociabilité constatée que du calcul génétique qui s'imposera plus tard ; les mécanismes précis de l'entraide, Kropotkine les laisse de côté. Mais son intuition centrale, à savoir que la coopération est répandue dans la nature et qu'elle y est avantageuse plutôt qu'exceptionnelle, annonce la réhabilitation contemporaine de la coopération, jusque dans les modèles de sélection multiniveau. [[Fichier:Maltese honey comb.jpg|vignette|upright=1.1|Chez les insectes sociaux, des ouvrières stériles travaillent pour la colonie : un cas longtemps discuté d'altruisme animal.]] William Hamilton, en particulier, a élaboré la théorie de la sélection de parentèle (kin selection) et le concept de valeur sélective inclusive (''inclusive fitness'')<ref>William D. Hamilton, « The Genetical Evolution of Social Behaviour », ''Journal of Theoretical Biology'', vol. 7, 1964, p. 1-52.</ref>. Selon cette théorie, un comportement altruiste peut être favorisé par la sélection naturelle s'il bénéficie à des individus apparentés génétiquement. Un individu qui aide ses frères, ses sœurs ou ses cousins contribue indirectement à la propagation de ses propres gènes, puisque ces apparentés partagent une proportion significative de son patrimoine génétique. La fameuse « règle de Hamilton » formalise cette intuition : un comportement altruiste sera favorisé si rB > C, où r est le coefficient de parenté entre l'altruiste et le bénéficiaire, B est le bénéfice pour le bénéficiaire, et C est le coût pour l'altruiste. Cette théorie a longtemps fourni l'une des explications majeures du dévouement des ouvrières stériles chez les insectes sociaux : dans les espèces haplodiploïdes que sont les hyménoptères (fourmis, abeilles, guêpes), une particularité du déterminisme sexuel rend les sœurs plus apparentées entre elles qu'à leur propre descendance. L'hypothèse haplodiploïde ne suffit toutefois pas, à elle seule, à expliquer l'eusocialité. La même particularité abaisse la parenté entre sœurs et frères, de sorte que l'avantage tend à se compenser ; surtout, l'eusocialité se rencontre aussi chez des espèces diploïdes, comme les termites. Les biologistes mettent désormais en avant d'autres facteurs, notamment la monogamie des reines, qui assure une parenté élevée entre les membres d'une même colonie<ref>Jacob J. Boomsma, « Lifetime Monogamy and the Evolution of Eusociality », ''Philosophical Transactions of the Royal Society B'', vol. 364, 2009, p. 3191-3207.</ref>. Robert Trivers a proposé une autre explication de l'altruisme apparent dans le monde animal : l'altruisme réciproque<ref>Robert L. Trivers, « The Evolution of Reciprocal Altruism », ''Quarterly Review of Biology'', vol. 46, 1971, p. 35-57.</ref>. Des individus non apparentés peuvent adopter des comportements coûteux les uns envers les autres si chacun s'attend à bénéficier à son tour d'un comportement similaire dans le futur. Cette réciprocité peut être favorisée par la sélection naturelle, même entre individus égoïstes, à condition que les interactions soient répétées et que les « tricheurs » puissent être identifiés et exclus. Les travaux en théorie des jeux, notamment sur le « dilemme du prisonnier itéré », ont montré qu'une stratégie de coopération conditionnelle (comme le fameux « tit-for-tat » ou « donnant-donnant ») peut émerger et se maintenir dans une population d'agents rationnels égoïstes. Ces explications biologiques de l'altruisme apparent ne font pas appel à des motivations altruistes au sens psychologique. Elles montrent comment des comportements qui semblent désintéressés peuvent en réalité servir les intérêts reproductifs des gènes qui les codent. Richard Dawkins, dans ''Le Gène égoïste'' (1976), insiste sur le fait que des comportements coûteux pour l'organisme peuvent néanmoins favoriser les gènes qui les produisent : l'organisme n'est, de ce point de vue, qu'une « machine à survie » au service de ses gènes. Cela ne supprime pas l'altruisme biologique comme phénomène, dont la réalité comportementale demeure ; cela en déplace l'explication, du niveau de l'individu vers celui du gène<ref>Richard Dawkins, ''Le Gène égoïste'' (1976), trad. fr. Laura Ovion, Paris, Odile Jacob, 2003.</ref>. Cette lecture au seul niveau du gène a toutefois été contestée. Elliott Sober et David Sloan Wilson ont défendu une réhabilitation partielle de la sélection de groupe dans leur ouvrage ''Unto Others'' (1998)<ref>Elliott Sober et David Sloan Wilson, ''Unto Others'', 1998.</ref>. Ils soutiennent que la sélection multiniveau (opérant simultanément au niveau des gènes, des individus et des groupes) peut effectivement favoriser l'évolution de comportements altruistes. Par ailleurs, ils insistent sur la distinction entre l'altruisme évolutionniste (défini en termes de valeur sélective) et l'altruisme psychologique (défini en termes de motivations). L'évolution peut avoir produit, chez certaines espèces et notamment chez l'être humain, de réelles dispositions psychologiques altruistes, même si ces dispositions ont initialement émergé parce qu'elles conféraient un avantage sélectif. Le fait qu'une capacité ait une origine évolutive n'implique pas qu'elle soit réductible à l'égoïsme génétique. Ces débats biologiques ont des implications philosophiques importantes. Ils montrent que la question « l'altruisme existe-t-il ? » ne peut recevoir de réponse univoque : tout dépend de ce qu'on entend par « altruisme » et du niveau d'analyse retenu (génétique, comportemental, psychologique, moral). Ils invitent également à une réflexion sur les rapports entre nature et culture : si l'évolution a façonné certaines de nos dispositions prosociales, cela ne signifie pas pour autant que nos comportements moraux soient entièrement déterminés par notre biologie. ==Critiques philosophiques de l'altruisme== Si de nombreux philosophes ont cherché à fonder ou à justifier l'altruisme, d'autres ont développé des critiques frontales de ce concept. Ces critiques prennent plusieurs formes et s'inscrivent dans des perspectives philosophiques diverses. [[Dictionnaire de philosophie/Max Stirner|Max Stirner]], dans ''L'Unique et sa propriété'' (1845), propose une critique anarchiste individualiste de toutes les formes d'altruisme et de sacrifice de soi<ref>Max Stirner, ''L'Unique et sa propriété'' (1845), trad. fr. Pierre Gallissaire, Lausanne, L'Âge d'Homme, 1972.</ref>. Pour Stirner, l'altruisme n'est qu'une forme déguisée d'égoïsme ou, pire encore, une aliénation dans laquelle l'individu se soumet à une idée abstraite (le Bien, l'Humanité, la Société) au lieu de s'affirmer comme unique. Tout dévouement à autrui ou à une cause repose, selon Stirner, soit sur un calcul égoïste inconscient (on attend une récompense ou une reconnaissance), soit sur une soumission à des normes extérieures qui nient la souveraineté de l'individu. L'« égoïste conscient » que Stirner appelle de ses vœux ne se laisse pas piéger par les discours moralisateurs sur le devoir envers autrui : il reconnaît que tous ses actes, y compris ceux qui semblent altruistes, sont motivés par ses propres désirs et intérêts. L'association des égoïstes que Stirner préconise n'est pas fondée sur un idéal d'altruisme, mais sur une reconnaissance mutuelle des intérêts individuels et une coopération librement consentie entre individus souverains. [[Fichier:Nietzsche187a.jpg|vignette|upright=1.1|Friedrich Nietzsche voit dans l'exaltation de la pitié une « morale des esclaves ».]] Friedrich Nietzsche, dans plusieurs de ses œuvres (notamment ''Ainsi parlait Zarathoustra'', ''Par-delà bien et mal'', ''La Généalogie de la morale''), développe une critique virulente de l'altruisme compris comme valeur morale suprême<ref>Friedrich Nietzsche, ''La Généalogie de la morale'' (1887), trad. fr. Éric Blondel, Ole Hansen-Løve, Théo Leydenbach et Pierre Pénisson, Paris, GF-Flammarion, 1996, en particulier la Première dissertation.</ref>. Nietzsche analyse l'exaltation de l'altruisme, de la pitié et du sacrifice de soi comme le produit d'une « morale des esclaves », née du ressentiment des faibles envers les forts. Cette morale, dont le christianisme serait l'expression paradigmatique, valorise l'humilité, la compassion et le renoncement parce qu'elle est incapable d'affirmer la vie dans sa puissance et sa plénitude. La pitié, qui n'a rien d'une vertu aux yeux de Nietzsche, est un symptôme de décadence : elle affaiblit celui qui l'éprouve en le rendant sensible à la souffrance d'autrui, et elle humilie celui qui en est l'objet en le confirmant dans son statut d'être faible et dépendant. Nietzsche ne rejette pas toute forme de don ou de générosité, mais il distingue soigneusement entre le don qui procède d'un débordement de force et de richesse intérieure (« vertu donatrice » du surhomme) et le sacrifice de soi qui procède de la faiblesse et du sentiment d'infériorité. Le premier est l'expression d'une volonté de puissance créatrice et affirmative ; le second est l'expression d'une volonté de puissance négative et réactive. L'idéal nietzschéen n'est donc pas l'égoïsme vulgaire et mesquin, mais une forme supérieure d'affirmation de soi qui peut inclure la générosité envers les autres, pourvu que cette générosité ne soit pas motivée par la pitié ou le sentiment d'obligation morale. Il existe néanmoins des interprétations divergentes sur la position exacte de Nietzsche concernant l'altruisme. Certains commentateurs soulignent que Nietzsche, dans ''Ainsi parlait Zarathoustra'', valorise une forme d'amour du prochain fondée sur l'amour du « lointain » et du surhomme à venir, plutôt que sur la compassion pour le prochain actuel<ref>Friedrich Nietzsche, ''Ainsi parlait Zarathoustra'' (1883-1885), trad. fr. Geneviève Bianquis, Paris, Aubier, 1969, « De l'amour du prochain ».</ref>. D'autres soulignent que la « vertu donatrice » décrite dans le Zarathoustra peut être comprise comme une forme d'altruisme aristocratique, non fondé sur la pitié mais sur l'abondance et la générosité créatrice. Ces lectures nuancées suggèrent que la critique nietzschéenne vise moins l'altruisme en tant que tel qu'une certaine conception moraliste et sacrificielle de l'altruisme. Ayn Rand, philosophe et romancière américaine du XX{{e}}&nbsp;siècle, a développé une philosophie qu'elle nomme « objectivisme », au cœur de laquelle se trouve un rejet catégorique de l'altruisme<ref>Ayn Rand, ''La Vertu d'égoïsme'' (1964), trad. fr. Marc Meunier, Paris, Les Belles Lettres, 1993.</ref>. Pour Rand, l'altruisme est immoral parce qu'il exige le sacrifice de soi au profit d'autrui, niant ainsi le droit de l'individu à exister pour lui-même. L'éthique objectiviste affirme au contraire que chaque individu a le droit et le devoir de rechercher son propre bonheur, et que les relations interpersonnelles doivent être fondées sur l'échange mutuellement bénéfique plutôt que sur le sacrifice. Rand distingue toutefois l'égoïsme rationnel qu'elle défend de l'égoïsme irrationnel ou capricieux : l'égoïsme rationnel consiste à poursuivre son intérêt objectif à long terme, ce qui inclut le respect des droits d'autrui et peut inclure des actes de bienveillance envers ceux qu'on aime, pourvu que ces actes ne soient pas considérés comme des devoirs moraux. Ces critiques philosophiques de l'altruisme posent des questions importantes : l'exigence morale de se soucier d'autrui est-elle compatible avec le respect de soi et l'affirmation de sa propre valeur ? L'idéal altruiste, poussé à l'extrême, ne conduit-il pas à une négation de l'individualité et à une instrumentalisation de la personne ? Comment articuler le souci légitime de soi et le souci légitime d'autrui ? Ces questions demeurent au cœur des débats contemporains en philosophie morale et politique. ==La possibilité de l'altruisme : l'argument de Nagel== Au milieu du XX{{e}}&nbsp;siècle, Thomas Nagel déplace le débat sur un terrain neuf. Là où les moralistes écossais cherchaient dans le sentiment la source de notre souci d'autrui, et où la psychologie expérimentale interrogeait nos motivations, Nagel pose une question proprement philosophique : l'altruisme est-il une exigence de la raison ? Son premier livre, ''La Possibilité de l'altruisme'' (1970), entreprend de le montrer<ref>Thomas Nagel, ''The Possibility of Altruism'', Princeton, Princeton University Press, 1978, p. 3 (éd. originale Clarendon Press, 1970). Trad. fr. : ''La Possibilité de l'altruisme'', trad. Bruno Gnassounou et Emmanuel Halais, Paris, Vrin, 2017.</ref>. Sa cible n'est pas seulement l'égoïsme psychologique, déjà critiqué par Butler et Sidgwick, mais l'égoïsme rationnel : la doctrine selon laquelle seuls nos propres intérêts nous donneraient des raisons d'agir. Nagel procède par analogie avec la prudence. Considérons une situation banale : je prends aujourd'hui un remède amer pour éviter une douleur la semaine prochaine. Aucun désir présent ne me pousse à l'avaler ; c'est la douleur future, anticipée, qui me fournit ici et maintenant une raison d'agir. Accepter ce raisonnement, c'est admettre qu'une raison n'a pas besoin de s'enraciner dans un désir actuel pour me mouvoir. C'est aussi, remarque Nagel, me concevoir comme un être qui dure : je vois le présent à la fois comme « maintenant » et comme un moment particulier parmi d'autres, tous logés dans une seule vie. La prudence repose sur cette capacité à ne pas traiter l'instant présent comme le seul qui compte. L'altruisme, soutient Nagel, obéit à la même structure, transposée de la dimension du temps à celle des personnes. De même que je dois reconnaître à mon moi futur des intérêts qui me donnent des raisons d'agir aujourd'hui, je dois reconnaître aux autres des intérêts qui me donnent des raisons d'agir. La souffrance d'autrui est, en elle-même, une raison de la soulager ; le désir d'aider peut ensuite naître de cette reconnaissance, mais il ne la fonde pas. Ce qui rend cette reconnaissance possible, c'est la capacité de me saisir non seulement comme « je », mais comme « quelqu'un » : un individu parmi d'autres, repérable de façon impersonnelle, sans statut privilégié<ref>Nagel, ''The Possibility of Altruism'', p. 99-100.</ref>. Vue de l'extérieur, ma douleur n'est jamais que la douleur de quelqu'un, exactement comme celle de mon voisin. L'erreur de l'égoïste, dès lors, n'est pas un défaut du cœur mais une incohérence de la raison. L'égoïste demande : « pourquoi devrais-je me soucier des autres ? » Nagel renverse la question : quelle raison aurait-il de ne pas s'en soucier, dès lors qu'il accorde aux autres la même réalité qu'à lui-même ? Refuser de voir ses propres intérêts comme ceux d'une personne parmi d'autres, c'est l'analogue pratique de celui qui n'accorderait de réalité qu'au moment présent. L'éthique est en ce sens une lutte contre une forme de solipsisme pratique, comme la prudence est une lutte contre la tyrannie de l'instant<ref>Nagel, ''The Possibility of Altruism'', p. 100.</ref>. Il faut se garder d'un contresens. L'altruisme dont parle Nagel n'est ni un sentiment, ni une affection diffuse pour le genre humain, ni une fusion mystique avec les autres. S'identifier à son moi futur n'oblige pas à croire que le présent et le futur ne font qu'un ; de même, reconnaître autrui ne demande pas de se confondre avec lui, mais seulement de se concevoir comme une personne parmi d'autres au sein d'un même monde. L'inspiration kantienne est ici manifeste : Nagel, dont la thèse fut dirigée par John Rawls, fonde le respect d'autrui sur une exigence de la raison plutôt que sur l'inclination. Il l'ancre toutefois dans une métaphysique de la personne et de l'action, non dans la seule forme de l'impératif catégorique. Cette ambition a suscité des objections, y compris de la part de l'auteur lui-même. Dans une postface ajoutée en 1978, Nagel reconnaît que son argument n'établit pas que toutes nos raisons doivent être objectives, mais seulement qu'à toute raison subjective correspond une raison objective ; le point de vue personnel conserve un poids propre, légitime, à côté du point de vue impersonnel. Cette tension entre les deux points de vue deviendra le fil conducteur de ''Le Point de vue de nulle part'' (1986). D'autres lecteurs ont relevé une difficulté plus interne. Christine Korsgaard observe que Nagel présuppose que l'affaire de la morale est de « faire advenir » quelque chose de bon, présupposé qui pousse insensiblement son argument vers l'utilitarisme, qu'il s'emploie pourtant à tenir à distance<ref>Christine M. Korsgaard, « The Reasons We Can Share. An Attack on the Distinction between Agent-Relative and Agent-Neutral Values », in Ellen Frankel Paul, Fred D. Miller et Jeffrey Paul (dir.), ''Altruism'', Cambridge, Cambridge University Press, 1993, p. 24-51.</ref>. ==L'altruisme dans l'éthique contemporaine== Dans la philosophie morale contemporaine, la place et le statut de l'altruisme font l'objet de vifs débats. Différentes théories éthiques accordent à l'altruisme une importance variable et le conçoivent de manières distinctes. L'utilitarisme, sous ses différentes formes, met au premier plan une forme d'altruisme impartial. Selon une formule que Mill prête à Bentham, « chacun compte pour un, et personne pour plus d'un » : le bien-être de chaque individu doit être pris en compte de manière égale dans le calcul de l'utilité globale. L'utilitarisme exige donc que l'agent moral considère impartialement les intérêts de tous les êtres sensibles concernés par ses actions, y compris les siens propres, mais sans leur accorder de poids spécial<ref>La maxime est rapportée par John Stuart Mill, ''L'Utilitarisme'', chapitre V, qui l'attribue à Bentham ; pour le principe d'utilité lui-même, voir Jeremy Bentham, ''Introduction aux principes de morale et de législation'' (1789), trad. fr. Centre Bentham, Paris, Vrin, 2011.</ref>. John Stuart Mill, dans ''L'Utilitarisme'' (1861), soutient que le bonheur général doit être la fin ultime de toute conduite morale<ref>John Stuart Mill, ''L'Utilitarisme'' (1861), trad. fr. Georges Tanesse, Paris, Flammarion, 1988.</ref>. Cette exigence d'impartialité soulève toutefois de nombreuses difficultés : est-il vraiment moralement exigible de traiter ses propres enfants sur le même plan que des enfants inconnus vivant à l'autre bout du monde ? L'utilitarisme ne conduit-il pas à des demandes morales excessivement contraignantes, voire impossibles à satisfaire ? Peter Singer prolonge l'utilitarisme dans une version exigeante, qui implique des obligations altruistes étendues. Dès son article « Famine, Affluence, and Morality » (1972), repris et développé dans ''Questions d'éthique pratique'' (1979), il soutient que nous avons le devoir moral d'aider ceux qui sont dans le besoin, pourvu que nous puissions le faire sans sacrifier quelque chose d'une importance morale comparable<ref>Peter Singer, « Famine, Affluence, and Morality », ''Philosophy & Public Affairs'', vol. 1, n° 3, 1972, p. 229-243 ; ''Questions d'éthique pratique'' (''Practical Ethics'', 1979), trad. fr. Max Marcuzzi, Paris, Bayard, 1997.</ref>. Dans un monde où des millions de personnes meurent de causes évitables liées à la pauvreté, ce principe implique que les individus des pays riches ont l'obligation morale de consacrer une part substantielle de leurs ressources à l'aide aux plus démunis. Cette position, qui va bien au-delà de ce que la plupart des gens considèrent comme moralement exigible, illustre les tensions entre l'altruisme comme idéal moral et les limites de ce qu'on peut raisonnablement demander aux agents moraux. La tradition kantienne, tout en accordant une place importante au souci d'autrui, conçoit les exigences morales de manière différente de l'utilitarisme. Pour Kant, dans les ''Fondements de la métaphysique des mœurs'' (1785), le devoir moral suprême est de traiter l'humanité, en sa propre personne comme en celle d'autrui, toujours en même temps comme une fin, jamais simplement comme un moyen<ref>Emmanuel Kant, ''Fondements de la métaphysique des mœurs'' (1785), trad. fr. Victor Delbos révisée par Alexis Philonenko, Paris, Vrin, 1992, p. 105 (AK IV, 429).</ref>. Ce principe de respect de la dignité humaine implique certes des devoirs envers autrui (devoirs de bienfaisance, de non-nuisance, etc.), mais ces devoirs sont fondés sur le respect de la personne morale plutôt que sur un souci direct pour le bien-être ou le bonheur d'autrui. De plus, Kant distingue entre les devoirs parfaits (stricts) et les devoirs imparfaits (larges). Les devoirs de bienfaisance appartiennent à la seconde catégorie : on a le devoir de faire de la promotion du bonheur d'autrui l'une de ses fins, mais on conserve une latitude dans la manière de s'acquitter de ce devoir. Les éthiques du care (éthique de la sollicitude ou du soin), développées notamment par Carol Gilligan, Nel Noddings et Joan Tronto à partir des années 1980, proposent une approche alternative qui valorise les relations de soin et la réceptivité aux besoins d'autrui<ref>Carol Gilligan, ''Une voix différente. Pour une éthique du care'' (1982), trad. fr. Annick Kwiatek, Paris, Flammarion, 2008.</ref>. Ces approches critiquent les théories morales dominantes (notamment l'utilitarisme et le kantisme) pour leur focalisation excessive sur l'impartialité, l'autonomie et les principes abstraits, au détriment des relations concrètes de dépendance et de vulnérabilité qui caractérisent la vie humaine. Le care désigne à la fois une activité (prendre soin d'autrui) et une disposition (être attentif et réceptif aux besoins d'autrui). Cette approche privilégie une forme d'altruisme relationnel et contextualisé, plutôt qu'un altruisme impartial et universaliste. Elle souligne également que le care, historiquement et socialement, a été largement assigné aux femmes, soulevant ainsi des questions de justice sociale et de division genrée du travail moral et émotionnel. Emmanuel Levinas pousse la pensée de la responsabilité pour autrui jusqu'à un point qui déborde les cadres traditionnels de l'éthique<ref>Emmanuel Lévinas, ''Totalité et Infini. Essai sur l'extériorité'', La Haye, Nijhoff, 1961, et ''Autrement qu'être ou au-delà de l'essence'', La Haye, Nijhoff, 1974.</ref>. Pour Levinas, la rencontre avec le visage d'autrui constitue l'expérience éthique fondamentale. Le visage d'autrui, dans sa vulnérabilité et son altérité irréductible, m'adresse une injonction : « Tu ne tueras point ». Cette responsabilité pour autrui est asymétrique (je suis responsable d'autrui sans qu'il soit réciproquement responsable de moi de la même façon), infinie (elle ne connaît pas de limites a priori) et première (elle précède ma liberté et la constitue). Levinas va jusqu'à écrire que « je suis responsable d'autrui sans attendre la réciproque, dût-il m'en coûter la vie »<ref>Emmanuel Lévinas, ''Éthique et Infini. Dialogues avec Philippe Nemo'', Paris, Fayard, 1982, p. 95.</ref>. Cette conception, influencée par la tradition juive et par l'expérience historique de la Shoah, propose une vision de l'altruisme comme structure fondamentale de la subjectivité éthique, antérieure à tout calcul d'intérêt ou à toute réciprocité. Ces différentes approches contemporaines montrent que l'altruisme peut être pensé et justifié de multiples façons : comme maximisation impartiale du bien-être collectif (utilitarisme), comme respect de la dignité des personnes (kantisme), comme réponse attentive aux besoins concrets d'autrui dans des relations de care, ou comme responsabilité asymétrique et infinie face à l'altérité d'autrui (Levinas). Chacune de ces perspectives soulève des questions spécifiques concernant les limites de l'exigence altruiste, les conflits possibles entre le souci de soi et le souci d'autrui, et les conditions sociales et politiques qui favorisent ou entravent l'exercice de la solidarité. ==L'altruisme efficace== L'exigence formulée par Singer, aider les autres tant que nous le pouvons sans sacrifice comparable, a trouvé au début du XXI{{e}}&nbsp;siècle un prolongement pratique : le mouvement de l'altruisme efficace (''effective altruism''). Né dans les milieux universitaires d'Oxford, il s'est formé à la croisée de plusieurs organisations : l'association Giving What We Can, lancée en 2009, puis 80,000 Hours et le Centre for Effective Altruism en 2011, aux côtés de l'évaluateur caritatif GiveWell. Il associe des philosophes comme William MacAskill et Toby Ord et, en figure tutélaire, Peter Singer<ref>Sur cette histoire, voir {{lien web|url=https://www.centreforeffectivealtruism.org/history|titre=Our history|site=Centre for Effective Altruism|consulté le=17 juin 2026}} ; ainsi que Hilary Greaves et Theron Pummer (dir.), ''Effective Altruism. Philosophical Issues'', Oxford, Oxford University Press, 2019, en particulier William MacAskill, « The Definition of Effective Altruism », p. 10-15.</ref>. Son principe tient en peu de mots : utiliser les données disponibles et un raisonnement soigneux pour déterminer comment faire le plus de bien possible avec des ressources données, puis agir en conséquence<ref>MacAskill, « The Definition of Effective Altruism », p. 13-14.</ref>. Deux engagements le commandent. D'abord la maximisation : pour une somme donnée, on vise le bien le plus grand qu'elle permette de produire. Ensuite un bien entendu, à titre d'hypothèse de travail, en termes de bien-être, et compté de façon impartiale, le bien-être de chacun pesant également. De là découlent la neutralité quant aux causes et quant aux moyens : aucune cause n'est privilégiée d'avance, seul importe ce qui produit le plus de bien. Cette impartialité se traduit en méthode. Pour hiérarchiser les causes, les altruistes efficaces pèsent trois critères : l'ampleur d'un problème, la possibilité d'y remédier, et son degré de délaissement par les autres acteurs. Ils accordent une prime aux interventions dont l'efficacité est attestée par des preuves solides, au sommet desquelles ils placent les essais contrôlés randomisés (''randomized controlled trials'')<ref>Greaves et Pummer (dir.), ''Effective Altruism'', chapitre « Effective Altruism, Global Poverty, and Systemic Change », p. 100-101.</ref>. Plutôt qu'aux causes les plus visibles ou les plus chargées d'émotion, ils invitent à regarder les chiffres. Un exemple éclaire la démarche : GiveWell recommande de longue date la distribution de moustiquaires contre le paludisme ou les transferts monétaires directs aux ménages très pauvres (GiveDirectly), parce que leur effet sur la santé et le revenu se laisse mesurer, là où d'autres dépenses, plus spectaculaires, restent d'un rendement incertain. Sur le plan individuel, le mouvement propose de consacrer une part définie de ses revenus aux organisations les plus efficaces, voire de choisir sa carrière en fonction du bien qu'elle permet de faire. Trois domaines concentrent aujourd'hui ses efforts : la lutte contre la pauvreté et pour la santé mondiale, la condition animale, et la réduction des risques majeurs pesant sur l'avenir de l'humanité, y compris ceux liés à l'intelligence artificielle. Ce dernier axe a donné naissance au « long-termisme » (''longtermism''), qui étend l'impartialité aux générations futures : si le bien-être de chacun compte également, le lieu et le moment de l'existence ne devraient pas, en eux-mêmes, modifier le poids accordé à un être. On retrouve ici, prolongée jusqu'à ses conséquences, l'impartialité utilitariste. L'altruisme efficace se présente moins comme une obligation que comme un projet, compatible avec des morales diverses ; ses promoteurs ont choisi de ne pas y inscrire d'exigence de sacrifice, afin de l'ouvrir au plus grand nombre<ref>MacAskill, « The Definition of Effective Altruism », p. 15-16.</ref>. Cette prudence ne le met pas à l'abri des objections. On lui reproche son cadre conséquentialiste et bien-êtriste, qui laisserait dans l'ombre des valeurs non réductibles au bien-être, à commencer par la justice. On observe que la préférence pour le mesurable favorise les interventions ponctuelles et quantifiables au détriment des transformations structurelles, plus difficiles à chiffrer. On s'inquiète enfin du paternalisme possible d'un donateur qui prétend savoir mieux que les bénéficiaires ce qui leur est utile<ref>Plusieurs chapitres du volume dirigé par Greaves et Pummer examinent ces objections, notamment « Effective Altruism, Global Poverty, and Systemic Change », p. 100-101 (justice et transformations structurelles), et « Benevolent Giving and the Problem of Paternalism », p. 123.</ref>. Ces discussions reconduisent, sur un terrain concret, la question que pose toute morale de la bienfaisance : jusqu'où sommes-nous tenus, et au nom de quoi ? ==Altruisme, charité, solidarité et justice sociale== L'altruisme, tel que les sections précédentes l'ont surtout envisagé, est une disposition individuelle : une affaire de motifs, de vertus, de gestes. Mais dès que l'on passe du donateur aux causes de la misère, le vocabulaire se déplace. La solidarité et la justice sociale ne renvoient plus à des cœurs généreux, elles renvoient à des structures collectives : droits sociaux, institutions, fiscalité, rapports de classe. Penser l'altruisme sans cette dimension, c'est risquer de prendre la partie pour le tout. La distinction la plus nette oppose la charité à la justice. La justice désigne ce qui est dû : un droit qu'on peut réclamer, et au besoin imposer. La charité désigne ce qui peut être librement donné : une vertu que rien n'oblige, et dont l'omission ne se sanctionne pas<ref>Sur la distinction de ce qui est dû et de ce qui est donné, voir l'essai « The Right to Welfare and the Virtue of Charity », in Ellen Frankel Paul, Fred D. Miller et Jeffrey Paul (dir.), ''Altruism'', Cambridge, Cambridge University Press, 1993, p. 192-199.</ref>. L'histoire des sociétés modernes peut se lire comme un transfert progressif de la seconde vers la première : ce que l'on confiait à la bienveillance privée, l'État-providence l'a peu à peu institué en droit. Le progrès moral, écrit un philosophe, consiste pour une large part à étendre le domaine de la justice à ce que l'on tenait auparavant pour celui de la charité<ref>Allen Buchanan, cité par Niall Scott et Jonathan Seglow, ''Altruism'', Maidenhead, Open University Press, 2007, p. 99.</ref>. Si cette tendance se poursuivait, on pourrait se demander quel espace resterait à l'altruisme proprement dit. C'est ici qu'une critique d'inspiration sociale, souvent [[Dictionnaire de philosophie/Karl Marx|marxiste]], prend sa portée. Le choix de soutenir telle cause plutôt que telle autre, observent Scott et Seglow, ne suit pas nécessairement les besoins réels. La distinction du « bon » et du « mauvais » pauvre, par exemple, suppose que la pauvreté tient au caractère des individus, alors qu'elle est largement produite par leurs conditions d'existence : bas salaires, emplois sans intérêt, chômage de masse, logement insalubre<ref>Niall Scott et Jonathan Seglow, ''Altruism'', p. 98-99.</ref>. L'appel à l'altruisme peut alors fonctionner comme un écran : il transforme un problème de justice en problème de générosité privée, et soigne les symptômes de la misère sans en toucher les causes. Secourir une victime de la pauvreté est louable ; mais si la pauvreté est une production sociale, la réponse à sa mesure relève de l'institution, non du don. La solidarité offre un terme intermédiaire. Dans son étude classique sur le don du sang, Richard Titmuss oppose le don anonyme et gratuit, qui lie des inconnus, à l'échange marchand : l'État-providence y apparaît comme une solidarité institutionnalisée, une forme de don généralisé entre citoyens<ref>Richard Titmuss, ''The Gift Relationship. From Human Blood to Social Policy'' (1970), Londres, LSE Books, 1997 ; analysé par Scott et Seglow, ''Altruism'', p. 102-110.</ref>. On reconnaît là, transposée à l'échelle d'une nation, l'entraide que Kropotkine décrivait dans le village : la communauté tient parce que chacun se sait soutenu à son tour. À ce ressort solidaire, les valeurs du marché, individualisme, responsabilité de soi, accumulation, sont volontiers présentées comme hostiles ; on ne saurait être à la fois agent calculateur et altruiste résolu. Il ne faut pourtant pas dissoudre l'altruisme dans la justice. Même un État qui garantirait les droits sociaux ne rendrait pas la générosité superflue : les bénévoles repèrent souvent des besoins que les administrations ignorent, la vie associative nourrit une société civile qui fait contrepoids à la puissance publique, et bien des formes d'attention ne s'institutionnalisent pas<ref>Scott et Seglow, ''Altruism'', p. 101-102.</ref>. Altruisme et justice demeurent deux idées distinctes : l'un est une vertu des personnes, l'autre une propriété des institutions. La question n'est donc pas de choisir entre elles, mais de discerner, pour chaque détresse, ce qui appelle un secours et ce qui exige un droit. ==Altruisme et surérogation== Un débat important en philosophie morale contemporaine concerne la distinction entre les actes moralement obligatoires et les actes surérogatoires (supererogatory acts). Les actes surérogatoires sont des actes qui vont au-delà de ce qui est moralement exigible : ce sont des actes moralement louables, mais dont l'omission ne constitue pas une faute morale. L'héroïsme moral et la sainteté sont souvent cités comme exemples de conduites surérogatoires : celui qui se sacrifie pour sauver des inconnus ou qui consacre sa vie à servir les plus démunis accomplit quelque chose d'admirable, mais nous n'estimons pas qu'il serait blâmable de ne pas en faire autant. Cette distinction pose aussitôt une question : où tracer la ligne entre l'obligatoire et le surérogatoire en matière d'altruisme ? Les théories morales exigeantes, comme l'utilitarisme conséquentialiste, tendent à minimiser ou à nier la catégorie du surérogatoire : si un acte maximise le bien-être général, il est moralement obligatoire, quelle que soit la charge qu'il impose à l'agent. Cette conséquence a conduit certains philosophes, comme Susan Wolf dans « Moral Saints » (1982), à critiquer les théories morales trop exigeantes<ref>Susan Wolf, « Moral Saints », ''Journal of Philosophy'', vol. 79, n° 8, 1982, p. 419-439.</ref>. Wolf soutient qu'une vie entièrement consacrée à la maximisation du bien d'autrui (la vie du « saint moral ») ne serait pas nécessairement une vie bonne ou désirable. L'excellence morale n'est qu'une dimension de l'excellence humaine, et d'autres valeurs (esthétiques, intellectuelles, relationnelles, etc.) méritent également d'être poursuivies. Une théorie morale qui exige un altruisme maximal et constant risque de produire des vies appauvries ou, à tout le moins, elle ne rend pas compte de nos intuitions concernant la pluralité des valeurs et la légitimité d'une certaine partialité envers nous-mêmes et nos proches. Samuel Scheffler, dans ''The Rejection of Consequentialism'' (1982), défend l'idée que l'agent moral dispose d'une « prérogative centrée sur l'agent » (agent-centered prerogative) : il est moralement permis d'accorder plus de poids à nos propres projets et à nos propres intérêts qu'à ceux d'inconnus, même si cela ne maximise pas le bien-être global<ref>Samuel Scheffler, ''The Rejection of Consequentialism'', Oxford, Clarendon Press, 1982.</ref>. Cette prérogative ne signifie pas que nous pouvons ignorer complètement les intérêts d'autrui, mais elle reconnaît qu'une impartialité morale sans réserve n'est pas moralement exigible. Scheffler propose ainsi de trouver un équilibre entre les exigences de l'altruisme impartial et la légitimité d'une certaine partialité envers soi-même et ses proches. Ces débats sur la surérogation et les limites de l'exigence morale altruiste touchent à des questions de fond concernant la nature de la moralité et sa place dans une vie humaine réussie. Ils invitent à réfléchir sur le point de savoir si la moralité peut légitimement exiger des sacrifices illimités de la part de l'agent, ou si elle doit reconnaître la valeur indépendante de l'épanouissement personnel et des engagements particuliers. ==Perspectives critiques : éthique de la vertu et particularisme== [[Fichier:Aristotle Altemps Inv8575.jpg|vignette|upright=1.1|Aristote : dans l'amitié accomplie, on veut le bien de l'autre pour lui-même.]] Les approches en termes d'éthique de la vertu, héritières d'[[Dictionnaire de philosophie/Aristote|Aristote]], proposent une manière différente de penser l'altruisme et les vertus prosociales. Plutôt que de se focaliser sur des principes abstraits (maximisation de l'utilité, impératif catégorique) ou sur la classification des actes en obligatoires, permis et interdits, l'éthique de la vertu s'intéresse aux traits de caractère et aux dispositions qui constituent une personne vertueuse<ref>Rosalind Hursthouse, ''On Virtue Ethics'', Oxford, Oxford University Press, 1999.</ref>. Dans cette perspective, l'altruisme n'est pas simplement une question de conformité à un principe moral ou de réalisation d'actes bienveillants occasionnels, mais plutôt une question de développement de vertus telles que la générosité, la compassion, la bienveillance, la justice. Ces vertus sont des dispositions stables du caractère qui permettent à la personne de répondre de manière appropriée aux situations morales concrètes. L'accent est mis sur la formation morale, l'éducation des émotions et l'acquisition de la sagesse pratique (phronesis) qui permet de discerner ce qu'il convient de faire dans chaque situation particulière. Cette approche permet de dépasser certaines difficultés des théories déontologiques ou conséquentialistes. Par exemple, elle n'exige pas une impartialité stricte entre tous les êtres humains : il est naturel et vertueux d'avoir des attachements particuliers envers nos proches, et ces attachements font partie intégrante d'une vie humaine florissante. Aristote lui-même, dans les livres VIII et IX de l{{'}}''Éthique à Nicomaque'', réserve une large place à l'[[Dictionnaire de philosophie/Amitié|amitié]] (philia) et montre que les formes supérieures d'amitié impliquent un souci désintéressé pour le bien de l'ami<ref>Aristote, ''Éthique à Nicomaque'', trad. fr. Richard Bodéüs, Paris, GF-Flammarion, 2004, Livres VIII-IX.</ref>. L'ami, au sens plein, veut le bien de son ami pour lui-même, et non pour l'avantage qu'il peut en tirer. Cette forme d'altruisme particulariste est compatible avec la poursuite d'une vie bonne et constitue même l'une de ses composantes essentielles. Le particularisme moral, défendu par des philosophes comme Jonathan Dancy, va plus loin en contestant l'idée même que des principes moraux généraux (altruistes ou autres) puissent déterminer adéquatement ce qu'il convient de faire dans des situations concrètes<ref>Jonathan Dancy, ''Ethics Without Principles'', Oxford, Clarendon Press, 2004.</ref>. Selon le particularisme, la pertinence morale d'un facteur (par exemple, le fait qu'une action bénéficie à autrui) est toujours dépendante du contexte. Ce qui constitue une raison d'agir dans un contexte peut ne pas l'être dans un autre contexte, ou même constituer une raison opposée. Par conséquent, on ne peut pas établir de principe général selon lequel, par exemple, « on doit toujours maximiser le bien-être d'autrui » ou « on doit toujours respecter l'autonomie d'autrui ». La sagesse morale consiste précisément dans la capacité à discerner, cas par cas, ce que la situation requiert. Ces approches en termes de vertus et de particularisme moral invitent à une réflexion plus contextualisée et nuancée sur l'altruisme. Elles rappellent que la moralité n'est pas seulement affaire de respect de principes abstraits, mais aussi de sensibilité aux particularités des situations et des personnes, et de développement de dispositions stables qui permettent de répondre de manière appropriée à la complexité de la vie morale. ==Conclusion== L'altruisme n'est pas un concept univoque, mais un faisceau de questions entrelacées, qui engagent tour à tour la psychologie, la biologie, l'éthique et la philosophie politique. Existe-t-il des motivations réellement altruistes, ou tout comportement prosocial se ramène-t-il en dernière analyse à l'intérêt personnel ? Si l'altruisme psychologique existe, d'où vient-il : de la sympathie, de l'empathie, du sens moral, de l'éducation ? Comment une évolution gouvernée par la sélection naturelle a-t-elle pu le favoriser, et quelle valeur devons-nous lui accorder dans nos vies comme dans nos institutions ? À ces questions, les réponses divergent, et souvent s'opposent. Les moralistes écossais, l'argument rationaliste de Nagel, l'utilitarisme, les éthiques du care et la pensée de Levinas font de l'altruisme une pièce maîtresse de la morale, quoique pour des raisons fort différentes ; Stirner, Nietzsche et Rand y voient au contraire une aliénation ou un symptôme de décadence ; entre ces extrêmes, bien des positions cherchent à concilier souci de soi et souci d'autrui, partialité légitime et impartialité, devoirs stricts et conduites surérogatoires. Sur le terrain empirique, la psychologie sociale et du développement, la biologie évolutionniste et les neurosciences ont défait l'opposition trop simple de l'égoïsme et de l'altruisme : nous sommes à la fois capables d'une réelle sollicitude et mus par nos intérêts, produits de l'évolution et êtres de culture. Le débat n'a rien perdu de son actualité. La pauvreté, le changement climatique, les pandémies posent avec insistance la question de nos devoirs envers ceux qui sont loin de nous, dans l'espace, dans le temps ou dans l'ordre du vivant ; la montée des inégalités interroge les conditions sociales de la solidarité ; les techniques nouvelles, intelligence artificielle en tête, déplacent les frontières de la communauté morale. Il ne s'agit ni d'une curiosité d'école ni d'un idéal hors d'atteinte, mais d'une dimension de l'existence humaine que nul ne peut ignorer. Comprendre l'altruisme dans toutes ses dimensions, fait psychologique, problème évolutionnaire et exigence éthique, reste une tâche pour qui veut penser ensemble une vie épanouie et une société juste. ==Références== {{references|colonnes=2}} ==Bibliographie== ===Textes classiques=== * Aristote, ''Éthique à Nicomaque'', trad. fr. Richard Bodéüs, Paris, GF-Flammarion, 2004 (livres VIII-IX sur l'amitié) ; [[s:Éthique à Nicomaque|texte sur Wikisource]]. * Joseph Butler, ''Fifteen Sermons Preached at the Rolls Chapel'' (1726), éd. Stephen Darwall, ''Five Sermons Preached at the Rolls Chapel and A Dissertation upon the Nature of Virtue'', Indianapolis, Hackett, 1983. * Auguste Comte, ''Système de politique positive'', 4 tomes, Paris, 1851-1854 (tome I pour l'introduction du concept d'altruisme). * Charles Darwin, ''L'Origine des espèces'' (1859), [[s:L’Origine des espèces|texte sur Wikisource]] ; ''La Filiation de l'homme et la sélection liée au sexe'' (1871), [[s:La Descendance de l’homme et la sélection sexuelle|texte sur Wikisource]]. * David Hume, ''Traité de la nature humaine'' (1739-1740), trad. fr. Philippe Saltel, Paris, GF-Flammarion, 1999 (Livre II, partie I, section XI sur la sympathie ; Livre III sur la morale) ; [[s:Traité de la nature humaine|texte sur Wikisource]]. * Emmanuel Kant, ''Fondements de la métaphysique des mœurs'' (1785), trad. fr. Victor Delbos révisée par Alexis Philonenko, Paris, Vrin, 1992 ; [[s:Fondements de la métaphysique des mœurs|texte sur Wikisource]]. * Pierre Kropotkine, ''L'Entraide. Un facteur de l'évolution'' (''Mutual Aid: A Factor of Evolution'', 1902), trad. fr. 1906 ; [[s:L’Entraide, un facteur de l’évolution|texte sur Wikisource]]. * Emmanuel Lévinas, ''Totalité et Infini. Essai sur l'extériorité'', La Haye, Nijhoff, 1961. * Emmanuel Lévinas, ''Autrement qu'être ou au-delà de l'essence'', La Haye, Nijhoff, 1974. * John Stuart Mill, ''L'Utilitarisme'' (1861), trad. fr. Georges Tanesse, Paris, Flammarion, 1988 ; [[s:L’Utilitarisme|texte sur Wikisource]]. * Friedrich Nietzsche, ''La Généalogie de la morale'' (1887), trad. fr. Éric Blondel et al., Paris, GF-Flammarion, 1996 ; [[s:La Généalogie de la morale|texte sur Wikisource]]. * Jean-Jacques Rousseau, ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'' (1755), in ''Œuvres complètes'', tome III, Paris, Gallimard, « Bibliothèque de la Pléiade », 1964 ; [[s:Discours sur l’origine et les fondements de l’inégalité parmi les hommes|texte sur Wikisource]]. * Adam Smith, ''Théorie des sentiments moraux'' (1759), trad. fr. Michaël Biziou, Claude Gautier et Jean-François Pradeau, Paris, PUF, 1999. * Max Stirner, ''L'Unique et sa propriété'' (1845), trad. fr. Pierre Gallissaire, Lausanne, L'Âge d'Homme, 1972 ; [[s:L’Unique et sa propriété|texte sur Wikisource]]. ===Travaux contemporains=== * C. Daniel Batson, ''The Altruism Question: Toward a Social-Psychological Answer'', Hillsdale, Erlbaum, 1991. * C. Daniel Batson, ''Altruism in Humans'', New York, Oxford University Press, 2011. * Richard Dawkins, ''Le Gène égoïste'' (1976), trad. fr. Laura Ovion, Paris, Odile Jacob, 2003. * Andrew M. Flescher et Daniel L. Worthen, ''The Altruistic Species. Scientific, Philosophical, and Religious Perspectives of Human Benevolence'', West Conshohocken, Templeton Press, 2007. * Carol Gilligan, ''Une voix différente. Pour une éthique du care'' (1982), trad. fr. Annick Kwiatek, Paris, Flammarion, 2008. * William MacAskill, ''Doing Good Better'', New York, Avery, 2015. * Thomas Nagel, ''La Possibilité de l'altruisme'' (1970), trad. fr. Bruno Gnassounou et Emmanuel Halais, Paris, Vrin, 2017. * Ayn Rand, ''La Vertu d'égoïsme'' (1964), trad. fr. Marc Meunier, Paris, Les Belles Lettres, 1993. * Matthieu Ricard, ''Plaidoyer pour l'altruisme. La force de la bienveillance'', Paris, NiL éditions, 2013. * Samuel Scheffler, ''The Rejection of Consequentialism'', Oxford, Clarendon Press, 1982. * Niall Scott et Jonathan Seglow, ''Altruism'', Maidenhead, Open University Press, 2007. * Peter Singer, ''Questions d'éthique pratique'' (1979), trad. fr. Max Marcuzzi, Paris, Bayard, 1997. * Peter Singer, ''The Most Good You Can Do. How Effective Altruism Is Changing Ideas About Living Ethically'', New Haven, Yale University Press, 2015. * Elliott Sober et David Sloan Wilson, ''Unto Others: The Evolution and Psychology of Unselfish Behavior'', Cambridge, Harvard University Press, 1998. * Richard Titmuss, ''The Gift Relationship. From Human Blood to Social Policy'' (1970), Londres, LSE Books, 1997. * Susan Wolf, « Moral Saints », ''Journal of Philosophy'', vol. 79, n° 8, 1982, p. 419-439. ===Ouvrages collectifs et articles=== * Jerome Barkow, Leda Cosmides et John Tooby (dir.), ''The Adapted Mind: Evolutionary Psychology and the Generation of Culture'', New York, Oxford University Press, 1992. * Jacob J. Boomsma, « Lifetime Monogamy and the Evolution of Eusociality », ''Philosophical Transactions of the Royal Society B'', vol. 364, 2009, p. 3191-3207. * Stephen Darwall, ''The British Moralists and the Internal 'Ought': 1640-1740'', Cambridge, Cambridge University Press, 1995. * Jonathan Dancy, ''Ethics Without Principles'', Oxford, Clarendon Press, 2004. * Hilary Greaves et Theron Pummer (dir.), ''Effective Altruism. Philosophical Issues'', Oxford, Oxford University Press, 2019. * William D. Hamilton, « The Genetical Evolution of Social Behaviour », ''Journal of Theoretical Biology'', vol. 7, 1964, p. 1-52. * Rosalind Hursthouse, ''On Virtue Ethics'', Oxford, Oxford University Press, 1999. * Christine Korsgaard, ''The Sources of Normativity'', Cambridge, Cambridge University Press, 1996. * Jacques Lecomte, ''La Bonté humaine. Altruisme, empathie, générosité'', Paris, Odile Jacob, 2012. * Jacob Neusner et Bruce D. Chilton (dir.), ''Altruism in World Religions'', Washington, Georgetown University Press, 2005. * Ellen Frankel Paul, Fred D. Miller et Jeffrey Paul (dir.), ''Altruism'', Cambridge, Cambridge University Press, 1993. * Peter Singer, « Famine, Affluence, and Morality », ''Philosophy & Public Affairs'', vol. 1, n° 3, 1972, p. 229-243. * Robert L. Trivers, « The Evolution of Reciprocal Altruism », ''Quarterly Review of Biology'', vol. 46, 1971, p. 35-57. * Bernard Williams, ''L'Éthique et les limites de la philosophie'' (1985), trad. fr. Marie-Anne Lescourret, Paris, Gallimard, 1990. * Carolyn Zahn-Waxler, E. Mark Cummings et Ronald Iannotti (dir.), ''Altruism and Aggression. Social and Biological Origins'', Cambridge, Cambridge University Press, 1991. {{Autocat}} [[Catégorie:Psychologie]] pjh20ini8klq6d3ntg7od04enfasqz2 Dictionnaire de philosophie/Absolutisme 0 83038 767972 767297 2026-06-18T04:50:50Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 767972 wikitext text/x-wiki {{DicoPhilo|Absolutisme|lecture=oui}} L'absolutisme est une forme de gouvernement dans laquelle le souverain revendique une [[Dictionnaire de philosophie/Autorité|autorité]] suprême et indivisible, sans contre-pouvoir institutionnel régulier capable de limiter l'exercice de son pouvoir législatif et exécutif. Dans la terminologie du droit romain, qui a joué un rôle central dans plusieurs constructions savantes de l'absolutisme continental, le souverain est ''legibus solutus'' : délié des lois qu'il édicte lui-même. Cette formule, on le verra, n'implique pourtant pas l'absence de toute contrainte doctrinale ou coutumière. L'absolutisme désigne principalement les monarchies européennes, et en particulier celles de France, d'Espagne, de Russie et de Prusse, du milieu du XVIe siècle à la fin du XVIIIe siècle, étant entendu que la chronologie varie selon les pays : l'absolutisme brandebourgeois-prussien et l'absolutisme russe relèvent surtout des XVIIe et XVIIIe siècles.<ref>Anthony Pagden, « Absolutism », in Edward Craig (ed.), ''Routledge Encyclopedia of Philosophy'', Volume 1, London and New York, Routledge, 1998, p. 28-32</ref> Toutefois, une forme d'absolutisme a existé dans presque tous les [[Manuel de terminale de philosophie/État|États]] européens jusqu'à la fin du XVIIIe siècle. ==Le mot et la chose== ===Une catégorie forgée après coup=== Le terme « absolutisme » lui-même est récent : forgé à la toute fin du XVIIIe siècle, on le relève dès 1796 dans la France postrévolutionnaire, où il sert à qualifier, et surtout à disqualifier, le régime politique qui avait précédé la Révolution française. Son usage ne se répandit vraiment qu'au cours du XIXe siècle, et le mot ne figure dans le ''Dictionnaire de l'Académie française'' qu'à partir de 1878. Bien que le terme soit récent, le concept lui-même et les pratiques auxquelles il se réfère ont marqué plusieurs siècles d'histoire européenne. ===La difficulté d'une définition univoque=== Comme la plupart des termes politiques, l'absolutisme n'est pas un concept univoque. L'historiographie contemporaine a souligné la difficulté qu'il y a à en faire une catégorie homogène : le mot recouvre des réalités institutionnelles très diverses et sert autant à décrire des pratiques de gouvernement qu'à désigner un discours de légitimation du pouvoir royal.<ref>Fanny Cosandey et Robert Descimon, ''L'Absolutisme en France. Histoire et historiographie'', Paris, Seuil, collection « Points Histoire », 2002, p. 7-15</ref> Plutôt qu'un système doctrinal figé, l'absolutisme se laisse mieux décrire comme un faisceau de questions liées : la nature de la souveraineté, le fondement de l'autorité du souverain, les limites de son pouvoir et son effectivité historique. C'est en suivant ces quatre questions que l'on peut en restituer les articulations. ==Le problème de la souveraineté : qu'est-ce qu'un pouvoir « absolu » ?== La première question porte sur le concept même de pouvoir absolu, c'est-à-dire sur ce que signifie, pour une autorité, d'être souveraine. ===Une autorité suprême, indivisible et perpétuelle=== C'est Jean Bodin (1530-1596) qui, dans ''Les six livres de la République'' (1576), donne à la souveraineté sa première théorisation systématique.<ref>Jean Bodin, ''Les six livres de la République'', Paris, Jacques du Puys, 1576. Édition critique bilingue par Mario Turchetti, texte établi par Nicolas de Araujo, Paris, Classiques Garnier, 2013 pour le Livre premier</ref> Pour Bodin, l'État, qu'il nomme la « République », était le gouvernement légitime de plusieurs familles. Le souverain occupait la même position vis-à-vis de la société que le père vis-à-vis des membres de sa famille, ce qui lui conférait un pouvoir absolu et incontesté sur eux. La souveraineté, qui allait devenir le terme clé dans toutes les discussions ultérieures sur l'autorité royale, pouvait ainsi être définie comme « la puissance de donner loi aux sujets en général sans leur consentement ».<ref>Bodin, ''Les six livres de la République'', livre I, chapitre 10 (« Des vrayes marques de souveraineté ») ; la définition de la souveraineté comme « puissance absolue et perpétuelle » figure au chapitre 8</ref> L'autorité légale et l'État lui-même devenaient ainsi une expression de la volonté législative du roi. Toutefois, comme l'ont montré Quentin Skinner et Julian Franklin, la théorie bodinienne de la souveraineté ne se réduit pas à une apologie du pouvoir sans bornes : Bodin distingue soigneusement la monarchie « royale » ou « légitime » de la monarchie « tyrannique », et maintient que le souverain, tout en étant au-dessus des lois civiles, reste lié par le droit naturel, le droit des gens et les lois fondamentales du royaume.<ref>Quentin Skinner, ''The Foundations of Modern Political Thought'', vol. 2 : ''The Age of Reformation'', Cambridge, Cambridge University Press, 1978, p. 284-301 ; Julian H. Franklin, ''Jean Bodin and the Rise of Absolutist Theory'', Cambridge, Cambridge University Press, 1973</ref> ===Le souverain et la loi : le roi est-il la source du droit ?=== L'absolutisme désigne avant tout une pratique de gouvernement et une théorie de l'autorité législative. Dans sa prétention doctrinale, il soutient que le souverain possède une autorité exécutive et législative exclusive, et que par conséquent les lois qu'il édicte constituent une expression de sa volonté. Dans la formule utilisée par le juriste romain Ulpien et reprise sous diverses formes par les monarques absolus : « ce qui plaît au prince a force de loi » (''quod principi placuit, legis habet vigorem'').<ref>Anthony Pagden, art. cit., p. 28</ref> Les principales constructions juridiques de l'absolutisme affirment, en substance, que les rois modernes possèdent la même autorité (fréquemment décrite par le terme ''imperium'') que celle autrefois exercée par les empereurs romains. Pour soutenir cette prétention, le droit coutumier local, fondé sur les usages de la communauté, a été progressivement concurrencé en Europe continentale aux XVIe et XVIIe siècles par le droit romain savant, reçu dans les universités et les cours de justice sous le nom d{{'}}''ius commune''.<ref>Quentin Skinner, ''The Foundations of Modern Political Thought'', vol. 2 : ''The Age of Reformation'', Cambridge, Cambridge University Press, 1978, p. 113-123</ref> L'Angleterre constitua moins une exception marginale qu'un véritable contre-modèle. La tradition de la ''common law'', adossée à la doctrine de l'''Ancient Constitution'', y refusait que le roi pût être la source unique du droit : le souverain restait tenu par un ensemble de coutumes immémoriales que les juges, et non lui seul, avaient charge d'interpréter. C'est sur ce terrain que l'ambition des Stuarts se heurta à une résistance qui culmina dans l'exécution de Charles Ier en 1649. L'absolutisme représentait donc une tentative de renverser les théories largement contractualistes de l'autorité qui s'étaient développées après l'effondrement de l'Empire romain. Ces théories soutenaient que le roi tirait son autorité d'un contrat avec le peuple, à qui Dieu avait directement accordé le pouvoir. Les lois étaient faites par les assemblées représentatives du peuple et administrées par le roi, dont le rôle était celui d'un magistrat et non d'un juge. Bien qu'en pratique le peuple ait eu peu de moyens pour se débarrasser d'un souverain, il existait des garanties substantielles pour leurs droits collectifs. Dans les versions les plus strictement absolutistes, la limite supérieure du pouvoir législatif du monarque était constituée par les lois divines et naturelles qui, puisqu'il n'existait personne d'autre que Dieu pour les faire respecter, ne fournissaient que les contraintes les plus ténues. Les lois positives du roi pouvaient encore faire l'objet d'une interprétation par les magistrats et les juristes, dans des limites étroites que les souverains absolus, de Justinien à Napoléon, cherchèrent à réduire par la codification ; elles n'en demeuraient pas moins impératives.<ref>Anthony Pagden, art. cit., p. 29</ref> ==Le problème du fondement : d'où vient l'autorité du souverain ?== Définir la souveraineté ne dit pas encore d'où le souverain tient son autorité. Sur ce point, les théoriciens de l'absolutisme se partagent entre plusieurs réponses. ===Le droit divin (Bossuet)=== Malgré son noyau essentiellement juridique, l'absolutisme n'était nullement une théorie unique ou unitaire. Dans sa forme la plus extrême, il maintenait que le pouvoir du souverain dérivait directement de Dieu, en tant que source de toutes les choses créées. Cette doctrine, connue sous le nom de droit divin, trouva son représentant le plus puissant en Jacques-Bénigne Bossuet (1627-1704). Bossuet faisait dériver le pouvoir du souverain directement de Dieu, source de toute autorité : les rois sont les lieutenants de Dieu sur la Terre et ne sont, à ce titre, responsables que devant lui seul.<ref>Jacques-Bénigne Bossuet, ''Politique tirée des propres paroles de l'Écriture Sainte'', édition critique avec introduction et notes par Jacques Le Brun, Genève, Droz, 1967 [posthume 1709]</ref> Bossuet définit quatre caractères de l'autorité royale de droit divin. Le pouvoir royal est, premièrement, sacré : « Dieu établit les rois comme ses ministres et règne par eux sur les peuples. Les princes agissent comme ministres de Dieu et ses lieutenants sur la Terre. C'est par eux qu'il exerce son empire. Le trône royal n'est pas le trône d'un homme, mais le trône de Dieu même ».<ref>Bossuet, ''Politique tirée de l'Écriture sainte'', livre III, article 2, édition Jacques Le Brun, Genève, Droz, 1967</ref> Deuxièmement, le pouvoir royal est paternel : le roi est le père de ses sujets et doit gouverner pour leur bien. Troisièmement, l'autorité royale est absolue : « Il est absolu par rapport à la contrainte, n'y ayant aucune puissance capable de forcer le souverain, qui en ce sens est indépendant de toute autorité humaine ». Enfin, l'autorité royale est soumise à la raison : le roi doit gouverner selon la loi de Dieu et sa conscience chrétienne est censée l'empêcher de s'égarer vers la tyrannie. ===Le contrat et le transfert (Hobbes)=== Cependant, la plupart des théories, y compris celle de Hobbes lui-même, dépendaient d'une version de la théorie du contrat originel. Ces théories se divisaient en deux catégories principales. La première soutenait que l'autorité royale dérivait, comme le pensaient les contractualistes, d'un accord entre le souverain et son peuple, mais que, puisqu'il s'agissait d'un contrat, il impliquait un transfert irréversible de pouvoir. Le peuple pouvait être autorisé dans certaines conditions à résister à ses souverains, mais il ne possédait plus l'autorité de le remplacer. La construction la plus rigoureuse de cette première branche est celle de Thomas Hobbes (1588-1679), qui l'élabore dans le ''Léviathan'' (1651). Pour Hobbes, les hommes vivent à l'état de nature dans une « guerre de tous contre tous » marquée par l'insécurité et la peur. Afin d'assurer leur sécurité, ils décident de passer un contrat mutuel créateur de l'État. Ce contrat est passé entre les hommes de l'état de nature, c'est un contrat interindividuel, mais il est passé au profit d'un tiers bénéficiaire qui devient le souverain, le Léviathan, à la fois souverain, État et gouvernement.<ref>Thomas Hobbes, ''Leviathan'', London, 1651, en particulier les chapitres XVII et XVIII. Édition de référence : Richard Tuck (ed.), ''Leviathan'', Cambridge, Cambridge University Press, 1996</ref> Dans ce contrat, chacun renonce non pas à toute liberté, mais à l'exercice individuel des droits dont la jouissance privée rendait impossible la paix commune, dans l'espoir que l'État ainsi créé apportera la paix et la sécurité. Le contrat créateur de l'État est irrévocable, sauf dans deux hypothèses : si l'État se trouve détruit par une grande défaite militaire ou par une guerre civile. La souveraineté de l'État est absolue : par le pacte, les hommes ont transféré au Léviathan la quasi-totalité des droits dont l'exercice individuel rendait impossible la paix commune, à l'exception du droit inaliénable de se conserver. Il n'y a aucune réciprocité : le souverain n'est pas partie au contrat et ne s'engage à rien envers les cocontractants. Son autorité demeure pourtant intelligible par la fin pour laquelle elle est instituée, la paix et la sécurité. La souveraineté de l'État n'est limitée par aucune autorité humaine supérieure ni par aucune loi civile extérieure au souverain. Pour Hobbes comme pour Bodin, la marque essentielle de la souveraineté est le fait de donner ou de casser les lois. Il n'y a de lois que par le consentement exprès ou tacite du souverain. Le souverain est donc maître absolu de la loi et c'est dans la loi que le souverain fixe le juste et l'injuste. Hobbes esquisse ainsi une forme de positivisme juridique : le droit civil n'existe que par l'autorité souveraine, même s'il maintient une distinction entre le droit naturel, la loi naturelle et la loi civile. ===La délégation populaire : Suárez, un cas limite=== La seconde théorie se situe à la frontière de l'absolutisme et des doctrines de la souveraineté populaire. Son représentant le plus puissant, le théologien et juriste jésuite espagnol Francisco Suárez (1548-1617), soutenait que l'autorité de tous les souverains dérivait d'une délégation de pouvoir consentie par le peuple.<ref>Francisco Suárez, ''Tractatus de legibus ac Deo legislatore'', Coimbra, 1612</ref> Bien que, comme le droit divin, cela conférât au souverain une autorité législative et exécutive absolue, cela signifiait que le peuple pouvait, en dernier recours ou si le trône devenait vacant, récupérer cette autorité. Pour cette raison, Suárez, comme la plupart des jésuites, acceptait que le tyrannicide pût être un moyen acceptable de se débarrasser d'un souverain injuste, une position qui conduisit à l'autodafé public de ses écrits, en particulier de sa ''Defensio fidei catholicae'' (1613), tant à Londres qu'à Paris. Par ces traits (réversibilité du pouvoir, légitimité conditionnelle, admission du tyrannicide), Suárez relève moins de l'absolutisme au sens strict que d'une scolastique de la souveraineté déléguée, dont Bodin, Bossuet et Hobbes s'écartent nettement. ==Le problème des limites : l'absolu est-il l'arbitraire ?== Reste à savoir si un pouvoir absolu est, pour autant, un pouvoir sans bornes. Les théoriciens de l'absolutisme ont constamment refusé cette équivalence. ===Absolutisme et despotisme=== Sur ces deux conceptions, qu'il s'agisse du droit divin ou du contractualisme, le peuple conservait certains droits en tant qu'individus, notamment celui de la légitime défense, et, pour Bodin, le droit de propriété. Ayant abandonné, dans la formulation de Hobbes, à la fois leur volonté et leur jugement à leurs souverains, ils étaient entièrement soumis à eux, mais ils restaient des agents libres. De plus, bien que sa personne et l'État soient devenus une seule entité, le souverain n'avait pas de droits de propriété sur l'État et ne pouvait donc en aliéner aucune partie. Il existait donc une distinction, bien que des théoriciens juridiques ultérieurs comme Montesquieu la rejettent comme illusoire, entre absolutisme et despotisme. Même Bossuet était prêt à le concéder : le gouvernement d'un roi devait être absolu, mais jamais, comme on pensait que celui des sultans ottomans l'était, arbitraire.<ref>Anthony Pagden, art. cit., p. 30</ref> ===Les lois fondamentales, le droit naturel et la loi divine=== Contrairement à l'opinion commune et malgré les théories de ses principaux penseurs, l'absolutisme monarchique comportait dans la pratique certaines limites. La France de la monarchie absolue n'était pas un pur régime d'arbitraire : elle demeurait structurée par un ordre juridique, coutumier et institutionnel que le roi ne pouvait ignorer sans fragiliser la légitimité de sa charge. C'est d'ailleurs l'un des paradoxes centraux de l'absolutisme que les historiens du droit ont le plus travaillé : le prince pouvait être pensé à la fois comme « absolu », c'est-à-dire délié des lois civiles, et comme « limité » par un ensemble de normes qu'il ne pouvait enfreindre sans sortir de l'exercice légitime de sa charge.<ref>Arlette Jouanna, ''Le Prince absolu. Apogée et déclin de l'imaginaire monarchique'', Paris, Gallimard, 2014, p. 9-25</ref> Les lois fondamentales du royaume constituaient un ensemble de règles non écrites mais reconnues qui encadraient l'exercice du pouvoir royal. Ces lois, issues de la tradition et de la coutume, définissaient notamment les règles de succession au trône (loi salique excluant les femmes et leur descendance), l'inaliénabilité du domaine de la Couronne (le roi ne pouvait vendre les terres du royaume), et la catholicité du roi (le souverain devait être catholique). Pour Bodin, une monarchie réglée était fondamentalement différente d'une monarchie tyrannique. La théorie absolutiste de Bodin indiquait que dans une monarchie réglée, le roi se devait de respecter la propriété des biens de ses sujets et les lois fondamentales. Le roi était « absolu » au sens où il ne dépendait d'aucune autorité supérieure à lui dans l'ordre temporel, mais il n'était pas pour autant délié de toute contrainte juridique ou morale. Néanmoins, le roi, soumis aux lois divines, devait se conformer au droit naturel, c'est-à-dire à l'ensemble des règles qui déterminent la nature humaine et sa place dans l'ordre de la création. Cette limite, certes théorique puisqu'aucune instance humaine ne pouvait la faire respecter, n'en était pas moins constamment rappelée par les théoriciens de l'absolutisme eux-mêmes. Bossuet insistait sur le fait que le pouvoir absolu n'était pas le despotisme : « Le gouvernement est absolu, mais il n'est pas arbitraire ». Le roi devait gouverner selon la loi de Dieu et sa conscience chrétienne était censée l'empêcher de s'égarer vers la tyrannie. Bossuet utilisait la métaphore paternelle pour envisager le pouvoir royal : le roi, en tant que père de ses sujets, devait veiller à leur salut et à leur bien-être. Il devait respecter les propriétés de ses sujets ainsi que l'ordre juridique dont il était lui-même une source. Dans la tradition scolastique espagnole, représentée notamment par Suárez, la limitation du pouvoir royal par le droit naturel était encore plus marquée. Bien que le pouvoir provienne de Dieu, il passe par le peuple qui le délègue au roi. Le monarque exerce donc une fonction au service du bien commun et son autorité trouve sa limite dans la loi naturelle qui s'impose à tous les hommes, y compris aux souverains. ===La nécessité et la raison d'État=== Ces limites avaient cependant leur revers. En pratique, le roi devait, autant que possible, consulter les représentants de ses sujets, mais il n'était pas obligé de suivre leurs conseils. Il devait aussi se conformer à ses propres lois et respecter la coutume locale. Mais tous les absolutistes admettaient que de telles contraintes pouvaient être mises de côté en cas de nécessité. Le concept de ''necessitas'', qui autorisait à suspendre l'ordre juridique ordinaire et que l'on rattachait étroitement aux théories de la raison d'État, devint ainsi un terme clé dans le vocabulaire de l'absolutisme. ==Le problème de l'effectivité : l'absolutisme a-t-il existé ?== Ces constructions doctrinales décrivent un pouvoir de droit. Reste à mesurer ce qu'il en fut dans les faits. ===Les origines : crise féodale et formation de l'État=== En tant que théorie, l'absolutisme émergea en Europe, et en particulier en France, à la fin du XVIe et au début du XVIIe siècle, en réponse aux longues guerres civiles entre la Couronne et la noblesse connues sous le nom de guerres de Religion. Si les origines de l'absolutisme font encore débat parmi les historiens, plusieurs familles d'interprétation rattachent sa formation à une crise de l'ordre féodal qui aurait pris forme à partir du XVe siècle. Dans une première famille d'interprétations, d'inspiration plutôt intellectualiste et culturelle, l'absolutisme aurait été la réponse à une crise intellectuelle et morale. Le foisonnement intellectuel de la Renaissance, la Réforme protestante et la révolution scientifique auraient remis en question la conception du monde féodal, causant une crise de légitimation de l'autorité qui aurait à son tour contribué à l'instabilité politique et favorisé les guerres. L'absolutisme aurait alors été la réponse à cette crise intellectuelle ayant remis en question l'ordre politique féodal et ses processus de légitimation, en affirmant la nécessité d'une autorité souveraine centralisée d'origine divine. Un deuxième type d'explication met l'accent sur une crise de l'ordre international et les impacts d'un processus de militarisation au centre de la dynamique de formation des États modernes. Dans ce modèle, défendu notamment par Perry Anderson dans une perspective marxiste, les élites politiques contrôlant l'État auraient cherché à accroître leur pouvoir de taxation au détriment des nobles et des paysans en construisant un appareil militaire leur permettant de concentrer plus de ressources dans leurs mains. Anderson interprète l'État absolutiste comme un « appareil de domination féodale recomposé », c'est-à-dire non pas comme le signe d'une bourgeoisie montante, mais comme la réponse de la noblesse à la crise du servage. Ce processus aurait été favorisé par des changements importants dans les technologies militaires : l'apparition de la poudre à canon notamment aurait contribué à rendre obsolètes les fortifications qui permettaient à de petits groupes de nobles armés d'exercer un contrôle militaire et politique sur de petits États fragmentés.<ref>Perry Anderson, ''Lineages of the Absolutist State'', London, New Left Books, 1974, p. 15-42</ref> À ces lectures d'ensemble s'opposent des approches plus institutionnelles, souvent dites révisionnistes, qui insistent moins sur une logique globale que sur les pratiques concrètes du gouvernement : vénalité des offices, réseaux de clientèle, négociation fiscale et administration quotidienne. Malgré ses habits archaïques, l'absolutisme relevait pour l'essentiel d'une conception moderne de l'autorité publique. Comme le souligne Anthony Pagden, des auteurs aussi différents que Bodin, Hobbes, Suárez ou Bossuet pensaient déjà la fonction législative comme un instrument destiné à protéger l'intérêt de la communauté tout entière, et non comme le simple privilège d'une personne. Chacun à sa manière tirait la même conclusion : faute d'une instance dont l'autorité fût reconnue et localisée sans ambiguïté, une société resterait exposée aux déchirements qui avaient ravagé la France au XVIe siècle et l'Angleterre au XVIIe.<ref>Anthony Pagden, art. cit., p. 31</ref> De nombreux historiens ont soutenu que, malgré le vaste corpus de littérature théorique soutenant le gouvernement absolu, le pouvoir des monarques du début de l'époque moderne n'a jamais été en fait complet.<ref>Cette thèse révisionniste est notamment développée par Nicholas Henshall, ''The Myth of Absolutism. Change and Continuity in Early Modern European Monarchy'', London, Longman, 1992.</ref> Mais aucun pouvoir d'État ne l'est jamais. La théorie de la souveraineté absolue concernait le pouvoir de ''jure'' et non de ''facto''. À la fin du XVIIe siècle, néanmoins, les souverains d'Espagne, de France, de Suède, de Russie et de grandes parties de l'Allemagne avaient obtenu un contrôle effectif sur toutes les forces armées et les communications à l'intérieur de leurs territoires. Leurs sujets pouvaient les défier, mais ils ne contestaient jamais systématiquement leur droit de gouverner. L'absolutisme cherchait à établir de cette manière le pouvoir incontesté de l'État sur les nombreux intérêts factionnels et régionaux qui avaient gouverné les sociétés médiévales. Aux XVIe et XVIIe siècles, ce pouvoir était incarné dans les rois. Mais, comme le disait Hobbes, peu importait vraiment si le souverain était un ou plusieurs. ===L'écart entre le discours et le gouvernement=== L'historiographie contemporaine a souligné l'écart important qui pouvait exister entre le discours que la monarchie tenait sur elle-même et le fonctionnement effectif de l'État. Cosandey et Descimon ont montré que l'absolutisme français relevait autant d'une construction symbolique et discursive que d'une réalité institutionnelle homogène. Plutôt que de parler d'un absolutisme monarchique comme d'un système achevé, il conviendrait ainsi de reconnaître la persistance d'une collégialité dans la direction des affaires provinciales et le maintien de nombreux corps intermédiaires (parlements, états provinciaux, corps de ville) qui négociaient en permanence avec le pouvoir central.<ref>Fanny Cosandey et Robert Descimon, ''L'Absolutisme en France. Histoire et historiographie'', Paris, Seuil, collection « Points Histoire », 2002, p. 135-178</ref> Sur le plan institutionnel, l'absolutisme niait aux assemblées représentatives tout pouvoir législatif ou exécutif. Dans la Castille des Habsbourg, les ''Cortes'' avaient été réduites à un simple organe de vote de l'impôt dès le milieu du XVIe siècle. La monarchie hispanique demeurait toutefois une monarchie composite, où les institutions d'Aragon, de Catalogne, de Valence ou de Navarre conservaient des libertés (les ''fueros'') que le pouvoir castillan ne parvint pas à réduire au même modèle. En France, les États généraux tombèrent en désuétude après 1614, et en 1673 le Parlement de Paris fut tenu d'enregistrer les édits royaux avant de pouvoir présenter ses remontrances, ce qui privait celles-ci de tout effet. L'historien Joël Cornette a toutefois montré que cette mise à l'écart des corps intermédiaires ne fut ni linéaire ni complète. L'affirmation de la souveraineté royale passait aussi par la guerre et la fiscalité extraordinaire, c'est-à-dire par des pratiques qui supposaient elles-mêmes des négociations permanentes avec les pouvoirs locaux.<ref>Joël Cornette, ''Le Roi de guerre. Essai sur la souveraineté dans la France du Grand Siècle'', Paris, Payot, 1993</ref> Le fonctionnement complexe de l'État absolutiste impliquait, de la part du roi, de composer en permanence avec des pouvoirs en place. La centralisation était sinueuse plutôt que linéaire. L'envoi d'intendants, agents par excellence du renforcement du pouvoir royal, apparaît certes comme un outil efficace : leur mission extraordinaire sous Louis XIII devient ordinaire avec Colbert. Mais doit-on opposer strictement officiers et commissaires ? Ils sont issus du même milieu ; et, avec les pouvoirs locaux, la monarchie joue sur deux plans : modernisateur et autoritaire d'un côté, traditionnel et conciliant de l'autre. Ce constat a conduit certains historiens à préférer au terme « absolutisme » des expressions plus prudentes comme « monarchie administrative » ou « monarchie tempérée par la pratique », afin de mieux rendre compte de la distance entre la prétention du discours royal et les contraintes effectives du gouvernement. ==Critiques et postérité== L'édifice absolutiste fut contesté de l'extérieur par les penseurs libéraux, réformé de l'intérieur par certains souverains, puis transformé par la Révolution, qui lui légua une part de ses instruments. ===Les critiques libérales et les Lumières=== Aux XVIIe et XVIIIe siècles, l'absolutisme est progressivement critiqué par les théoriciens libéraux et les philosophes des Lumières. Ces penseurs remettent en cause les fondements théologiques et juridiques de l'absolutisme au nom de la raison, de la liberté et des droits naturels de l'homme. John Locke (1632-1704), dans ses ''Deux traités du gouvernement civil'' (vers 1680), propose une alternative libérale à l'absolutisme hobbesien. Pour Locke, les hommes possèdent à l'état de nature des droits naturels inaliénables, la vie, la liberté et la propriété, que le contrat social a pour fonction de protéger et non d'abolir. Le pouvoir politique légitime est donc nécessairement limité par ces droits fondamentaux. Locke affirme explicitement un droit de résistance lorsque le gouvernement viole de manière manifeste les droits des citoyens.<ref>John Locke, ''Two Treatises of Government'', London, circa 1680, publié en 1689 ; voir notamment, dans le ''Second traité'', le chapitre II (sur l'état de nature et les droits naturels) et le chapitre XIX (sur la dissolution du gouvernement et le droit de résistance). Édition critique : Peter Laslett (ed.), Cambridge, Cambridge University Press, 1988</ref> Montesquieu (1689-1755), dans ''[[s:De l’esprit des lois|De l'Esprit des lois]]'' (1748), élabore la théorie de la séparation des pouvoirs qui constitue l'une des critiques les plus influentes de l'absolutisme. Il critique la concentration monarchique des pouvoirs et voit dans la séparation, ou la distribution, des fonctions politiques une garantie contre le despotisme. Son analyse l'amène à justifier un modèle de société où les nobles, comme lui, retrouveraient un plus grand rôle politique. Le but de la séparation des pouvoirs est d'empêcher qu'une seule personne ou un groupe restreint de personnes concentre excessivement en leurs mains tous les pouvoirs de l'État : « C'est une expérience éternelle, que tout homme qui a du pouvoir est porté à en abuser ; il va jusqu'à ce qu'il trouve des limites ».<ref>Montesquieu, ''De l'Esprit des lois'', Genève, Barrillot & Fils, 1748, livre XI, chapitre 4</ref> Voltaire (1694-1778) n'est pas un adversaire de tout pouvoir monarchique fort, puisqu'il peut soutenir le despotisme éclairé. Sa critique vise plutôt le fanatisme religieux, l'intolérance et l'arbitraire judiciaire. Il plaide pour la tolérance et la liberté d'expression, ainsi que pour une réduction du pouvoir politique de l'Église et une subordination des autorités religieuses à l'autorité civile. Jean-Jacques Rousseau (1712-1778) préconise dans ''Du Contrat social'' (1762) une forme de souveraineté populaire absolue, dont certains lecteurs ont soutenu qu'elle pouvait à son tour engendrer un despotisme d'un genre nouveau. Il n'en affirme pas moins que la légitimité politique ne peut provenir que de la volonté générale du peuple, et non de la volonté arbitraire d'un monarque.<ref>Jean-Jacques Rousseau, ''Du Contrat social ou Principes du droit politique'', Amsterdam, Marc Michel Rey, 1762</ref> ===Le despotisme éclairé=== À la fin du XVIIIe siècle, certains souverains européens tentèrent de concilier le maintien du pouvoir absolu avec les idées des Lumières. Cette forme de gouvernement, connue sous le nom de despotisme éclairé, représentait une tentative de réformer l'absolutisme de l'intérieur. Les principaux despotes éclairés (Frédéric II de Prusse, Catherine II de Russie, Joseph II d'Autriche) entretenaient une correspondance suivie avec les philosophes des Lumières et mettaient en œuvre certaines réformes inspirées de leurs idées : amélioration de l'éducation, tolérance religieuse relative, codification des lois, modernisation de l'administration. Cependant, la structure même du pouvoir politique et de la société n'était pas modifiée par ces régimes qui se rapprochaient des autres absolutismes de l'époque. ===De l'absolutisme monarchique à la souveraineté nationale=== Le rapport entre la Révolution française et l'absolutisme est plus complexe qu'une simple rupture. Une interprétation influente, défendue par Tocqueville dans ''L'Ancien Régime et la Révolution'' (1856), soutient que la Révolution, loin de constituer un renversement complet de l'ordre ancien, en prolongea sous certains aspects la dynamique centralisatrice. Selon Tocqueville, la centralisation administrative et la concentration du pouvoir, loin d'être abolies par la Révolution, furent en réalité renforcées : l'État révolutionnaire puis napoléonien hérita des instruments de pouvoir forgés par la monarchie absolue et les perfectionna.<ref>Alexis de Tocqueville, ''L'Ancien Régime et la Révolution'', Paris, Michel Lévy frères, 1856, en particulier le livre II, où est développée la thèse de la continuité centralisatrice</ref> Dans cette lecture, les révolutionnaires, en remplaçant le monarque par une assemblée représentant la nation, assurèrent la transformation de la société française en un État moderne dont la souveraineté, désormais populaire, n'en demeurait pas moins absolue dans son principe. La Révolution aurait ainsi consacré le triomphe de l'idée de souveraineté indivisible, mais transférée du roi à la nation. Cette thèse tocquevillienne de la continuité est cependant contestée. D'autres historiens insistent sur la profondeur de la rupture opérée par la Révolution : l'abolition des privilèges, la Déclaration des droits de l'homme et du citoyen, la mise en place d'un ordre constitutionnel fondé sur la séparation des pouvoirs marquent, selon eux, une transformation qualitative du rapport entre gouvernants et gouvernés qui interdit de réduire la Révolution à un simple prolongement de l'absolutisme monarchique. La question reste ouverte et constitue l'un des débats les plus durables de l'historiographie française. ==Portée philosophique== L'absolutisme occupe une place singulière dans l'histoire de la pensée politique. Il représente à la fois l'aboutissement d'une longue réflexion sur la souveraineté et la puissance publique, et le point de départ des théories modernes de l'État. En affirmant l'existence d'un pouvoir suprême, indivisible et perpétuel, les théoriciens de l'absolutisme ont posé les fondements conceptuels de l'État moderne, tout en suscitant les critiques qui conduiront au constitutionnalisme et au libéralisme politique. Dans une lecture marxiste, illustrée notamment par Perry Anderson, l'absolutisme peut être analysé comme une idéologie de légitimation au service d'une classe dominante, et plus précisément comme une recomposition de la domination nobiliaire. Les théories du droit divin, du contrat social absolutiste ou de la raison d'État y apparaissent comme autant de justifications intellectuelles d'un rapport de forces favorable à la monarchie et à la noblesse de cour. Il serait pourtant réducteur de n'y voir qu'une mystification idéologique. Ses théoriciens ont eu à répondre à des problèmes politiques réels, l'ordre public, la coordination des actions collectives, la résolution des conflits, et leurs solutions ont contribué à la formation de l'État moderne. De là l'ambivalence durable de son héritage : l'absolutisme a permis la construction d'États centralisés et d'administrations efficaces, mais il a aussi légitimé la concentration du pouvoir et étouffé les libertés individuelles et collectives. Les démocraties modernes se sont construites en partie contre lui, tout en héritant de certaines de ses structures, la centralisation administrative, l'idée d'une souveraineté indivisible, la primauté de la loi, qu'elles ont dû adapter au principe de la souveraineté populaire et de l'État de droit. ==Références== {{references|colonnes=2}} ==Bibliographie== ===Sources primaires=== * Jean Bodin, ''Les six livres de la République'', Paris, Jacques du Puys, 1576 ; édition critique bilingue par Mario Turchetti, texte établi par Nicolas de Araujo, Paris, Classiques Garnier, 2013 (Livre premier) * Thomas Hobbes, ''Leviathan'', London, 1651 ; édition critique : Richard Tuck (ed.), Cambridge, Cambridge University Press, 1996 * Jacques-Bénigne Bossuet, ''Politique tirée des propres paroles de l'Écriture Sainte'', posthume, 1709 ; édition critique avec introduction et notes par Jacques Le Brun, Genève, Droz, 1967 * Francisco Suárez, ''Tractatus de legibus ac Deo legislatore'', Coimbra, 1612 * Francisco Suárez, ''Defensio fidei catholicae adversus anglicanae sectae errores'', Coimbra, 1613 * Montesquieu, ''De l'Esprit des lois'', Genève, Barrillot & Fils, 1748 * John Locke, ''Two Treatises of Government'', London, 1689 ; édition critique : Peter Laslett (ed.), Cambridge, Cambridge University Press, 1988 * Jean-Jacques Rousseau, ''Du Contrat social ou Principes du droit politique'', Amsterdam, Marc Michel Rey, 1762 * Alexis de Tocqueville, ''L'Ancien Régime et la Révolution'', Paris, Michel Lévy frères, 1856 ===Études contemporaines=== * Perry Anderson, ''Lineages of the Absolutist State'', London, New Left Books, 1974 ; rééd. Verso, 2013 * William Beik, ''Absolutism and Society in Seventeenth-Century France. State Power and Provincial Aristocracy in Languedoc'', Cambridge, Cambridge University Press, 1985 * J. H. Burns (ed.), ''The Cambridge History of Political Thought, 1450-1700'', Cambridge, Cambridge University Press, 1991 * Joël Cornette, ''Le Roi de guerre. Essai sur la souveraineté dans la France du Grand Siècle'', Paris, Payot, 1993 * Fanny Cosandey et Robert Descimon, ''L'Absolutisme en France. Histoire et historiographie'', Paris, Seuil, collection « Points Histoire », 2002 * John H. Elliott, « A Europe of Composite Monarchies », ''Past and Present'', n° 137, 1992, p. 48-71 * Julian H. Franklin, ''Jean Bodin and the Rise of Absolutist Theory'', Cambridge, Cambridge University Press, 1973 * Nicholas Henshall, ''The Myth of Absolutism. Change and Continuity in Early Modern European Monarchy'', London, Longman, 1992 * Arlette Jouanna, ''Le Prince absolu. Apogée et déclin de l'imaginaire monarchique'', Paris, Gallimard, 2014 * Alain Milhou, ''Pouvoir royal et absolutisme dans l'Espagne du XVIe siècle'', Toulouse, Presses Universitaires du Mirail, 1999 * John Miller (ed.), ''Absolutism in Seventeenth-Century Europe'', Basingstoke, Macmillan, 1990 * Roland Mousnier, ''Les Institutions de la France sous la monarchie absolue, 1598-1789'', 2 volumes, Paris, Presses Universitaires de France, 1974-1980 * Anthony Pagden, « Absolutism », in Edward Craig (ed.), ''Routledge Encyclopedia of Philosophy'', Volume 1, London and New York, Routledge, 1998, p. 28-32 * David Parker, ''The Making of French Absolutism'', London, Edward Arnold, 1983 * Quentin Skinner, ''The Foundations of Modern Political Thought'', 2 volumes, Cambridge, Cambridge University Press, 1978 ==Voir aussi== * Souveraineté * État * Monarchie * Contrat social * Droit divin * Despotisme éclairé * Lumières * Raison d'État {{Autocat}} [[Catégorie:Philosophie politique]] is1uxra0v4rd1lmzurnxoulqt78sv9q Dictionnaire de philosophie/Bioéthique 0 83053 767966 767682 2026-06-18T04:17:35Z PandaMystique 119061 767966 wikitext text/x-wiki {{DicoPhilo|Bioéthique}} == Définition et origines == [[Fichier:Immanuel Kant - Gemaelde 1.jpg|vignette|upright=1.1|Emmanuel Kant : la formule de l'humanité comme fin en soi inspire l'« impératif bioéthique » de Fritz Jahr.]] La '''bioéthique''' constitue un champ interdisciplinaire qui examine les enjeux moraux, juridiques et sociaux soulevés par les avancées de la médecine, des sciences biologiques et des technologies du vivant<ref>Ten Have, H. (2016). ''Global bioethics: An introduction''. Routledge.</ref>. Le terme fut forgé en 1927 par le pasteur protestant allemand Fritz Jahr dans son article « Bio-Ethik: Eine Umschau über die ethischen Beziehungen des Menschen zu Tier und Pflanze », où il appelait au développement d'une éthique écologique englobant toutes les formes de vie<ref>Jahr, F. (1927). « Bio-Ethik: Eine Umschau über die ethischen Beziehungen des Menschen zu Tier und Pflanze ». ''Kosmos'', 24, p. 2-4.</ref>. Jahr formulait à cette occasion un « impératif bioéthique » qui prolonge l'éthique kantienne en l'étendant au-delà de l'humanité : respecter chaque être vivant comme une fin en soi et le traiter, autant que possible, comme tel. Certains historiens situent dès 1926 la première occurrence publique du terme sous sa plume<ref>Sass, H.-M. (2007). « Fritz Jahr's 1927 concept of bioethics ». ''Kennedy Institute of Ethics Journal'', 17(4), p. 279-295.</ref>. Cependant, c'est Van Rensselaer Potter qui popularisa le concept dans les années 1970 avec son ouvrage ''Bioethics: Bridge to the Future'' (1971), envisageant la bioéthique comme un pont entre les connaissances scientifiques et les valeurs humaines<ref>Potter, V. R. (1971). ''Bioethics: Bridge to the future''. Prentice-Hall.</ref>. Déçu par l'orientation médicale étroite que prit le champ, Potter proposa plus tard le terme de « bioéthique globale » (1988) pour réaffirmer l'importance des dimensions écologiques et sociales<ref>Potter, V. R. (1988). ''Global bioethics: Building on the Leopold legacy''. University of Michigan Press.</ref>. Toutefois, le développement institutionnel de la bioéthique s'ancra principalement dans la réflexion sur les pratiques médicales, notamment à la suite des scandales éthiques majeurs du XXe siècle : l'expérimentation nazie en Allemagne, l'étude de Tuskegee sur la syphilis aux États-Unis (1932-1972), et divers abus dans la recherche médicale à travers le monde<ref>Washington, H. (2008). ''Medical apartheid: The dark history of medical experimentation on Black Americans from colonial times to the present''. Anchor Books.</ref>. == Les grandes questions de la bioéthique == Avant d'examiner les écoles et les auteurs, il est utile de dégager le fil qui les relie. La bioéthique naît d'un écart : les pouvoirs que les sciences du vivant confèrent à l'être humain croissent plus vite que les repères moraux capables de les orienter. Réanimation, greffes, procréation assistée, séquençage du génome, prolongation artificielle de la vie : chaque progrès technique ouvre des choix que les morales héritées n'avaient pas anticipés. De cet écart découlent quelques questions récurrentes, que les sections suivantes reprennent sous des angles divers. Qui mérite une protection morale, et à quel titre : l'embryon, l'[[Dictionnaire de philosophie/Animal|animal]], les générations futures ? Jusqu'où s'étend le [[Dictionnaire de philosophie/Droit|droit]] de chacun à décider pour lui-même, et où ce droit rencontre-t-il la vulnérabilité ou la dépendance ? Que devons-nous aux personnes que la médecine ne peut guérir ? Comment répartir équitablement des ressources de santé toujours limitées ? Et quelle responsabilité portons-nous envers une nature et une humanité que nos techniques peuvent altérer durablement ? À ces questions s'opposent de grandes familles de réponses. Certaines pèsent les conséquences des actes, d'autres invoquent des devoirs ou des droits inviolables, d'autres encore partent du caractère de l'agent ou de la trame concrète des relations humaines. Les pages qui suivent parcourent ces réponses sans en consacrer aucune, car l'intérêt de la bioéthique tient à leur confrontation. == Les fondements principialistes == La bioéthique contemporaine s'est largement structurée autour du ''principialisme'', approche développée par Tom Beauchamp et James Childress dans leur ouvrage fondateur ''Principles of Biomedical Ethics'' (1979). Cette méthode identifie quatre principes moraux fondamentaux qui doivent guider la réflexion et la pratique biomédicale<ref>Beauchamp, T. L., & Childress, J. F. (2001). ''Principles of biomedical ethics'' (5e éd.). Oxford University Press.</ref> : * L'[[Dictionnaire de philosophie/Autonomie|autonomie]] : le respect de la capacité des personnes à prendre des décisions éclairées concernant leur propre santé et leur corps. Ce principe sous-tend notamment la pratique du consentement éclairé. * La bienfaisance : l'obligation d'agir pour le [[Dictionnaire de philosophie/Bien|bien]] d'autrui, de promouvoir la santé et le bien-être des patients. * La non-malfaisance : le devoir de ne pas causer de tort, incarné par le précepte hippocratique ''primum non nocere'' (d'abord, ne pas nuire). * La justice : l'exigence d'une distribution équitable des ressources de santé et d'un traitement impartial des personnes. Beauchamp et Childress présentent ces principes comme des obligations ''prima facie'', au sens où Ross emploie cette expression : chacune oblige sauf si elle entre en conflit avec une obligation de même rang, auquel cas il revient au jugement de déterminer laquelle prévaut dans la situation<ref>Ross, W. D. (1930). ''The right and the good''. Oxford University Press.</ref>. Les auteurs ancrent ces principes non dans une théorie éthique unique mais dans la « morale commune » (''common morality''), c'est-à-dire l'ensemble des normes partagées par toutes les personnes sérieusement engagées dans la [[Dictionnaire de philosophie/Morale|vie morale]]. Deux opérations relient ces principes aux cas concrets : la spécification, qui en précise la portée pour un type de situation, et la pondération, qui arbitre leurs conflits ; l'ajustement mutuel des principes et des jugements particuliers emprunte la méthode de l'équilibre réfléchi élaborée par Rawls. Beauchamp et Childress refusent que ces quatre principes forment un algorithme de décision : ils délimitent les questions à poser plutôt qu'ils ne livrent des réponses toutes faites, ce qui distingue le principialisme d'une simple liste de contrôle<ref>Campbell, A. V. (2013). ''Bioethics: The basics''. Routledge.</ref>. Ces quatre principes, parfois désignés comme le « mantra de Georgetown », ont exercé une influence considérable sur le développement de la bioéthique anglo-américaine et ont été intégrés dans de nombreux codes et déclarations internationaux<ref>Gillon, R. (2003). « Ethics needs principles—four can encompass the rest—and respect for autonomy should be "first among equals" ». ''British Medical Journal'', 327, p. 1003-1006.</ref>. Toutefois, cette approche principialiste a fait l'objet de critiques substantielles que nous examinerons ultérieurement. == La déclaration d'Helsinki et les cadres normatifs internationaux == La réflexion bioéthique s'est progressivement institutionnalisée à travers l'adoption de déclarations et de conventions internationales. Le Code de Nuremberg (1947), formulé par le tribunal militaire américain au terme du procès des médecins nazis, en constitue le premier jalon : il fait du « consentement volontaire » du sujet humain la condition sans laquelle aucune expérimentation ne saurait être entreprise, posant le socle de la doctrine du consentement éclairé<ref>Tribunal militaire de Nuremberg (1947). « Permissible Medical Experiments ». Dans ''Trials of War Criminals before the Nuernberg Military Tribunals under Control Council Law No. 10'', vol. 2, p. 181-182. U.S. Government Printing Office, 1949.</ref>. La Déclaration d'Helsinki (1964), élaborée par l'Association médicale mondiale, établit les principes éthiques fondamentaux de la recherche médicale impliquant des sujets humains. Révisée à plusieurs reprises, elle affirme notamment la primauté des intérêts et du bien-être de chaque sujet sur tous les autres intérêts, incluant ceux de la science et de la société. Sa révision la plus récente, adoptée à Helsinki en 2024 lors de la 75e Assemblée générale, constitue désormais la seule version officielle : elle substitue le terme de « participant » à celui de « sujet », renforce la protection des personnes vulnérables et inscrit l'exigence de justice globale au cœur de la conduite de la recherche<ref>World Medical Association (2024). ''Declaration of Helsinki: Ethical principles for medical research involving human participants''. 75e Assemblée générale, Helsinki.</ref>. Sans constituer un traité juridiquement contraignant, la Déclaration exerce sur la recherche médicale mondiale une autorité morale et professionnelle de premier plan, distincte de la force obligatoire d'une convention. L'article publié par Henry Beecher en 1966 dans le ''New England Journal of Medicine'' recensa vingt-deux études cliniques conduites au mépris de l'éthique de la recherche ; il pesa sur l'instauration d'un contrôle institutionnel des protocoles et sur l'affermissement de l'exigence du consentement<ref>Beecher, H. K. (1966). « Ethics and clinical research ». ''New England Journal of Medicine'', 274(24), p. 1354-1360.</ref>. Aux États-Unis, le Rapport Belmont (1979), produit par la Commission nationale pour la protection des sujets humains dans la recherche biomédicale et comportementale, identifie trois principes éthiques fondamentaux : le respect des personnes, la bienfaisance (incluant la non-malfaisance) et la justice<ref>National Commission for the Protection of Human Subjects of Biomedical and Behavioral Research (1979). ''The Belmont Report: Ethical principles and guidelines for the protection of human subjects of research''. Department of Health, Education, and Welfare.</ref>. Ces principes constitueront la matrice conceptuelle dont s'inspireront Beauchamp et Childress pour développer leur approche principialiste. En Europe, la Convention d'Oviedo (1997), officiellement intitulée « Convention pour la protection des droits de l'homme et de la dignité de l'être humain à l'égard des applications de la biologie et de la médecine », représente le premier instrument juridique contraignant au niveau international dans le domaine de la bioéthique. Adoptée par le Conseil de l'Europe, elle place la dignité humaine au cœur de son dispositif normatif, s'inscrivant dans une tradition philosophique kantienne qui contraste avec l'utilitarisme pragmatique dominant dans la bioéthique américaine<ref>Andorno, R. (2005). « The Oviedo Convention: A European legal framework at the intersection of human rights and health law ». ''Journal of International Biotechnology Law'', 2(4), p. 133-143.</ref>. L'UNESCO adopte en 2005 la Déclaration universelle sur la bioéthique et les droits de l'homme, premier instrument normatif mondial non contraignant qui lie explicitement bioéthique et droits humains. Cette déclaration énonce quinze principes, incluant le respect de la dignité humaine, la protection des générations futures, la protection de l'environnement et de la biosphère, reflétant ainsi une vision élargie de la bioéthique plus proche de la conception originelle de Potter<ref>Andorno, R. (2007). « Global bioethics at UNESCO: In defence of the Universal Declaration on Bioethics and Human Rights ». ''Journal of Medical Ethics'', 33, p. 150-154.</ref><ref>UNESCO (2005). ''Universal Declaration on Bioethics and Human Rights''. Organisation des Nations Unies pour l'éducation, la science et la culture.</ref>. == Repères dans le contexte français == Le débat bioéthique français présente une physionomie propre. La France compte parmi les premiers États à s'être dotés d'une instance consultative nationale : le Comité consultatif national d'éthique pour les sciences de la vie et de la santé (CCNE), créé en 1983, rend des avis qui nourrissent la délibération publique sans lier le législateur<ref>Décret du 23 février 1983 portant création du Comité consultatif national d'éthique pour les sciences de la vie et de la santé. Paris.</ref>. Le pays a par ailleurs choisi de légiférer par paliers : une première loi de bioéthique en 1994, qui pose la non-commercialisation du corps humain ainsi que l'anonymat et la gratuité des dons, puis des révisions en 2004, qui institue l'Agence de la biomédecine et prohibe le clonage, en 2011, et en 2021<ref>Loi n° 2021-1017 du 2 août 2021 relative à la bioéthique. ''Journal officiel de la République française'', 3 août 2021.</ref>. La loi du 2 août 2021 a ouvert l'assistance médicale à la procréation aux couples de femmes et aux femmes non mariées, reconnu aux personnes issues d'un don le droit d'accéder à leur majorité à l'identité du donneur, et maintenu un encadrement strict de la recherche sur l'embryon, soumise à l'autorisation de l'Agence de la biomédecine et dont les produits ne peuvent être transférés à des fins de gestation. La même orientation explique l'interdiction, en France, des tests génétiques vendus directement aux particuliers à des fins récréatives : l'examen des caractéristiques génétiques d'une personne reste subordonné à une finalité médicale, scientifique ou judiciaire. Le don d'organes y obéit au principe du consentement présumé : toute personne n'ayant pas fait connaître son refus de son vivant, notamment par inscription au registre national des refus, est réputée donneuse. En matière de fin de vie, la loi Leonetti de 2005, puis la loi Claeys-Leonetti du 2 février 2016, ont prohibé l'obstination déraisonnable, rendu les directives anticipées contraignantes et autorisé, pour les malades en phase terminale, une « sédation profonde et continue » maintenue jusqu'au décès, sans légaliser l'aide active à mourir<ref>Loi n° 2016-87 du 2 février 2016 créant de nouveaux droits en faveur des malades et des personnes en fin de vie. ''Journal officiel de la République française''.</ref>. Un projet en ce sens, qui ouvrirait sous conditions le suicide assisté et, par exception, l'[[Dictionnaire de philosophie/Euthanasie|euthanasie]], a été adopté par l'Assemblée nationale puis rejeté par le Sénat ; le débat législatif s'est poursuivi en 2025-2026<ref>Sénat. « Proposition de loi relative au droit à l'aide à mourir ». Dossier législatif 2024-2025.</ref>. == Les critiques du principialisme et les approches alternatives == Dès la fin des années 1980, le principialisme fait l'objet de critiques substantielles qui conduisent au développement d'approches alternatives. K. Danner Clouser et Bernard Gert dénoncent le principialisme comme une méthode trop abstraite et indéterminée, ne fournissant pas d'orientation suffisante pour résoudre les dilemmes éthiques concrets<ref>Clouser, K. D., & Gert, B. (1990). « A critique of principlism ». ''The Journal of Medicine and Philosophy'', 15(2), p. 219-236.</ref>. Selon eux, les quatre principes ne constituent pas une théorie éthique cohérente mais un catalogue de valeurs sans hiérarchie claire ni procédure de résolution des conflits normatifs. === L'éthique du care et les approches féministes === Les approches féministes en bioéthique, qui émergent dans les années 1990, remettent en question la centralité accordée à l'autonomie individuelle par le principialisme, dénonçant son caractère androcentrique et individualiste<ref>Tong, R. (1997). ''Feminist approaches to bioethics: Theoretical reflections and practical applications''. Westview Press.</ref>. Des philosophes comme Carol Gilligan et Nel Noddings développent une éthique du care (éthique du soin) qui valorise les relations d'interdépendance, la vulnérabilité et la responsabilité envers autrui plutôt que l'autonomie abstraite<ref>Gilligan, C. (1982). ''In a different voice: Psychological theory and women's development''. Harvard University Press.</ref><ref>Noddings, N. (1984). ''Caring: A feminine approach to ethics and moral education''. University of California Press.</ref>. Eva Feder Kittay critique l'idéal de l'individu autonome et indépendant qui sous-tend les théories libérales de la justice, soulignant que tous les êtres humains sont inévitablement dépendants à certains moments de leur existence et que cette vulnérabilité doit être reconnue comme condition humaine fondamentale plutôt que comme déficience<ref>Kittay, E. F. (1999). ''Love's labor: Essays on women, equality, and dependency''. Routledge.</ref>. Martha Fineman développe de manière similaire le concept de « sujet vulnérable », contestant l'idéologie de l'autonomie qui ignore les structures de dépendance et les inégalités structurelles<ref>Fineman, M. A. (2004). ''The autonomy myth: A theory of dependency''. The New Press.</ref>. La bioéthique féministe s'est particulièrement investie dans l'analyse critique des technologies reproductives, dénonçant leur impact disproportionné sur les femmes et les risques d'exploitation qu'elles comportent<ref>Dickenson, D. (2007). ''Property in the body: Feminist perspectives''. Cambridge University Press.</ref><ref>Baylis, F., & McLeod, C. (2014). ''Family-making: Contemporary ethical challenges''. Oxford University Press.</ref>. Susan Sherwin insiste sur la nécessité d'une analyse contextuelle qui prenne en compte les rapports de pouvoir et les inégalités structurelles de genre dans l'évaluation éthique des pratiques biomédicales<ref>Sherwin, S. (1992). ''No longer patient: Feminist ethics and health care''. Temple University Press.</ref>. === L'approche par les capabilités === Martha Nussbaum et Amartya Sen développent l'approche par les capabilités, c'est-à-dire les capacités réelles dont disposent les personnes, qui déplace le centre de l'analyse éthique des ressources ou des utilités vers ce que chacun est en mesure d'accomplir parmi les fonctionnements qu'il valorise<ref>Sen, A. (1999). ''Development as freedom''. Anchor Books.</ref><ref>Nussbaum, M. C. (2006). ''Frontiers of justice: Disability, nationality, species membership''. Harvard University Press.</ref>. Pour Nussbaum, une société juste doit garantir à chaque personne un seuil minimal de dix capabilités centrales, incluant la vie, la santé corporelle, l'intégrité corporelle, les sens, l'imagination et la pensée, les émotions, la raison pratique, l'affiliation, le rapport avec les autres espèces, le jeu et le contrôle sur son environnement. Cette approche offre un cadre particulièrement fécond pour penser les questions de justice en santé, de handicap et de vulnérabilité, permettant d'évaluer les inégalités de santé non seulement en termes de distribution des ressources mais en termes de ce que les personnes sont effectivement capables de faire et d'être<ref>Stenlund, M. (2017). « Nussbaum's capabilities approach meets values-based practice: Promoting the freedom of thought of mental health service users ». ''Journal of Medical Ethics'', 43(12), p. 828-833.</ref>. === L'éthique de la vertu et la tradition néo-aristotélicienne === [[Fichier:Aristotle Altemps Inv8575.jpg|vignette|upright=1.1|Aristote : la sagesse pratique (phronèsis) guide le jugement moral au cas par cas, modèle des éthiques de la vertu.]] Alasdair MacIntyre réhabilite l'éthique de la vertu dans son ouvrage majeur ''After Virtue'' (1981), critiquant l'échec du projet moderne des Lumières visant à fonder la moralité sur des principes rationnels universels détachés des traditions particulières<ref>MacIntyre, A. (1981). ''After virtue: A study in moral theory''. University of Notre Dame Press.</ref>. Pour MacIntyre, les vertus sont des qualités acquises dont l'exercice permet d'atteindre les biens internes aux pratiques sociales. Cette approche insiste sur la formation du caractère moral et le rôle des communautés et des traditions dans l'élaboration des normes éthiques. Edmund Pellegrino applique cette éthique de la vertu à la médecine, arguant que la relation thérapeutique exige des vertus spécifiques chez le praticien (compassion, fidélité, intégrité, abnégation) qui ne peuvent se réduire à l'application mécanique de principes<ref>Pellegrino, E. D., & Thomasma, D. C. (1993). ''The virtues in medical practice''. Oxford University Press.</ref>. Le bien du patient ne peut être déterminé de manière abstraite mais nécessite une appréciation contextualisée et relationnelle. === Le casuisme et l'éthique narrative === Le casuisme, réhabilité par Albert Jonsen et Stephen Toulmin dans ''The Abuse of Casuistry'' (1988), propose une méthode de résolution des dilemmes éthiques fondée sur l'analogie avec des cas paradigmatiques plutôt que sur la déduction à partir de principes abstraits<ref>Jonsen, A. R., & Toulmin, S. (1988). ''The abuse of casuistry: A history of moral reasoning''. University of California Press.</ref>. Cette approche, inspirée de la tradition juridique de la common law, privilégie le raisonnement par cas et la prudence (phronèsis) aristotélicienne ([[s:Éthique à Nicomaque|texte sur Wikisource]]). L'éthique narrative développée par Rita Charon et Hilde Lindemann insiste sur l'importance des récits dans la compréhension des enjeux éthiques et dans la formation de l'identité morale<ref>Charon, R. (2006). ''Narrative medicine: Honoring the stories of illness''. Oxford University Press.</ref><ref>Lindemann, H. (2014). ''Holding and letting go: The social practice of personal identities''. Oxford University Press.</ref>. Les narrations des patients, de leurs proches et des soignants constituent des ressources épistémiques et morales essentielles pour appréhender la complexité des situations cliniques. == Trois figures contemporaines : Singer, O'Neill et Jonas == === Peter Singer et l'utilitarisme préférentiel === [[Fichier:Peter Singer (philosopher).jpg|vignette|upright=1.1|Peter Singer étend la considération morale à tout être sensible, par-delà la seule espèce humaine.]] Peter Singer représente sans doute le philosophe moral le plus influent et controversé en bioéthique contemporaine. Dans ''Animal Liberation'' (1975), il développe une critique du spécisme, concept qu'il emprunte à Richard Ryder, dénonçant la discrimination arbitraire fondée sur l'appartenance à l'espèce<ref>Singer, P. (1975). ''Animal liberation: A new ethics for our treatment of animals''. HarperCollins.</ref>. Pour Singer, le critère moralement pertinent n'est pas la rationalité ou l'appartenance à l'espèce humaine, mais la capacité à ressentir la souffrance (sentience). Dans ''Practical Ethics'' (1979) et ''Rethinking Life and Death'' (1994), Singer applique son utilitarisme préférentiel à des questions bioéthiques fondamentales : l'[[Dictionnaire de philosophie/Avortement|avortement]], l'infanticide dans certaines circonstances, l'euthanasie volontaire et non-volontaire<ref>Singer, P. (1979). ''Practical ethics''. Cambridge University Press.</ref><ref>Singer, P. (1994). ''Rethinking life and death: The collapse of our traditional ethics''. St. Martin's Press.</ref>. Il soutient que le simple fait d'être biologiquement humain ne confère pas de statut moral particulier, et que ce qui importe est la capacité à avoir des préférences concernant sa propre existence future. Les nouveau-nés, n'ayant pas cette capacité, ne seraient donc pas des personnes au sens moral du terme, ce qui rendrait moralement acceptable leur euthanasie dans certaines circonstances où leur vie serait marquée par une souffrance intense. Plus récemment, dans ''The Point of View of the Universe'' (2014), co-écrit avec Katarzyna de Lazari-Radek, Singer révèle son évolution vers un utilitarisme hédoniste plutôt que préférentiel<ref>Singer, P., & de Lazari-Radek, K. (2014). ''The point of view of the universe: Sidgwick and contemporary ethics''. Oxford University Press.</ref>. Ses positions sur l'altruisme efficace, développées dans ''The Life You Can Save'' (2009), ont inspiré un mouvement mondial visant à optimiser l'impact des actions caritatives selon des critères utilitaristes<ref>Singer, P. (2009). ''The life you can save: Acting now to end world poverty''. Random House.</ref>. Les thèses de Singer ont suscité de vives controverses, particulièrement de la part des défenseurs des droits des personnes handicapées qui voient dans ses arguments une forme de capacitisme (ableism) remettant en cause la valeur égale de toutes les vies humaines<ref>Kittay, E. F. (2009). « The personal is philosophical is political: A philosopher and mother of a cognitively disabled person sends notes from the battlefield ». ''Metaphilosophy'', 40(3-4), p. 606-627.</ref>. === Onora O'Neill et l'autonomie kantienne === [[Fichier:Official portrait of Baroness O'Neill of Bengarve (cropped2).jpg|vignette|upright=1.1|Onora O'Neill : l'autonomie n'a de valeur que soutenue par des relations de confiance.]] Onora O'Neill a profondément renouvelé la compréhension de l'autonomie en bioéthique à travers une lecture rigoureuse de Kant ([[s:Fondements de la métaphysique des mœurs|texte sur Wikisource]]). Dans son ouvrage ''Autonomy and Trust in Bioethics'' (2002), issu de ses conférences Gifford, elle critique la conception individualiste et consumériste de l'autonomie qui domine la bioéthique anglo-américaine<ref>O'Neill, O. (2002). ''Autonomy and trust in bioethics''. Cambridge University Press.</ref>. Pour O'Neill, l'autonomie kantienne n'est pas la simple capacité de faire des choix selon ses préférences (conception millienne ; [[s:De la liberté|texte sur Wikisource]]), mais l'aptitude à agir selon des principes rationnels universalisables. Cette autonomie « principielle » implique une dimension sociale et relationnelle fondamentale : on ne peut être autonome de manière purement individuelle. O'Neill souligne le paradoxe contemporain : alors que les dispositifs institutionnels multiplient les garanties formelles de l'autonomie (formulaires de consentement, protection des données), la confiance dans les professionnels de santé et les institutions biomédicales s'érode<ref>Black, D. (2002). « Autonomy and trust in bioethics ». ''Journal of the Royal Society of Medicine'', 95(9), p. 466-467.</ref>. Elle montre que l'obsession pour l'autonomie individuelle peut paradoxalement miner les conditions de confiance nécessaires à une relation thérapeutique authentique. Son travail a exercé une influence considérable sur la réflexion concernant le consentement éclairé et les relations fiduciaires en médecine<ref>López Jara, C. A., & Holguín Lew, J. C. (2013). « Autonomy, trust and medical ethics in Onora O'Neill's work ». ''Revista Colombiana de Psiquiatría'', 42(1), p. 120-135.</ref>. === Hans Jonas et le principe de responsabilité === [[Fichier:Hans Jonas an der Universität St. Gallen (1983) HSGH 022-001945 (cropped).jpg|vignette|upright=1.1|Hans Jonas, ici en 1983 : sa réflexion fonde une éthique de la responsabilité envers les générations futures.]] Le philosophe allemand Hans Jonas a marqué la bioéthique par son ouvrage fondamental ''Das Prinzip Verantwortung'' (Le Principe Responsabilité, 1979), qui représente l'une des premières tentatives systématiques d'élaborer une éthique pour la civilisation technologique<ref>Jonas, H. (1979). ''Das Prinzip Verantwortung: Versuch einer Ethik für die technologische Zivilisation''. Insel Verlag. Traduction française : ''Le Principe Responsabilité''. Cerf, 1990.</ref>. Face aux menaces existentielles que la technoscience fait peser sur l'humanité et la biosphère, Jonas formule un nouvel impératif catégorique : « Agis de façon que les effets de ton action soient compatibles avec la permanence d'une vie authentiquement humaine sur terre ». Jonas développe une éthique de la responsabilité tournée vers l'avenir et les générations futures, fondée sur une « heuristique de la peur » qui nous enjoint d'accorder la priorité aux prophéties de malheur sur les promesses technologiques<ref>Jonas, H. (1992). ''Philosophical explorations and metaphysical speculation''. University of Chicago Press.</ref>. Cette approche précautionniste a profondément influencé l'éthique environnementale et la réflexion sur les risques biotechnologiques. Le principe de précaution, aujourd'hui largement reconnu dans les conventions internationales sur l'environnement, puise l'une de ses sources philosophiques majeures dans la pensée jonassienne<ref>Philosophia (2018). « On Hans Jonas' The Imperative of Responsibility ». ''Philosophia: E-journal of Philosophy and Culture'', 17, p. 191-207.</ref>. Jonas insiste sur l'asymétrie fondamentale entre les générations présentes et futures : ces dernières n'existent pas encore et ne peuvent donc exercer aucune réciprocité, contrairement au modèle contractualiste. La responsabilité envers elles ne peut se fonder sur un accord mutuel mais sur la valeur intrinsèque de la vie et sur le devoir de préserver les conditions d'une existence authentiquement humaine. Son analyse du nouveau-né comme archétype de l'objet de responsabilité - être vulnérable dont la simple existence lance un appel au soin - constitue une contribution majeure à la phénoménologie morale de la vulnérabilité<ref>Grant, A. (2021). « Responsibility to others in the future: The foundation of Hans Jonas's ethics ». ''Philosophy World Democracy'', 1(1), p. 85-103.</ref>. == Les concepts opératoires des débats appliqués == Par-delà les grandes approches théoriques, la bioéthique appliquée mobilise un petit nombre de distinctions conceptuelles qui structurent les controverses sur le début et la fin de vie. Ces outils n'appartiennent à aucune école particulière : ils fixent le vocabulaire commun à partir duquel les théories rivales argumentent. === Le statut moral et la notion de personne === La plupart des débats sur l'avortement, l'euthanasie ou l'expérimentation reposent sur la question du statut moral : quels êtres comptent pour eux-mêmes, et à quel titre une conduite peut leur causer un tort ? La discussion sépare l'appartenance biologique à l'espèce humaine et la qualité de personne entendue au sens moral. Mary Anne Warren propose une série de critères de la personnalité morale, parmi lesquels la [[Dictionnaire de philosophie/Conscience|conscience]], la capacité de raisonner et la conscience de soi, et soutient que l'embryon ne les remplit pas<ref>Warren, M. A. (1973). « On the moral and legal status of abortion ». ''The Monist'', 57(1), p. 43-61.</ref>. À l'opposé, les tenants d'un statut attaché à l'appartenance à l'espèce, ou à la simple potentialité, refusent de faire dépendre la valeur d'une vie de l'exercice effectif de telles capacités. L'enjeu pratique est direct : selon le critère retenu, l'embryon, le fœtus, le nouveau-né ou le patient en état végétatif se voient reconnaître des protections fort différentes. === Sacralité ou qualité de la vie === Une seconde ligne de partage oppose deux manières d'évaluer la vie humaine. La tradition de la sacralité de la vie tient toute vie humaine pour également inviolable et refuse qu'on mette fin à l'une d'elles au motif de son état ; la Congrégation pour la doctrine de la foi en donne une expression normative dans sa déclaration ''Iura et bona'', qui condamne l'euthanasie tout en admettant le refus de traitements disproportionnés<ref>Congrégation pour la doctrine de la foi (1980). ''Déclaration sur l'euthanasie'' (Iura et bona). Rome.</ref>. À cette position, Jonathan Glover oppose une évaluation par la qualité de la vie, qui rapporte l'intérêt de prolonger une existence à ce qu'elle apporte à celui qui la vit<ref>Glover, J. (1977). ''Causing death and saving lives''. Penguin Books.</ref>. Les approches du handicap rappellent toutefois que les jugements de qualité de vie portés de l'extérieur sous-estiment d'ordinaire le bien-être réel des personnes concernées, ce qui invite à la prudence dès qu'une décision médicale s'appuie sur eux. === Tuer et laisser mourir === La distinction entre tuer et laisser mourir, ou entre acte et omission, commande une part des débats sur l'euthanasie et l'arrêt des traitements. La pratique médicale et le droit la tiennent pour pertinente : retirer un traitement de maintien en vie est admis là où l'injection létale est prohibée. L'affaire britannique Tony Bland, jugée en 1993, autorisa l'interruption de l'alimentation artificielle d'un patient en état végétatif persistant et fit de cette distinction un point d'appui juridique<ref>Campbell, A. V. (2013). ''Bioethics: The basics''. Routledge.</ref>. James Rachels en conteste la portée morale : par son argument dit de la différence nue, il compare deux cas identiques en tout sauf qu'un agent tue quand l'autre laisse mourir, et conclut que le mode de [[Dictionnaire de philosophie/Causalité|causation]] ne change pas à lui seul la valeur morale de l'acte<ref>Rachels, J. (1975). « Active and passive euthanasia ». ''New England Journal of Medicine'', 292(2), p. 78-80.</ref>. Franklin Miller, Robert Truog et Dan Brock vont plus loin et soutiennent que la frontière entre arrêt de traitement et mise à [[Dictionnaire de philosophie/Mort|mort]] repose sur des « fictions morales », croyances commodes qui alignent les pratiques admises sur l'interdit de tuer<ref>Miller, F. G., Truog, R. D., & Brock, D. W. (2010). « Moral fictions and medical ethics ». ''Bioethics'', 24(9), p. 453-460.</ref>. === Le double effet === Le principe du double effet, hérité de l'analyse thomiste de la légitime défense, distingue les effets visés d'un acte et ses effets seulement prévus. Une même action peut être permise lorsque sa fin et ses moyens sont bons, que l'effet mauvais n'est pas recherché comme moyen, et que la raison d'agir est proportionnée au mal toléré<ref>Vaughn, L. (2023). ''Bioethics: Principles, issues, and cases'' (5e éd.). Oxford University Press.</ref>. On y recourt notamment pour la sédation en phase terminale : administrer des doses croissantes d'analgésiques afin de soulager la douleur est jugé licite même au risque d'abréger la vie, dès lors que la mort n'est pas l'objectif visé. Des critiques objectent que la frontière entre intention et prévision se laisse aisément reformuler et qu'elle sert parfois à requalifier après coup ce que l'on souhaite autoriser. Ces distinctions ne tranchent pas par elles-mêmes les controverses : elles fournissent un langage partagé que les théories morales, principialiste, conséquentialiste ou vertuiste, investissent ensuite de leurs propres exigences. == Les débats contemporains majeurs (2005-2025) == === La bioéthique du handicap === La bioéthique du handicap (disability bioethics) s'est affirmée comme un courant critique majeur au cours des vingt dernières années. Des philosophes comme Eva Feder Kittay, Jackie Leach Scully, et plus récemment Joel Michael Reynolds et Christine Wieseler, ont développé une critique systématique des présupposés capacitistes qui sous-tendent une grande partie de la réflexion bioéthique dominante<ref>Reynolds, J. M., & Wieseler, C. (2019). ''The disability bioethics reader''. Routledge.</ref><ref>Scully, J. L. (2008). ''Disability bioethics: Moral bodies, moral difference''. Rowman & Littlefield.</ref>. Le capacitisme désigne l'ensemble des attitudes, préjugés et structures sociales qui valorisent les personnes en fonction de leurs capacités physiques et cognitives, présumant que l'absence ou la limitation de certaines capacités diminue la valeur de la vie. Comme le démontre Reynolds, le capacitisme fonctionne comme un « principe conditionnant » en bioéthique, structurant implicitement le sens même de ce qui compte comme vie humaine digne d'être vécue et déterminant quels autres principes seront considérés comme pertinents<ref>Reynolds, J. M. (2021). « Conditioning principles: On bioethics and the problem of ableism ». In E. Victor & L. K. Guidry-Grimes (Eds.), ''Applying nonideal theory to bioethics'' (pp. 99-130). Springer.</ref>. La bioéthique du handicap conteste vivement le « préjugé expressiviste » identifié par Adrienne Asch, selon lequel le diagnostic prénatal et l'avortement sélectif expriment et renforcent des attitudes négatives envers les personnes handicapées<ref>Asch, A. (1999). « Prenatal diagnosis and selective abortion: A challenge to practice and policy ». ''American Journal of Public Health'', 89(11), p. 1649-1657.</ref>. Cette critique s'étend aux débats sur l'euthanasie et l'aide médicale à mourir, où les personnes handicapées constituent un groupe particulièrement vulnérable face aux pressions sociales et aux présomptions concernant la qualité de leur vie<ref>Campbell, S. M., & Stramondo, J. A. (2017). « The complicated relationship of disability and well-being ». ''Kennedy Institute of Ethics Journal'', 27(2), p. 151-184.</ref>. Les recherches empiriques démontrent que, contrairement aux présupposés dominants, les personnes handicapées rapportent des niveaux de bien-être et de satisfaction de vie similaires à ceux de la population générale, une fois que l'adaptation psychologique est prise en compte et que les obstacles sociaux sont levés<ref>Barnes, E. (2016). ''The minority body: A theory of disability''. Oxford University Press.</ref><ref>Bowen, E., MacLeod, A. K., Bowen, R., & Beaumont, J. G. (2025). « Quality of life among people with disabilities: It's complicated ». ''Disability and Society'', 40(1), p. 89-108.</ref>. Ces données remettent en question l'équivalence présumée entre handicap et mauvaise qualité de vie qui sous-tend de nombreux raisonnements bioéthiques. === Le transhumanisme et le posthumanisme === Le transhumanisme représente un mouvement intellectuel et socio-politique « technoprogressiste », c'est-à-dire favorable à l'usage des techniques pour accroître les capacités humaines, qui prône le recours aux biotechnologies pour remodeler l'organisme humain<ref>Porter, A. (2017). « Bioethics and transhumanism ». ''The Journal of Medicine and Philosophy'', 42(3), p. 237-260.</ref>. Il importe de distinguer trois ambitions de portée inégale : l'amélioration thérapeutique, qui restaure une fonction défaillante et recueille un large assentiment ; l'amélioration non thérapeutique, qui augmente des capacités déjà normales et soulève davantage d'objections ; et le projet posthumain proprement dit, qui vise, pour certains transhumanistes, la création d'êtres « posthumains » aux capacités considérablement augmentées. Nick Bostrom, Anders Sandberg et d'autres transhumanistes soutiennent que nous devrions activement chercher à améliorer les capacités cognitives, la longévité et les capacités physiques humaines au-delà de ce que permet la sélection naturelle<ref>Bostrom, N., & Sandberg, A. (2009). « Cognitive enhancement: Methods, ethics, regulatory challenges ». ''Science and Engineering Ethics'', 15(3), p. 311-341.</ref>. Les transhumanistes récusent l'objection selon laquelle l'évolution aurait optimisé les capacités humaines, arguant que la sélection naturelle maximise la reproduction, non le bien-être<ref>Bostrom, N., Sandberg, A., & van der Merwe, M. (2023). « The evolutionary optimality challenge to human enhancement ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 195-217). Springer.</ref>. Ils soutiennent que l'amélioration (enhancement) de l'humeur, des capacités cognitives ou de la longévité pourrait substantiellement accroître le bien-être humain global. Cependant, le projet transhumaniste fait face à des critiques philosophiques et éthiques substantielles. Leon Kass et d'autres « bioconservateurs » dénoncent la vision réductionniste de la nature humaine qu'il véhicule et les risques de déshumanisation qu'il comporte<ref>Kass, L. (2003). « Ageless bodies, happy souls: Biotechnology and the pursuit of perfection ». ''The New Atlantis'', 1, p. 9-28.</ref>. Susan Levin, dans son ouvrage ''Posthuman Bliss? The Failed Promise of Transhumanism'' (2021), développe une critique fondamentale du transhumanisme sur des bases philosophiques et scientifiques, contestant sa conception de la raison, des émotions, de l'esprit, ainsi que sa vision informationnelle de la réalité<ref>Levin, S. B. (2021). ''Posthuman bliss? The failed promise of transhumanism''. Oxford University Press.</ref>. Les inquiétudes éthiques portent notamment sur : les risques d'accroissement des inégalités sociales si les technologies d'amélioration ne sont accessibles qu'aux plus fortunés ; la pression sociale à se « normaliser » ou « s'améliorer » qui pourrait éroder l'autonomie réelle ; les conséquences imprévisibles de modifications biologiques profondes ; et la dissolution potentielle des valeurs humanistes fondamentales<ref>Corby, P. M. (2024). « The philosophical limitations of transhumanism and its societal implications ». ''The Linacre Quarterly'', 91(4), p. 410-428.</ref>. === L'édition génomique et CRISPR-Cas9 === [[Fichier:DNA double helix horizontal.png|vignette|upright=1.1|La double hélice de l'ADN : l'édition du génome par CRISPR-Cas9 a ravivé les débats sur l'amélioration et l'eugénisme.]] L'avènement de la technologie CRISPR-Cas9 a révolutionné les possibilités d'édition du génome avec une précision, une facilité et un coût sans précédent. Brendan Parent analyse les enjeux éthiques soulevés par cette technologie, notamment la distinction entre thérapie génique somatique (modifications non transmissibles) et modifications germinales (transmissibles aux générations futures)<ref>Parent, B. (2023). « Learning from Icarus: The impact of CRISPR on gene editing ethics ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 9-27). Springer.</ref>. Si la thérapie génique somatique pour traiter des maladies graves fait l'objet d'un relatif consensus éthique, l'édition germinale et l'amélioration génétique demeurent hautement controversées. Calum MacKellar développe une critique vigoureuse de l'utilisation de l'édition génomique pour prévenir les handicaps, y voyant une forme d'eugénisme incompatible avec le principe d'égale dignité de tous les êtres humains, sauf si la motivation parentale relève strictement de l'incapacité personnelle à assumer un enfant handicapé<ref>MacKellar, C. (2023). « Bioethical decision making and genome editing ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 29-42). Springer.</ref>. À l'inverse, des philosophes comme Julian Savulescu défendent un « devoir moral de procréation » selon lequel les parents auraient l'obligation de sélectionner ou produire les « meilleurs » enfants possibles<ref>Savulescu, J. (2001). « Procreative beneficence: Why we should select the best children ». ''Bioethics'', 15(5-6), p. 413-426.</ref>. Le scandale de He Jiankui en 2018, lorsque ce chercheur chinois annonça avoir créé les premiers bébés génétiquement modifiés (pour leur conférer une résistance au VIH), illustre l'urgence de régulations internationales robustes et l'insuffisance des cadres éthiques existants pour encadrer ces technologies puissantes<ref>Cyranoski, D., & Ledford, H. (2018). « Genome-edited baby claim provokes international outcry ». ''Nature'', 563, p. 607-608.</ref>. === Une santé globale (One Health) et bioéthique environnementale === La pandémie de COVID-19 a mis en lumière l'interconnexion profonde entre santé humaine, santé animale et santé environnementale, renforçant la pertinence de l'approche One Health (Une seule santé)<ref>Lee, K., & Brummel, Z. L. (2013). « Operationalizing the one health approach: The global governance challenges ». ''Health Policy and Planning'', 28(7), p. 778-785.</ref>. Karori Mbugua et d'autres bioéthiciens soulignent toutefois que cette approche demeure entachée de biais [[Dictionnaire de philosophie/Anthropocentrisme|anthropocentriques]], privilégiant systématiquement la santé humaine au détriment du bien-être animal et de l'intégrité écologique<ref>Mbugua, K. (2024). « Bioethics and One Health: Beyond anthropocentrism ». In L. Omutoko & W. Jaoko (Eds.), ''Bioethics from the global South'' (pp. 83-91). Springer.</ref>. S'inspirant de l'éthique écocentrique d'Aldo Leopold développée dans son essai « The Land Ethic » (1949), plusieurs auteurs plaident pour une extension du cercle de considération morale incluant non seulement les animaux non-humains mais l'ensemble de la communauté biotique<ref>Leopold, A. (1949). ''A sand county almanac and sketches here and there''. Oxford University Press.</ref>. Cette perspective trouve des échos dans les sagesses traditionnelles africaines qui reconnaissent l'interconnexion et l'interdépendance de tous les aspects de la vie, incluant la nature inanimée (montagnes, rivières) dans l'univers moral<ref>Tosam, M. (2019). « African environmental ethics and sustainable development ». ''Journal of Philosophy'', 9(2), p. 172-192.</ref>. La bioéthique environnementale, bien que constituant théoriquement une composante essentielle de la bioéthique (aux côtés de l'éthique médicale et de l'éthique animale), demeure marginalisée dans la pratique académique et institutionnelle<ref>Resnik, D. (2009). « Bioethics and global climate change ». ''Bioethics Forum'', 39(3), p. 1-6.</ref><ref>Ritchie, C. (2016). ''Moving environmental bioethics into the 21st century: Green bioethics and the common good''. Thèse de doctorat, Boston College.</ref>. Cette négligence est particulièrement problématique à l'ère de l'Anthropocène, où l'impact humain sur les systèmes terrestres atteint des niveaux catastrophiques. === La bioéthique globale et la justice épistémique === L'expression « bioéthique globale » désigne à la fois l'extension géographique de la bioéthique au-delà du monde occidental et son élargissement thématique pour inclure les enjeux de santé mondiale, de justice distributive globale et d'équité en santé<ref>Ten Have, H. (2016). ''Global bioethics: An introduction''. Routledge.</ref>. Solomon Benatar, Peter Singer et d'autres ont appelé à recentrer la bioéthique sur les disparités massives en santé globale plutôt que sur les dilemmes de haute technologie de la médecine occidentale<ref>Benatar, S. R., & Singer, P. A. (2010). « Responsibilities in international research: A new look revisited ». ''Journal of Medical Ethics'', 36(4), p. 194-197.</ref>. Toutefois, cette « globalisation » de la bioéthique soulève des questions [[Dictionnaire de philosophie/Épistémologie|épistémologiques]] et politiques cruciales. Des chercheurs issus du Sud global dénoncent l'injustice épistémique qui caractérise la production et la circulation du savoir bioéthique, dominée par les théories, concepts et perspectives du Nord global<ref>Kwete, X., & Tengatenga, J. (2023). « Where is knowledge from the global South? An account of epistemic justice for a global bioethics ». ''Journal of Medical Ethics'', 49, p. 410-417.</ref>. Cette hégémonie épistémique reproduit et légitime des formes de domination néocoloniale dans la recherche biomédicale et les politiques de santé. Jude Thaddaeus Buyondo développe une critique approfondie du principialisme bioéthique depuis une perspective africaine, montrant comment le cadre conceptuel dominant de Beauchamp et Childress échoue à appréhender les réalités sociales, culturelles et économiques de l'Afrique<ref>Buyondo, J. T. (2024). ''The critique of bioethical principlism in contrast to a Black African approach to bioethics''. Wipf & Stock Publishers.</ref>. Il plaide pour une bioéthique holistique enracinée dans les valeurs africaines d'Ubuntu et de solidarité communautaire. Cette exigence de décolonisation épistémique de la bioéthique rejoint les appels féministes pour une bioéthique véritablement pluraliste qui intègre la diversité des perspectives culturelles sans pour autant sacrifier les principes éthiques fondamentaux<ref>Tong, R. (2022). « Towards a feminist global ethics ». ''Bioethics'', 36(1), p. 5-12.</ref>. Le défi consiste à naviguer entre l'écueil du relativisme moral et celui de l'impérialisme éthique, en reconnaissant l'existence de valeurs morales transculturelles tout en demeurant attentif aux contextes particuliers et aux rapports de pouvoir qui structurent les échanges interculturels. == Enjeux méthodologiques contemporains == === La théorie non-idéale et la bioéthique empirique === Charles Mills et d'autres philosophes politiques ont développé la distinction entre théorie idéale et théorie non-idéale<ref>Mills, C. W. (2005). « 'Ideal theory' as ideology ». ''Hypatia'', 20(3), p. 165-184.</ref>. La théorie idéale part d'hypothèses d'obéissance parfaite et de conditions sociales favorables pour élaborer des principes de justice ; la théorie non-idéale part au contraire des conditions d'injustice, d'inégalité et de non-respect des règles qui caractérisent le monde réel. Lisa Tessman, Alison Jaggar et d'autres féministes ont appliqué cette distinction à l'éthique et à la bioéthique<ref>Tessman, L. (2009). ''Feminist ethics and social and political philosophy: Theorizing the non-ideal''. Springer.</ref><ref>Jaggar, A. (2009). « L'Imagination au Pouvoir: Comparing John Rawls's method of ideal theory with Iris Marion Young's method of critical theory ». In L. Tessman (Ed.), ''Feminist ethics and social and political philosophy'' (pp. 59-66). Springer.</ref>. Andrew Neitzke argumente qu'une bioéthique non-idéale doit analyser les structures d'oppression et d'exploitation qui caractérisent la médecine capitaliste contemporaine, plutôt que de se limiter à l'examen de dilemmes individuels dans un contexte présumé juste<ref>Neitzke, A. B. (2021). « Critical theoretical methodology for nonideal contributions to bioethics ». In E. Victor & L. K. Guidry-Grimes (Eds.), ''Applying nonideal theory to bioethics'' (pp. 69-97). Springer.</ref>. La marchandisation de la santé, l'influence de l'industrie pharmaceutique sur la recherche et la pratique médicale, les inégalités structurelles d'accès aux soins constituent des réalités que la bioéthique dominante peine à thématiser. Parallèlement, la bioéthique empirique s'est développée comme méthode intégrant systématiquement les données des sciences sociales (sociologie, anthropologie, psychologie) dans l'analyse éthique<ref>Kon, A. A. (2009). « The role of empirical research in bioethics ». ''American Journal of Bioethics'', 9(6-7), p. 59-65.</ref><ref>Borry, P., Schotsmans, P., & Dierickx, K. (2005). « The birth of the empirical turn in bioethics ». ''Bioethics'', 19(1), p. 49-71.</ref>. Cette approche cherche à dépasser l'opposition stérile entre le « est » (faits empiriques) et le « doit » (normes éthiques), reconnaissant que la compréhension empirique des pratiques, attitudes et conséquences éclaire substantiellement le jugement normatif. Toutefois, cette approche doit éviter le piège naturaliste consistant à dériver directement des normes à partir de descriptions factuelles. === L'éthique de l'intelligence artificielle en santé === L'intégration croissante de l'intelligence artificielle (IA) dans les systèmes de santé soulève des enjeux bioéthiques inédits concernant l'explicabilité (explainability) des algorithmes, la responsabilité en cas d'erreur, les biais discriminatoires encodés dans les données d'entraînement, et la relation thérapeutique médiatisée par la technologie<ref>Morley, J., Machado, C. C. V., Burr, C., Cowls, J., Joshi, I., Taddeo, M., & Floridi, L. (2020). « The ethics of AI in health care: A mapping review ». ''Social Science & Medicine'', 260, 113172.</ref>. Sara Gerke, Jenna Becker et I. Glenn Cohen analysent les défis éthiques et juridiques posés par le développement, la mise en œuvre et la supervision de l'IA dans les soins de santé<ref>Gerke, S., Becker, J., & Cohen, I. G. (2023). « The development, implementation, and oversight of artificial intelligence in health care: Legal and ethical issues ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 441-455). Springer.</ref>. Les systèmes d'IA peuvent reproduire et amplifier les discriminations existantes lorsqu'ils sont entraînés sur des données reflétant les biais sociaux. Par exemple, un algorithme d'allocation des ressources en santé peut systématiquement désavantager certains groupes ethniques si les données historiques reflètent des inégalités d'accès préexistantes. La question de l'explicabilité est particulièrement aiguë : comment obtenir un consentement véritablement éclairé lorsque les décisions médicales sont prises par des systèmes de « boîte noire » dont le fonctionnement demeure opaque même pour leurs concepteurs ? À ces difficultés s'ajoutent la protection des données de santé, particulièrement sensibles, dont la collecte massive alimente ces systèmes, et la dépendance des établissements de soins envers les entreprises privées qui conçoivent et possèdent les algorithmes, laquelle soulève des questions de souveraineté, de transparence et de continuité du service. == Conclusion == La bioéthique des vingt dernières années se caractérise par plusieurs mouvements convergents : une remise en question des fondements principialistes et individualistes hérités des années 1970-1980 ; un élargissement thématique vers les enjeux de justice globale, de santé environnementale et de vulnérabilité ; une attention accrue aux rapports de pouvoir et aux structures d'oppression qui façonnent les pratiques biomédicales ; et un dialogue croissant avec les perspectives non-occidentales et les savoirs issus de l'expérience vécue de la marginalisation. Les philosophes contemporains – Singer, O'Neill, Jonas, Nussbaum, MacIntyre, Kittay, parmi beaucoup d'autres – ont contribué à affiner considérablement notre compréhension des enjeux éthiques soulevés par la biomédecine et la biotechnologie. Leurs désaccords profonds sur des questions fondamentales (la nature de la personne, le statut moral du fœtus ou du nouveau-né, la valeur du handicap, les limites de l'amélioration humaine) reflètent l'absence de consensus philosophique sur ces questions, mais aussi la richesse d'un débat qui demeure vivant et fécond. Face aux défis inédits posés par l'édition génomique, l'intelligence artificielle, les pandémies, le changement climatique et les inégalités structurelles massives en santé, la bioéthique doit continuer à évoluer. Elle doit intégrer plus systématiquement les perspectives des personnes directement affectées par les politiques de santé ; elle doit reconnaître et corriger ses angles morts épistémiques et culturels ; elle doit développer des outils conceptuels capables d'appréhender les enjeux systémiques et structurels plutôt que se limiter aux dilemmes individuels ; et elle doit cultiver l'humilité face à l'incertitude irréductible qui caractérise de nombreuses décisions dans ce domaine. Comme le soulignait Potter, la bioéthique doit rester un « pont » – pont entre les sciences et les humanités, entre le savoir expert et l'expérience vécue, entre les traditions culturelles diverses, et entre le présent et l'avenir. C'est à cette condition qu'elle pourra remplir sa mission fondamentale : contribuer à un monde où les avancées de la connaissance et de la technique servent effectivement le bien de tous les êtres sensibles et la préservation des conditions d'une vie authentiquement humaine sur Terre. == Références == {{references|colonnes=2}} == Bibliographie sélective == * Beauchamp, T. L., & Childress, J. F. (2019). ''Principles of biomedical ethics'' (8e éd.). Oxford University Press. * Barnes, E. (2016). ''The minority body: A theory of disability''. Oxford University Press. * Dickenson, D. (2007). ''Property in the body: Feminist perspectives''. Cambridge University Press. * Kittay, E. F. (1999). ''Love's labor: Essays on women, equality, and dependency''. Routledge. * Leopold, A. (1949). ''A sand county almanac and sketches here and there''. Oxford University Press. * MacIntyre, A. (1981). ''After virtue: A study in moral theory''. University of Notre Dame Press. * Nussbaum, M. C. (2006). ''Frontiers of justice: Disability, nationality, species membership''. Harvard University Press. * O'Neill, O. (2002). ''Autonomy and trust in bioethics''. Cambridge University Press. * Reynolds, J. M., & Wieseler, C. (2019). ''The disability bioethics reader''. Routledge. * Scully, J. L. (2008). ''Disability bioethics: Moral bodies, moral difference''. Rowman & Littlefield. * Singer, P. (2011). ''Practical ethics'' (3e éd.). Cambridge University Press. * Ten Have, H. (2016). ''Global bioethics: An introduction''. Routledge. * Valdés, E., & Lecaros, J. A. (Eds.) (2023). ''Handbook of bioethical decisions, Volume I: Decisions at the bench''. Springer. * Victor, E., & Guidry-Grimes, L. K. (Eds.) (2021). ''Applying nonideal theory to bioethics''. Springer. == Voir aussi == * [[Dictionnaire de philosophie/Autonomie|Autonomie]] * [[Dictionnaire de philosophie/Avortement|Avortement]] * [[Dictionnaire de philosophie/Euthanasie|Euthanasie]] * [[Dictionnaire de philosophie/Personne non-humaine|Personne non-humaine]] * [[Dictionnaire de philosophie/Animal|Animal]] * [[Dictionnaire de philosophie/Anthropocentrisme|Anthropocentrisme]] * [[Dictionnaire de philosophie/Morale|Morale]] {{autocat}} p7op0nf40crzpjinucjcf43uqnjz3pm 767968 767966 2026-06-18T04:31:58Z PandaMystique 119061 767968 wikitext text/x-wiki {{DicoPhilo|Bioéthique}} == Définition et origines == [[Fichier:Immanuel Kant - Gemaelde 1.jpg|vignette|upright=1.1|Emmanuel Kant : la formule de l'humanité comme fin en soi inspire l'« impératif bioéthique » de Fritz Jahr.]] La '''bioéthique''' constitue un champ interdisciplinaire qui examine les enjeux moraux, juridiques et sociaux soulevés par les avancées de la médecine, des sciences biologiques et des technologies du vivant<ref>Ten Have, H. (2016). ''Global bioethics: An introduction''. Routledge.</ref>. Le terme fut forgé en 1927 par le pasteur protestant allemand Fritz Jahr dans son article « Bio-Ethik: Eine Umschau über die ethischen Beziehungen des Menschen zu Tier und Pflanze », où il appelait au développement d'une éthique écologique englobant toutes les formes de vie<ref>Jahr, F. (1927). « Bio-Ethik: Eine Umschau über die ethischen Beziehungen des Menschen zu Tier und Pflanze ». ''Kosmos'', 24, p. 2-4.</ref>. Jahr formulait à cette occasion un « impératif bioéthique » qui prolonge l'éthique kantienne en l'étendant au-delà de l'humanité : respecter chaque être vivant comme une fin en soi et le traiter, autant que possible, comme tel. Certains historiens situent dès 1926 la première occurrence publique du terme sous sa plume<ref>Sass, H.-M. (2007). « Fritz Jahr's 1927 concept of bioethics ». ''Kennedy Institute of Ethics Journal'', 17(4), p. 279-295.</ref>. Cependant, c'est Van Rensselaer Potter qui popularisa le concept dans les années 1970 avec son ouvrage ''Bioethics: Bridge to the Future'' (1971), envisageant la bioéthique comme un pont entre les connaissances scientifiques et les valeurs humaines<ref>Potter, V. R. (1971). ''Bioethics: Bridge to the future''. Prentice-Hall.</ref>. Déçu par l'orientation médicale étroite que prit le champ, Potter proposa plus tard le terme de « bioéthique globale » (1988) pour réaffirmer l'importance des dimensions écologiques et sociales<ref>Potter, V. R. (1988). ''Global bioethics: Building on the Leopold legacy''. University of Michigan Press.</ref>. Toutefois, le développement institutionnel de la bioéthique s'ancra principalement dans la réflexion sur les pratiques médicales, notamment à la suite des scandales éthiques majeurs du XXe siècle : l'expérimentation nazie en Allemagne, l'étude de Tuskegee sur la syphilis aux États-Unis (1932-1972), et divers abus dans la recherche médicale à travers le monde<ref>Washington, H. (2008). ''Medical apartheid: The dark history of medical experimentation on Black Americans from colonial times to the present''. Anchor Books.</ref>. == Les grandes questions de la bioéthique == Avant d'examiner les écoles et les auteurs, il est utile de dégager le fil qui les relie. La bioéthique naît d'un écart : les pouvoirs que les sciences du vivant confèrent à l'être humain croissent plus vite que les repères moraux capables de les orienter. Réanimation, greffes, procréation assistée, séquençage du génome, prolongation artificielle de la vie : chaque progrès technique ouvre des choix que les morales héritées n'avaient pas anticipés. De cet écart découlent quelques questions récurrentes, que les sections suivantes reprennent sous des angles divers. Qui mérite une protection morale, et à quel titre : l'embryon, l'[[Dictionnaire de philosophie/Animal|animal]], les générations futures ? Jusqu'où s'étend le [[Dictionnaire de philosophie/Droit|droit]] de chacun à décider pour lui-même, et où ce droit rencontre-t-il la vulnérabilité ou la dépendance ? Que devons-nous aux personnes que la médecine ne peut guérir ? Comment répartir équitablement des ressources de santé toujours limitées ? Et quelle responsabilité portons-nous envers une nature et une humanité que nos techniques peuvent altérer durablement ? À ces questions s'opposent de grandes familles de réponses. Certaines pèsent les conséquences des actes, d'autres invoquent des devoirs ou des droits inviolables, d'autres encore partent du caractère de l'agent ou de la trame concrète des relations humaines. Les pages qui suivent parcourent ces réponses sans en consacrer aucune, car l'intérêt de la bioéthique tient à leur confrontation. == Les fondements du principisme == La bioéthique contemporaine s'est largement structurée autour du ''principisme'', approche développée par Tom Beauchamp et James Childress dans leur ouvrage fondateur ''Principles of Biomedical Ethics'' (1979). Cette méthode identifie quatre principes moraux fondamentaux qui doivent guider la réflexion et la pratique biomédicale<ref>Beauchamp, T. L., & Childress, J. F. (2001). ''Principles of biomedical ethics'' (5e éd.). Oxford University Press.</ref> : * L'[[Dictionnaire de philosophie/Autonomie|autonomie]] : le respect de la capacité des personnes à prendre des décisions éclairées concernant leur propre santé et leur corps. Ce principe sous-tend notamment la pratique du consentement éclairé. * La bienfaisance : l'obligation d'agir pour le [[Dictionnaire de philosophie/Bien|bien]] d'autrui, de promouvoir la santé et le bien-être des patients. * La non-malfaisance : le devoir de ne pas causer de tort, incarné par le précepte hippocratique ''primum non nocere'' (d'abord, ne pas nuire). * La justice : l'exigence d'une distribution équitable des ressources de santé et d'un traitement impartial des personnes. Beauchamp et Childress présentent ces principes comme des obligations ''prima facie'', au sens où Ross emploie cette expression : chacune oblige sauf si elle entre en conflit avec une obligation de même rang, auquel cas il revient au jugement de déterminer laquelle prévaut dans la situation<ref>Ross, W. D. (1930). ''The right and the good''. Oxford University Press.</ref>. Les auteurs ancrent ces principes non dans une théorie éthique unique mais dans la « morale commune » (''common morality''), c'est-à-dire l'ensemble des normes partagées par toutes les personnes sérieusement engagées dans la [[Dictionnaire de philosophie/Morale|vie morale]]. Deux opérations relient ces principes aux cas concrets : la spécification, qui en précise la portée pour un type de situation, et la pondération, qui arbitre leurs conflits ; l'ajustement mutuel des principes et des jugements particuliers emprunte la méthode de l'équilibre réfléchi élaborée par Rawls. Beauchamp et Childress refusent que ces quatre principes forment un algorithme de décision : ils délimitent les questions à poser plutôt qu'ils ne livrent des réponses toutes faites, ce qui distingue le principisme d'une simple liste de contrôle<ref>Campbell, A. V. (2013). ''Bioethics: The basics''. Routledge.</ref>. Ces quatre principes, parfois désignés comme le « mantra de Georgetown », ont exercé une influence considérable sur le développement de la bioéthique anglo-américaine et ont été intégrés dans de nombreux codes et déclarations internationaux<ref>Gillon, R. (2003). « Ethics needs principles—four can encompass the rest—and respect for autonomy should be "first among equals" ». ''British Medical Journal'', 327, p. 1003-1006.</ref>. Toutefois, cette approche principiste a fait l'objet de critiques substantielles que nous examinerons ultérieurement. == La déclaration d'Helsinki et les cadres normatifs internationaux == La réflexion bioéthique s'est progressivement institutionnalisée à travers l'adoption de déclarations et de conventions internationales. Le Code de Nuremberg (1947), formulé par le tribunal militaire américain au terme du procès des médecins nazis, en constitue le premier jalon : il fait du « consentement volontaire » du sujet humain la condition sans laquelle aucune expérimentation ne saurait être entreprise, posant le socle de la doctrine du consentement éclairé<ref>Tribunal militaire de Nuremberg (1947). « Permissible Medical Experiments ». Dans ''Trials of War Criminals before the Nuernberg Military Tribunals under Control Council Law No. 10'', vol. 2, p. 181-182. U.S. Government Printing Office, 1949.</ref>. La Déclaration d'Helsinki (1964), élaborée par l'Association médicale mondiale, établit les principes éthiques fondamentaux de la recherche médicale impliquant des sujets humains. Révisée à plusieurs reprises, elle affirme notamment la primauté des intérêts et du bien-être de chaque sujet sur tous les autres intérêts, incluant ceux de la science et de la société. Sa révision la plus récente, adoptée à Helsinki en 2024 lors de la 75e Assemblée générale, constitue désormais la seule version officielle : elle substitue le terme de « participant » à celui de « sujet », renforce la protection des personnes vulnérables et inscrit l'exigence de justice globale au cœur de la conduite de la recherche<ref>World Medical Association (2024). ''Declaration of Helsinki: Ethical principles for medical research involving human participants''. 75e Assemblée générale, Helsinki.</ref>. Sans constituer un traité juridiquement contraignant, la Déclaration exerce sur la recherche médicale mondiale une autorité morale et professionnelle de premier plan, distincte de la force obligatoire d'une convention. L'article publié par Henry Beecher en 1966 dans le ''New England Journal of Medicine'' recensa vingt-deux études cliniques conduites au mépris de l'éthique de la recherche ; il pesa sur l'instauration d'un contrôle institutionnel des protocoles et sur l'affermissement de l'exigence du consentement<ref>Beecher, H. K. (1966). « Ethics and clinical research ». ''New England Journal of Medicine'', 274(24), p. 1354-1360.</ref>. Aux États-Unis, le Rapport Belmont (1979), produit par la Commission nationale pour la protection des sujets humains dans la recherche biomédicale et comportementale, identifie trois principes éthiques fondamentaux : le respect des personnes, la bienfaisance (incluant la non-malfaisance) et la justice<ref>National Commission for the Protection of Human Subjects of Biomedical and Behavioral Research (1979). ''The Belmont Report: Ethical principles and guidelines for the protection of human subjects of research''. Department of Health, Education, and Welfare.</ref>. Ces principes constitueront la matrice conceptuelle dont s'inspireront Beauchamp et Childress pour développer leur approche principiste. En Europe, la Convention d'Oviedo (1997), officiellement intitulée « Convention pour la protection des droits de l'homme et de la dignité de l'être humain à l'égard des applications de la biologie et de la médecine », représente le premier instrument juridique contraignant au niveau international dans le domaine de la bioéthique. Adoptée par le Conseil de l'Europe, elle place la dignité humaine au cœur de son dispositif normatif, s'inscrivant dans une tradition philosophique kantienne qui contraste avec l'utilitarisme pragmatique dominant dans la bioéthique américaine<ref>Andorno, R. (2005). « The Oviedo Convention: A European legal framework at the intersection of human rights and health law ». ''Journal of International Biotechnology Law'', 2(4), p. 133-143.</ref>. L'UNESCO adopte en 2005 la Déclaration universelle sur la bioéthique et les droits de l'homme, premier instrument normatif mondial non contraignant qui lie explicitement bioéthique et droits humains. Cette déclaration énonce quinze principes, incluant le respect de la dignité humaine, la protection des générations futures, la protection de l'environnement et de la biosphère, reflétant ainsi une vision élargie de la bioéthique plus proche de la conception originelle de Potter<ref>Andorno, R. (2007). « Global bioethics at UNESCO: In defence of the Universal Declaration on Bioethics and Human Rights ». ''Journal of Medical Ethics'', 33, p. 150-154.</ref><ref>UNESCO (2005). ''Universal Declaration on Bioethics and Human Rights''. Organisation des Nations Unies pour l'éducation, la science et la culture.</ref>. == Repères dans le contexte français == Le débat bioéthique français présente une physionomie propre. La France compte parmi les premiers États à s'être dotés d'une instance consultative nationale : le Comité consultatif national d'éthique pour les sciences de la vie et de la santé (CCNE), créé en 1983, rend des avis qui nourrissent la délibération publique sans lier le législateur<ref>Décret du 23 février 1983 portant création du Comité consultatif national d'éthique pour les sciences de la vie et de la santé. Paris.</ref>. Le pays a par ailleurs choisi de légiférer par paliers : une première loi de bioéthique en 1994, qui pose la non-commercialisation du corps humain ainsi que l'anonymat et la gratuité des dons, puis des révisions en 2004, qui institue l'Agence de la biomédecine et prohibe le clonage, en 2011, et en 2021<ref>Loi n° 2021-1017 du 2 août 2021 relative à la bioéthique. ''Journal officiel de la République française'', 3 août 2021.</ref>. La loi du 2 août 2021 a ouvert l'assistance médicale à la procréation aux couples de femmes et aux femmes non mariées, reconnu aux personnes issues d'un don le droit d'accéder à leur majorité à l'identité du donneur, et maintenu un encadrement strict de la recherche sur l'embryon, soumise à l'autorisation de l'Agence de la biomédecine et dont les produits ne peuvent être transférés à des fins de gestation. La même orientation explique l'interdiction, en France, des tests génétiques vendus directement aux particuliers à des fins récréatives : l'examen des caractéristiques génétiques d'une personne reste subordonné à une finalité médicale, scientifique ou judiciaire. Le don d'organes y obéit au principe du consentement présumé : toute personne n'ayant pas fait connaître son refus de son vivant, notamment par inscription au registre national des refus, est réputée donneuse. En matière de fin de vie, la loi Leonetti de 2005, puis la loi Claeys-Leonetti du 2 février 2016, ont prohibé l'obstination déraisonnable, rendu les directives anticipées contraignantes et autorisé, pour les malades en phase terminale, une « sédation profonde et continue » maintenue jusqu'au décès, sans légaliser l'aide active à mourir<ref>Loi n° 2016-87 du 2 février 2016 créant de nouveaux droits en faveur des malades et des personnes en fin de vie. ''Journal officiel de la République française''.</ref>. Un projet en ce sens, qui ouvrirait sous conditions le suicide assisté et, par exception, l'[[Dictionnaire de philosophie/Euthanasie|euthanasie]], a été adopté par l'Assemblée nationale puis rejeté par le Sénat ; le débat législatif s'est poursuivi en 2025-2026<ref>Sénat. « Proposition de loi relative au droit à l'aide à mourir ». Dossier législatif 2024-2025.</ref>. == Les critiques du principisme et les approches alternatives == Dès la fin des années 1980, le principisme fait l'objet de critiques substantielles qui conduisent au développement d'approches alternatives. K. Danner Clouser et Bernard Gert dénoncent le principisme comme une méthode trop abstraite et indéterminée, ne fournissant pas d'orientation suffisante pour résoudre les dilemmes éthiques concrets<ref>Clouser, K. D., & Gert, B. (1990). « A critique of principlism ». ''The Journal of Medicine and Philosophy'', 15(2), p. 219-236.</ref>. Selon eux, les quatre principes ne constituent pas une théorie éthique cohérente mais un catalogue de valeurs sans hiérarchie claire ni procédure de résolution des conflits normatifs. === L'éthique du care et les approches féministes === Les approches féministes en bioéthique, qui émergent dans les années 1990, remettent en question la centralité accordée à l'autonomie individuelle par le principisme, dénonçant son caractère androcentrique et individualiste<ref>Tong, R. (1997). ''Feminist approaches to bioethics: Theoretical reflections and practical applications''. Westview Press.</ref>. Des philosophes comme Carol Gilligan et Nel Noddings développent une éthique du care (éthique du soin) qui valorise les relations d'interdépendance, la vulnérabilité et la responsabilité envers autrui plutôt que l'autonomie abstraite<ref>Gilligan, C. (1982). ''In a different voice: Psychological theory and women's development''. Harvard University Press.</ref><ref>Noddings, N. (1984). ''Caring: A feminine approach to ethics and moral education''. University of California Press.</ref>. Eva Feder Kittay critique l'idéal de l'individu autonome et indépendant qui sous-tend les théories libérales de la justice, soulignant que tous les êtres humains sont inévitablement dépendants à certains moments de leur existence et que cette vulnérabilité doit être reconnue comme condition humaine fondamentale plutôt que comme déficience<ref>Kittay, E. F. (1999). ''Love's labor: Essays on women, equality, and dependency''. Routledge.</ref>. Martha Fineman développe de manière similaire le concept de « sujet vulnérable », contestant l'idéologie de l'autonomie qui ignore les structures de dépendance et les inégalités structurelles<ref>Fineman, M. A. (2004). ''The autonomy myth: A theory of dependency''. The New Press.</ref>. La bioéthique féministe s'est particulièrement investie dans l'analyse critique des technologies reproductives, dénonçant leur impact disproportionné sur les femmes et les risques d'exploitation qu'elles comportent<ref>Dickenson, D. (2007). ''Property in the body: Feminist perspectives''. Cambridge University Press.</ref><ref>Baylis, F., & McLeod, C. (2014). ''Family-making: Contemporary ethical challenges''. Oxford University Press.</ref>. Susan Sherwin insiste sur la nécessité d'une analyse contextuelle qui prenne en compte les rapports de pouvoir et les inégalités structurelles de genre dans l'évaluation éthique des pratiques biomédicales<ref>Sherwin, S. (1992). ''No longer patient: Feminist ethics and health care''. Temple University Press.</ref>. === L'approche par les capabilités === Martha Nussbaum et Amartya Sen développent l'approche par les capabilités, c'est-à-dire les capacités réelles dont disposent les personnes, qui déplace le centre de l'analyse éthique des ressources ou des utilités vers ce que chacun est en mesure d'accomplir parmi les fonctionnements qu'il valorise<ref>Sen, A. (1999). ''Development as freedom''. Anchor Books.</ref><ref>Nussbaum, M. C. (2006). ''Frontiers of justice: Disability, nationality, species membership''. Harvard University Press.</ref>. Pour Nussbaum, une société juste doit garantir à chaque personne un seuil minimal de dix capabilités centrales, incluant la vie, la santé corporelle, l'intégrité corporelle, les sens, l'imagination et la pensée, les émotions, la raison pratique, l'affiliation, le rapport avec les autres espèces, le jeu et le contrôle sur son environnement. Cette approche offre un cadre particulièrement fécond pour penser les questions de justice en santé, de handicap et de vulnérabilité, permettant d'évaluer les inégalités de santé non seulement en termes de distribution des ressources mais en termes de ce que les personnes sont effectivement capables de faire et d'être<ref>Stenlund, M. (2017). « Nussbaum's capabilities approach meets values-based practice: Promoting the freedom of thought of mental health service users ». ''Journal of Medical Ethics'', 43(12), p. 828-833.</ref>. === L'éthique de la vertu et la tradition néo-aristotélicienne === [[Fichier:Aristotle Altemps Inv8575.jpg|vignette|upright=1.1|Aristote : la sagesse pratique (phronèsis) guide le jugement moral au cas par cas, modèle des éthiques de la vertu.]] Alasdair MacIntyre réhabilite l'éthique de la vertu dans son ouvrage majeur ''After Virtue'' (1981), critiquant l'échec du projet moderne des Lumières visant à fonder la moralité sur des principes rationnels universels détachés des traditions particulières<ref>MacIntyre, A. (1981). ''After virtue: A study in moral theory''. University of Notre Dame Press.</ref>. Pour MacIntyre, les vertus sont des qualités acquises dont l'exercice permet d'atteindre les biens internes aux pratiques sociales. Cette approche insiste sur la formation du caractère moral et le rôle des communautés et des traditions dans l'élaboration des normes éthiques. Edmund Pellegrino applique cette éthique de la vertu à la médecine, arguant que la relation thérapeutique exige des vertus spécifiques chez le praticien (compassion, fidélité, intégrité, abnégation) qui ne peuvent se réduire à l'application mécanique de principes<ref>Pellegrino, E. D., & Thomasma, D. C. (1993). ''The virtues in medical practice''. Oxford University Press.</ref>. Le bien du patient ne peut être déterminé de manière abstraite mais nécessite une appréciation contextualisée et relationnelle. === Le casuisme et l'éthique narrative === Le casuisme, réhabilité par Albert Jonsen et Stephen Toulmin dans ''The Abuse of Casuistry'' (1988), propose une méthode de résolution des dilemmes éthiques fondée sur l'analogie avec des cas paradigmatiques plutôt que sur la déduction à partir de principes abstraits<ref>Jonsen, A. R., & Toulmin, S. (1988). ''The abuse of casuistry: A history of moral reasoning''. University of California Press.</ref>. Cette approche, inspirée de la tradition juridique de la common law, privilégie le raisonnement par cas et la prudence (phronèsis) aristotélicienne ([[s:Éthique à Nicomaque|texte sur Wikisource]]). L'éthique narrative développée par Rita Charon et Hilde Lindemann insiste sur l'importance des récits dans la compréhension des enjeux éthiques et dans la formation de l'identité morale<ref>Charon, R. (2006). ''Narrative medicine: Honoring the stories of illness''. Oxford University Press.</ref><ref>Lindemann, H. (2014). ''Holding and letting go: The social practice of personal identities''. Oxford University Press.</ref>. Les narrations des patients, de leurs proches et des soignants constituent des ressources épistémiques et morales essentielles pour appréhender la complexité des situations cliniques. == Trois figures contemporaines : Singer, O'Neill et Jonas == === Peter Singer et l'utilitarisme préférentiel === [[Fichier:Peter Singer (philosopher).jpg|vignette|upright=1.1|Peter Singer étend la considération morale à tout être sensible, par-delà la seule espèce humaine.]] Peter Singer représente sans doute le philosophe moral le plus influent et controversé en bioéthique contemporaine. Dans ''Animal Liberation'' (1975), il développe une critique du spécisme, concept qu'il emprunte à Richard Ryder, dénonçant la discrimination arbitraire fondée sur l'appartenance à l'espèce<ref>Singer, P. (1975). ''Animal liberation: A new ethics for our treatment of animals''. HarperCollins.</ref>. Pour Singer, le critère moralement pertinent n'est pas la rationalité ou l'appartenance à l'espèce humaine, mais la capacité à ressentir la souffrance (sentience). Dans ''Practical Ethics'' (1979) et ''Rethinking Life and Death'' (1994), Singer applique son utilitarisme préférentiel à des questions bioéthiques fondamentales : l'[[Dictionnaire de philosophie/Avortement|avortement]], l'infanticide dans certaines circonstances, l'euthanasie volontaire et non-volontaire<ref>Singer, P. (1979). ''Practical ethics''. Cambridge University Press.</ref><ref>Singer, P. (1994). ''Rethinking life and death: The collapse of our traditional ethics''. St. Martin's Press.</ref>. Il soutient que le simple fait d'être biologiquement humain ne confère pas de statut moral particulier, et que ce qui importe est la capacité à avoir des préférences concernant sa propre existence future. Les nouveau-nés, n'ayant pas cette capacité, ne seraient donc pas des personnes au sens moral du terme, ce qui rendrait moralement acceptable leur euthanasie dans certaines circonstances où leur vie serait marquée par une souffrance intense. Plus récemment, dans ''The Point of View of the Universe'' (2014), co-écrit avec Katarzyna de Lazari-Radek, Singer révèle son évolution vers un utilitarisme hédoniste plutôt que préférentiel<ref>Singer, P., & de Lazari-Radek, K. (2014). ''The point of view of the universe: Sidgwick and contemporary ethics''. Oxford University Press.</ref>. Ses positions sur l'altruisme efficace, développées dans ''The Life You Can Save'' (2009), ont inspiré un mouvement mondial visant à optimiser l'impact des actions caritatives selon des critères utilitaristes<ref>Singer, P. (2009). ''The life you can save: Acting now to end world poverty''. Random House.</ref>. Les thèses de Singer ont suscité de vives controverses, particulièrement de la part des défenseurs des droits des personnes handicapées qui voient dans ses arguments une forme de capacitisme (ableism) remettant en cause la valeur égale de toutes les vies humaines<ref>Kittay, E. F. (2009). « The personal is philosophical is political: A philosopher and mother of a cognitively disabled person sends notes from the battlefield ». ''Metaphilosophy'', 40(3-4), p. 606-627.</ref>. === Onora O'Neill et l'autonomie kantienne === [[Fichier:Official portrait of Baroness O'Neill of Bengarve (cropped2).jpg|vignette|upright=1.1|Onora O'Neill : l'autonomie n'a de valeur que soutenue par des relations de confiance.]] Onora O'Neill a profondément renouvelé la compréhension de l'autonomie en bioéthique à travers une lecture rigoureuse de Kant ([[s:Fondements de la métaphysique des mœurs|texte sur Wikisource]]). Dans son ouvrage ''Autonomy and Trust in Bioethics'' (2002), issu de ses conférences Gifford, elle critique la conception individualiste et consumériste de l'autonomie qui domine la bioéthique anglo-américaine<ref>O'Neill, O. (2002). ''Autonomy and trust in bioethics''. Cambridge University Press.</ref>. Pour O'Neill, l'autonomie kantienne n'est pas la simple capacité de faire des choix selon ses préférences (conception millienne ; [[s:De la liberté|texte sur Wikisource]]), mais l'aptitude à agir selon des principes rationnels universalisables. Cette autonomie « principielle » implique une dimension sociale et relationnelle fondamentale : on ne peut être autonome de manière purement individuelle. O'Neill souligne le paradoxe contemporain : alors que les dispositifs institutionnels multiplient les garanties formelles de l'autonomie (formulaires de consentement, protection des données), la confiance dans les professionnels de santé et les institutions biomédicales s'érode<ref>Black, D. (2002). « Autonomy and trust in bioethics ». ''Journal of the Royal Society of Medicine'', 95(9), p. 466-467.</ref>. Elle montre que l'obsession pour l'autonomie individuelle peut paradoxalement miner les conditions de confiance nécessaires à une relation thérapeutique authentique. Son travail a exercé une influence considérable sur la réflexion concernant le consentement éclairé et les relations fiduciaires en médecine<ref>López Jara, C. A., & Holguín Lew, J. C. (2013). « Autonomy, trust and medical ethics in Onora O'Neill's work ». ''Revista Colombiana de Psiquiatría'', 42(1), p. 120-135.</ref>. === Hans Jonas et le principe de responsabilité === [[Fichier:Hans Jonas an der Universität St. Gallen (1983) HSGH 022-001945 (cropped).jpg|vignette|upright=1.1|Hans Jonas, ici en 1983 : sa réflexion fonde une éthique de la responsabilité envers les générations futures.]] Le philosophe allemand Hans Jonas a marqué la bioéthique par son ouvrage fondamental ''Das Prinzip Verantwortung'' (Le Principe Responsabilité, 1979), qui représente l'une des premières tentatives systématiques d'élaborer une éthique pour la civilisation technologique<ref>Jonas, H. (1979). ''Das Prinzip Verantwortung: Versuch einer Ethik für die technologische Zivilisation''. Insel Verlag. Traduction française : ''Le Principe Responsabilité''. Cerf, 1990.</ref>. Face aux menaces existentielles que la technoscience fait peser sur l'humanité et la biosphère, Jonas formule un nouvel impératif catégorique : « Agis de façon que les effets de ton action soient compatibles avec la permanence d'une vie authentiquement humaine sur terre ». Jonas développe une éthique de la responsabilité tournée vers l'avenir et les générations futures, fondée sur une « heuristique de la peur » qui nous enjoint d'accorder la priorité aux prophéties de malheur sur les promesses technologiques<ref>Jonas, H. (1992). ''Philosophical explorations and metaphysical speculation''. University of Chicago Press.</ref>. Cette approche précautionniste a profondément influencé l'éthique environnementale et la réflexion sur les risques biotechnologiques. Le principe de précaution, aujourd'hui largement reconnu dans les conventions internationales sur l'environnement, puise l'une de ses sources philosophiques majeures dans la pensée jonassienne<ref>Philosophia (2018). « On Hans Jonas' The Imperative of Responsibility ». ''Philosophia: E-journal of Philosophy and Culture'', 17, p. 191-207.</ref>. Jonas insiste sur l'asymétrie fondamentale entre les générations présentes et futures : ces dernières n'existent pas encore et ne peuvent donc exercer aucune réciprocité, contrairement au modèle contractualiste. La responsabilité envers elles ne peut se fonder sur un accord mutuel mais sur la valeur intrinsèque de la vie et sur le devoir de préserver les conditions d'une existence authentiquement humaine. Son analyse du nouveau-né comme archétype de l'objet de responsabilité - être vulnérable dont la simple existence lance un appel au soin - constitue une contribution majeure à la phénoménologie morale de la vulnérabilité<ref>Grant, A. (2021). « Responsibility to others in the future: The foundation of Hans Jonas's ethics ». ''Philosophy World Democracy'', 1(1), p. 85-103.</ref>. == Les concepts opératoires des débats appliqués == Par-delà les grandes approches théoriques, la bioéthique appliquée mobilise un petit nombre de distinctions conceptuelles qui structurent les controverses sur le début et la fin de vie. Ces outils n'appartiennent à aucune école particulière : ils fixent le vocabulaire commun à partir duquel les théories rivales argumentent. === Le statut moral et la notion de personne === La plupart des débats sur l'avortement, l'euthanasie ou l'expérimentation reposent sur la question du statut moral : quels êtres comptent pour eux-mêmes, et à quel titre une conduite peut leur causer un tort ? La discussion sépare l'appartenance biologique à l'espèce humaine et la qualité de personne entendue au sens moral. Mary Anne Warren propose une série de critères de la personnalité morale, parmi lesquels la [[Dictionnaire de philosophie/Conscience|conscience]], la capacité de raisonner et la conscience de soi, et soutient que l'embryon ne les remplit pas<ref>Warren, M. A. (1973). « On the moral and legal status of abortion ». ''The Monist'', 57(1), p. 43-61.</ref>. À l'opposé, les tenants d'un statut attaché à l'appartenance à l'espèce, ou à la simple potentialité, refusent de faire dépendre la valeur d'une vie de l'exercice effectif de telles capacités. L'enjeu pratique est direct : selon le critère retenu, l'embryon, le fœtus, le nouveau-né ou le patient en état végétatif se voient reconnaître des protections fort différentes. === Sacralité ou qualité de la vie === Une seconde ligne de partage oppose deux manières d'évaluer la vie humaine. La tradition de la sacralité de la vie tient toute vie humaine pour également inviolable et refuse qu'on mette fin à l'une d'elles au motif de son état ; la Congrégation pour la doctrine de la foi en donne une expression normative dans sa déclaration ''Iura et bona'', qui condamne l'euthanasie tout en admettant le refus de traitements disproportionnés<ref>Congrégation pour la doctrine de la foi (1980). ''Déclaration sur l'euthanasie'' (Iura et bona). Rome.</ref>. À cette position, Jonathan Glover oppose une évaluation par la qualité de la vie, qui rapporte l'intérêt de prolonger une existence à ce qu'elle apporte à celui qui la vit<ref>Glover, J. (1977). ''Causing death and saving lives''. Penguin Books.</ref>. Les approches du handicap rappellent toutefois que les jugements de qualité de vie portés de l'extérieur sous-estiment d'ordinaire le bien-être réel des personnes concernées, ce qui invite à la prudence dès qu'une décision médicale s'appuie sur eux. === Tuer et laisser mourir === La distinction entre tuer et laisser mourir, ou entre acte et omission, commande une part des débats sur l'euthanasie et l'arrêt des traitements. La pratique médicale et le droit la tiennent pour pertinente : retirer un traitement de maintien en vie est admis là où l'injection létale est prohibée. L'affaire britannique Tony Bland, jugée en 1993, autorisa l'interruption de l'alimentation artificielle d'un patient en état végétatif persistant et fit de cette distinction un point d'appui juridique<ref>Campbell, A. V. (2013). ''Bioethics: The basics''. Routledge.</ref>. James Rachels en conteste la portée morale : par son argument dit de la différence nue, il compare deux cas identiques en tout sauf qu'un agent tue quand l'autre laisse mourir, et conclut que le mode de [[Dictionnaire de philosophie/Causalité|causation]] ne change pas à lui seul la valeur morale de l'acte<ref>Rachels, J. (1975). « Active and passive euthanasia ». ''New England Journal of Medicine'', 292(2), p. 78-80.</ref>. Franklin Miller, Robert Truog et Dan Brock vont plus loin et soutiennent que la frontière entre arrêt de traitement et mise à [[Dictionnaire de philosophie/Mort|mort]] repose sur des « fictions morales », croyances commodes qui alignent les pratiques admises sur l'interdit de tuer<ref>Miller, F. G., Truog, R. D., & Brock, D. W. (2010). « Moral fictions and medical ethics ». ''Bioethics'', 24(9), p. 453-460.</ref>. === Le double effet === Le principe du double effet, hérité de l'analyse thomiste de la légitime défense, distingue les effets visés d'un acte et ses effets seulement prévus. Une même action peut être permise lorsque sa fin et ses moyens sont bons, que l'effet mauvais n'est pas recherché comme moyen, et que la raison d'agir est proportionnée au mal toléré<ref>Vaughn, L. (2023). ''Bioethics: Principles, issues, and cases'' (5e éd.). Oxford University Press.</ref>. On y recourt notamment pour la sédation en phase terminale : administrer des doses croissantes d'analgésiques afin de soulager la douleur est jugé licite même au risque d'abréger la vie, dès lors que la mort n'est pas l'objectif visé. Des critiques objectent que la frontière entre intention et prévision se laisse aisément reformuler et qu'elle sert parfois à requalifier après coup ce que l'on souhaite autoriser. Ces distinctions ne tranchent pas par elles-mêmes les controverses : elles fournissent un langage partagé que les théories morales, principisme, conséquentialiste ou vertuiste, investissent ensuite de leurs propres exigences. == Les débats contemporains majeurs (2005-2025) == === La bioéthique du handicap === La bioéthique du handicap (disability bioethics) s'est affirmée comme un courant critique majeur au cours des vingt dernières années. Des philosophes comme Eva Feder Kittay, Jackie Leach Scully, et plus récemment Joel Michael Reynolds et Christine Wieseler, ont développé une critique systématique des présupposés capacitistes qui sous-tendent une grande partie de la réflexion bioéthique dominante<ref>Reynolds, J. M., & Wieseler, C. (2019). ''The disability bioethics reader''. Routledge.</ref><ref>Scully, J. L. (2008). ''Disability bioethics: Moral bodies, moral difference''. Rowman & Littlefield.</ref>. Le capacitisme désigne l'ensemble des attitudes, préjugés et structures sociales qui valorisent les personnes en fonction de leurs capacités physiques et cognitives, présumant que l'absence ou la limitation de certaines capacités diminue la valeur de la vie. Comme le démontre Reynolds, le capacitisme fonctionne comme un « principe conditionnant » en bioéthique, structurant implicitement le sens même de ce qui compte comme vie humaine digne d'être vécue et déterminant quels autres principes seront considérés comme pertinents<ref>Reynolds, J. M. (2021). « Conditioning principles: On bioethics and the problem of ableism ». In E. Victor & L. K. Guidry-Grimes (Eds.), ''Applying nonideal theory to bioethics'' (pp. 99-130). Springer.</ref>. La bioéthique du handicap conteste vivement le « préjugé expressiviste » identifié par Adrienne Asch, selon lequel le diagnostic prénatal et l'avortement sélectif expriment et renforcent des attitudes négatives envers les personnes handicapées<ref>Asch, A. (1999). « Prenatal diagnosis and selective abortion: A challenge to practice and policy ». ''American Journal of Public Health'', 89(11), p. 1649-1657.</ref>. Cette critique s'étend aux débats sur l'euthanasie et l'aide médicale à mourir, où les personnes handicapées constituent un groupe particulièrement vulnérable face aux pressions sociales et aux présomptions concernant la qualité de leur vie<ref>Campbell, S. M., & Stramondo, J. A. (2017). « The complicated relationship of disability and well-being ». ''Kennedy Institute of Ethics Journal'', 27(2), p. 151-184.</ref>. Les recherches empiriques démontrent que, contrairement aux présupposés dominants, les personnes handicapées rapportent des niveaux de bien-être et de satisfaction de vie similaires à ceux de la population générale, une fois que l'adaptation psychologique est prise en compte et que les obstacles sociaux sont levés<ref>Barnes, E. (2016). ''The minority body: A theory of disability''. Oxford University Press.</ref><ref>Bowen, E., MacLeod, A. K., Bowen, R., & Beaumont, J. G. (2025). « Quality of life among people with disabilities: It's complicated ». ''Disability and Society'', 40(1), p. 89-108.</ref>. Ces données remettent en question l'équivalence présumée entre handicap et mauvaise qualité de vie qui sous-tend de nombreux raisonnements bioéthiques. === Le transhumanisme et le posthumanisme === Le transhumanisme représente un mouvement intellectuel et socio-politique « technoprogressiste », c'est-à-dire favorable à l'usage des techniques pour accroître les capacités humaines, qui prône le recours aux biotechnologies pour remodeler l'organisme humain<ref>Porter, A. (2017). « Bioethics and transhumanism ». ''The Journal of Medicine and Philosophy'', 42(3), p. 237-260.</ref>. Il importe de distinguer trois ambitions de portée inégale : l'amélioration thérapeutique, qui restaure une fonction défaillante et recueille un large assentiment ; l'amélioration non thérapeutique, qui augmente des capacités déjà normales et soulève davantage d'objections ; et le projet posthumain proprement dit, qui vise, pour certains transhumanistes, la création d'êtres « posthumains » aux capacités considérablement augmentées. Nick Bostrom, Anders Sandberg et d'autres transhumanistes soutiennent que nous devrions activement chercher à améliorer les capacités cognitives, la longévité et les capacités physiques humaines au-delà de ce que permet la sélection naturelle<ref>Bostrom, N., & Sandberg, A. (2009). « Cognitive enhancement: Methods, ethics, regulatory challenges ». ''Science and Engineering Ethics'', 15(3), p. 311-341.</ref>. Les transhumanistes récusent l'objection selon laquelle l'évolution aurait optimisé les capacités humaines, arguant que la sélection naturelle maximise la reproduction, non le bien-être<ref>Bostrom, N., Sandberg, A., & van der Merwe, M. (2023). « The evolutionary optimality challenge to human enhancement ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 195-217). Springer.</ref>. Ils soutiennent que l'amélioration (enhancement) de l'humeur, des capacités cognitives ou de la longévité pourrait substantiellement accroître le bien-être humain global. Cependant, le projet transhumaniste fait face à des critiques philosophiques et éthiques substantielles. Leon Kass et d'autres « bioconservateurs » dénoncent la vision réductionniste de la nature humaine qu'il véhicule et les risques de déshumanisation qu'il comporte<ref>Kass, L. (2003). « Ageless bodies, happy souls: Biotechnology and the pursuit of perfection ». ''The New Atlantis'', 1, p. 9-28.</ref>. Susan Levin, dans son ouvrage ''Posthuman Bliss? The Failed Promise of Transhumanism'' (2021), développe une critique fondamentale du transhumanisme sur des bases philosophiques et scientifiques, contestant sa conception de la raison, des émotions, de l'esprit, ainsi que sa vision informationnelle de la réalité<ref>Levin, S. B. (2021). ''Posthuman bliss? The failed promise of transhumanism''. Oxford University Press.</ref>. Les inquiétudes éthiques portent notamment sur : les risques d'accroissement des inégalités sociales si les technologies d'amélioration ne sont accessibles qu'aux plus fortunés ; la pression sociale à se « normaliser » ou « s'améliorer » qui pourrait éroder l'autonomie réelle ; les conséquences imprévisibles de modifications biologiques profondes ; et la dissolution potentielle des valeurs humanistes fondamentales<ref>Corby, P. M. (2024). « The philosophical limitations of transhumanism and its societal implications ». ''The Linacre Quarterly'', 91(4), p. 410-428.</ref>. === L'édition génomique et CRISPR-Cas9 === [[Fichier:DNA double helix horizontal.png|vignette|upright=1.1|La double hélice de l'ADN : l'édition du génome par CRISPR-Cas9 a ravivé les débats sur l'amélioration et l'eugénisme.]] L'avènement de la technologie CRISPR-Cas9 a révolutionné les possibilités d'édition du génome avec une précision, une facilité et un coût sans précédent. Brendan Parent analyse les enjeux éthiques soulevés par cette technologie, notamment la distinction entre thérapie génique somatique (modifications non transmissibles) et modifications germinales (transmissibles aux générations futures)<ref>Parent, B. (2023). « Learning from Icarus: The impact of CRISPR on gene editing ethics ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 9-27). Springer.</ref>. Si la thérapie génique somatique pour traiter des maladies graves fait l'objet d'un relatif consensus éthique, l'édition germinale et l'amélioration génétique demeurent hautement controversées. Calum MacKellar développe une critique vigoureuse de l'utilisation de l'édition génomique pour prévenir les handicaps, y voyant une forme d'eugénisme incompatible avec le principe d'égale dignité de tous les êtres humains, sauf si la motivation parentale relève strictement de l'incapacité personnelle à assumer un enfant handicapé<ref>MacKellar, C. (2023). « Bioethical decision making and genome editing ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 29-42). Springer.</ref>. À l'inverse, des philosophes comme Julian Savulescu défendent un « devoir moral de procréation » selon lequel les parents auraient l'obligation de sélectionner ou produire les « meilleurs » enfants possibles<ref>Savulescu, J. (2001). « Procreative beneficence: Why we should select the best children ». ''Bioethics'', 15(5-6), p. 413-426.</ref>. Le scandale de He Jiankui en 2018, lorsque ce chercheur chinois annonça avoir créé les premiers bébés génétiquement modifiés (pour leur conférer une résistance au VIH), illustre l'urgence de régulations internationales robustes et l'insuffisance des cadres éthiques existants pour encadrer ces technologies puissantes<ref>Cyranoski, D., & Ledford, H. (2018). « Genome-edited baby claim provokes international outcry ». ''Nature'', 563, p. 607-608.</ref>. === Une santé globale (One Health) et bioéthique environnementale === La pandémie de COVID-19 a mis en lumière l'interconnexion profonde entre santé humaine, santé animale et santé environnementale, renforçant la pertinence de l'approche One Health (Une seule santé)<ref>Lee, K., & Brummel, Z. L. (2013). « Operationalizing the one health approach: The global governance challenges ». ''Health Policy and Planning'', 28(7), p. 778-785.</ref>. Karori Mbugua et d'autres bioéthiciens soulignent toutefois que cette approche demeure entachée de biais [[Dictionnaire de philosophie/Anthropocentrisme|anthropocentriques]], privilégiant systématiquement la santé humaine au détriment du bien-être animal et de l'intégrité écologique<ref>Mbugua, K. (2024). « Bioethics and One Health: Beyond anthropocentrism ». In L. Omutoko & W. Jaoko (Eds.), ''Bioethics from the global South'' (pp. 83-91). Springer.</ref>. S'inspirant de l'éthique écocentrique d'Aldo Leopold développée dans son essai « The Land Ethic » (1949), plusieurs auteurs plaident pour une extension du cercle de considération morale incluant non seulement les animaux non-humains mais l'ensemble de la communauté biotique<ref>Leopold, A. (1949). ''A sand county almanac and sketches here and there''. Oxford University Press.</ref>. Cette perspective trouve des échos dans les sagesses traditionnelles africaines qui reconnaissent l'interconnexion et l'interdépendance de tous les aspects de la vie, incluant la nature inanimée (montagnes, rivières) dans l'univers moral<ref>Tosam, M. (2019). « African environmental ethics and sustainable development ». ''Journal of Philosophy'', 9(2), p. 172-192.</ref>. La bioéthique environnementale, bien que constituant théoriquement une composante essentielle de la bioéthique (aux côtés de l'éthique médicale et de l'éthique animale), demeure marginalisée dans la pratique académique et institutionnelle<ref>Resnik, D. (2009). « Bioethics and global climate change ». ''Bioethics Forum'', 39(3), p. 1-6.</ref><ref>Ritchie, C. (2016). ''Moving environmental bioethics into the 21st century: Green bioethics and the common good''. Thèse de doctorat, Boston College.</ref>. Cette négligence est particulièrement problématique à l'ère de l'Anthropocène, où l'impact humain sur les systèmes terrestres atteint des niveaux catastrophiques. === La bioéthique globale et la justice épistémique === L'expression « bioéthique globale » désigne à la fois l'extension géographique de la bioéthique au-delà du monde occidental et son élargissement thématique pour inclure les enjeux de santé mondiale, de justice distributive globale et d'équité en santé<ref>Ten Have, H. (2016). ''Global bioethics: An introduction''. Routledge.</ref>. Solomon Benatar, Peter Singer et d'autres ont appelé à recentrer la bioéthique sur les disparités massives en santé globale plutôt que sur les dilemmes de haute technologie de la médecine occidentale<ref>Benatar, S. R., & Singer, P. A. (2010). « Responsibilities in international research: A new look revisited ». ''Journal of Medical Ethics'', 36(4), p. 194-197.</ref>. Toutefois, cette « globalisation » de la bioéthique soulève des questions [[Dictionnaire de philosophie/Épistémologie|épistémologiques]] et politiques cruciales. Des chercheurs issus du Sud global dénoncent l'injustice épistémique qui caractérise la production et la circulation du savoir bioéthique, dominée par les théories, concepts et perspectives du Nord global<ref>Kwete, X., & Tengatenga, J. (2023). « Where is knowledge from the global South? An account of epistemic justice for a global bioethics ». ''Journal of Medical Ethics'', 49, p. 410-417.</ref>. Cette hégémonie épistémique reproduit et légitime des formes de domination néocoloniale dans la recherche biomédicale et les politiques de santé. Jude Thaddaeus Buyondo développe une critique approfondie du principisme bioéthique depuis une perspective africaine, montrant comment le cadre conceptuel dominant de Beauchamp et Childress échoue à appréhender les réalités sociales, culturelles et économiques de l'Afrique<ref>Buyondo, J. T. (2024). ''The critique of bioethical principlism in contrast to a Black African approach to bioethics''. Wipf & Stock Publishers.</ref>. Il plaide pour une bioéthique holistique enracinée dans les valeurs africaines d'Ubuntu et de solidarité communautaire. Cette exigence de décolonisation épistémique de la bioéthique rejoint les appels féministes pour une bioéthique véritablement pluraliste qui intègre la diversité des perspectives culturelles sans pour autant sacrifier les principes éthiques fondamentaux<ref>Tong, R. (2022). « Towards a feminist global ethics ». ''Bioethics'', 36(1), p. 5-12.</ref>. Le défi consiste à naviguer entre l'écueil du relativisme moral et celui de l'impérialisme éthique, en reconnaissant l'existence de valeurs morales transculturelles tout en demeurant attentif aux contextes particuliers et aux rapports de pouvoir qui structurent les échanges interculturels. == Enjeux méthodologiques contemporains == === La théorie non-idéale et la bioéthique empirique === Charles Mills et d'autres philosophes politiques ont développé la distinction entre théorie idéale et théorie non-idéale<ref>Mills, C. W. (2005). « 'Ideal theory' as ideology ». ''Hypatia'', 20(3), p. 165-184.</ref>. La théorie idéale part d'hypothèses d'obéissance parfaite et de conditions sociales favorables pour élaborer des principes de justice ; la théorie non-idéale part au contraire des conditions d'injustice, d'inégalité et de non-respect des règles qui caractérisent le monde réel. Lisa Tessman, Alison Jaggar et d'autres féministes ont appliqué cette distinction à l'éthique et à la bioéthique<ref>Tessman, L. (2009). ''Feminist ethics and social and political philosophy: Theorizing the non-ideal''. Springer.</ref><ref>Jaggar, A. (2009). « L'Imagination au Pouvoir: Comparing John Rawls's method of ideal theory with Iris Marion Young's method of critical theory ». In L. Tessman (Ed.), ''Feminist ethics and social and political philosophy'' (pp. 59-66). Springer.</ref>. Andrew Neitzke argumente qu'une bioéthique non-idéale doit analyser les structures d'oppression et d'exploitation qui caractérisent la médecine capitaliste contemporaine, plutôt que de se limiter à l'examen de dilemmes individuels dans un contexte présumé juste<ref>Neitzke, A. B. (2021). « Critical theoretical methodology for nonideal contributions to bioethics ». In E. Victor & L. K. Guidry-Grimes (Eds.), ''Applying nonideal theory to bioethics'' (pp. 69-97). Springer.</ref>. La marchandisation de la santé, l'influence de l'industrie pharmaceutique sur la recherche et la pratique médicale, les inégalités structurelles d'accès aux soins constituent des réalités que la bioéthique dominante peine à thématiser. Parallèlement, la bioéthique empirique s'est développée comme méthode intégrant systématiquement les données des sciences sociales (sociologie, anthropologie, psychologie) dans l'analyse éthique<ref>Kon, A. A. (2009). « The role of empirical research in bioethics ». ''American Journal of Bioethics'', 9(6-7), p. 59-65.</ref><ref>Borry, P., Schotsmans, P., & Dierickx, K. (2005). « The birth of the empirical turn in bioethics ». ''Bioethics'', 19(1), p. 49-71.</ref>. Cette approche cherche à dépasser l'opposition stérile entre le « est » (faits empiriques) et le « doit » (normes éthiques), reconnaissant que la compréhension empirique des pratiques, attitudes et conséquences éclaire substantiellement le jugement normatif. Toutefois, cette approche doit éviter le piège naturaliste consistant à dériver directement des normes à partir de descriptions factuelles. === L'éthique de l'intelligence artificielle en santé === L'intégration croissante de l'intelligence artificielle (IA) dans les systèmes de santé soulève des enjeux bioéthiques inédits concernant l'explicabilité (explainability) des algorithmes, la responsabilité en cas d'erreur, les biais discriminatoires encodés dans les données d'entraînement, et la relation thérapeutique médiatisée par la technologie<ref>Morley, J., Machado, C. C. V., Burr, C., Cowls, J., Joshi, I., Taddeo, M., & Floridi, L. (2020). « The ethics of AI in health care: A mapping review ». ''Social Science & Medicine'', 260, 113172.</ref>. Sara Gerke, Jenna Becker et I. Glenn Cohen analysent les défis éthiques et juridiques posés par le développement, la mise en œuvre et la supervision de l'IA dans les soins de santé<ref>Gerke, S., Becker, J., & Cohen, I. G. (2023). « The development, implementation, and oversight of artificial intelligence in health care: Legal and ethical issues ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 441-455). Springer.</ref>. Les systèmes d'IA peuvent reproduire et amplifier les discriminations existantes lorsqu'ils sont entraînés sur des données reflétant les biais sociaux. Par exemple, un algorithme d'allocation des ressources en santé peut systématiquement désavantager certains groupes ethniques si les données historiques reflètent des inégalités d'accès préexistantes. La question de l'explicabilité est particulièrement aiguë : comment obtenir un consentement véritablement éclairé lorsque les décisions médicales sont prises par des systèmes de « boîte noire » dont le fonctionnement demeure opaque même pour leurs concepteurs ? À ces difficultés s'ajoutent la protection des données de santé, particulièrement sensibles, dont la collecte massive alimente ces systèmes, et la dépendance des établissements de soins envers les entreprises privées qui conçoivent et possèdent les algorithmes, laquelle soulève des questions de souveraineté, de transparence et de continuité du service. == Conclusion == La bioéthique des vingt dernières années se caractérise par plusieurs mouvements convergents : une remise en question des fondements principistes et individualistes hérités des années 1970-1980 ; un élargissement thématique vers les enjeux de justice globale, de santé environnementale et de vulnérabilité ; une attention accrue aux rapports de pouvoir et aux structures d'oppression qui façonnent les pratiques biomédicales ; et un dialogue croissant avec les perspectives non-occidentales et les savoirs issus de l'expérience vécue de la marginalisation. Les philosophes contemporains – Singer, O'Neill, Jonas, Nussbaum, MacIntyre, Kittay, parmi beaucoup d'autres – ont contribué à affiner considérablement notre compréhension des enjeux éthiques soulevés par la biomédecine et la biotechnologie. Leurs désaccords profonds sur des questions fondamentales (la nature de la personne, le statut moral du fœtus ou du nouveau-né, la valeur du handicap, les limites de l'amélioration humaine) reflètent l'absence de consensus philosophique sur ces questions, mais aussi la richesse d'un débat qui demeure vivant et fécond. Face aux défis inédits posés par l'édition génomique, l'intelligence artificielle, les pandémies, le changement climatique et les inégalités structurelles massives en santé, la bioéthique doit continuer à évoluer. Elle doit intégrer plus systématiquement les perspectives des personnes directement affectées par les politiques de santé ; elle doit reconnaître et corriger ses angles morts épistémiques et culturels ; elle doit développer des outils conceptuels capables d'appréhender les enjeux systémiques et structurels plutôt que se limiter aux dilemmes individuels ; et elle doit cultiver l'humilité face à l'incertitude irréductible qui caractérise de nombreuses décisions dans ce domaine. Comme le soulignait Potter, la bioéthique doit rester un « pont » – pont entre les sciences et les humanités, entre le savoir expert et l'expérience vécue, entre les traditions culturelles diverses, et entre le présent et l'avenir. C'est à cette condition qu'elle pourra remplir sa mission fondamentale : contribuer à un monde où les avancées de la connaissance et de la technique servent effectivement le bien de tous les êtres sensibles et la préservation des conditions d'une vie authentiquement humaine sur Terre. == Références == {{references|colonnes=2}} == Bibliographie sélective == * Beauchamp, T. L., & Childress, J. F. (2019). ''Principles of biomedical ethics'' (8e éd.). Oxford University Press. * Barnes, E. (2016). ''The minority body: A theory of disability''. Oxford University Press. * Dickenson, D. (2007). ''Property in the body: Feminist perspectives''. Cambridge University Press. * Kittay, E. F. (1999). ''Love's labor: Essays on women, equality, and dependency''. Routledge. * Leopold, A. (1949). ''A sand county almanac and sketches here and there''. Oxford University Press. * MacIntyre, A. (1981). ''After virtue: A study in moral theory''. University of Notre Dame Press. * Nussbaum, M. C. (2006). ''Frontiers of justice: Disability, nationality, species membership''. Harvard University Press. * O'Neill, O. (2002). ''Autonomy and trust in bioethics''. Cambridge University Press. * Reynolds, J. M., & Wieseler, C. (2019). ''The disability bioethics reader''. Routledge. * Scully, J. L. (2008). ''Disability bioethics: Moral bodies, moral difference''. Rowman & Littlefield. * Singer, P. (2011). ''Practical ethics'' (3e éd.). Cambridge University Press. * Ten Have, H. (2016). ''Global bioethics: An introduction''. Routledge. * Valdés, E., & Lecaros, J. A. (Eds.) (2023). ''Handbook of bioethical decisions, Volume I: Decisions at the bench''. Springer. * Victor, E., & Guidry-Grimes, L. K. (Eds.) (2021). ''Applying nonideal theory to bioethics''. Springer. == Voir aussi == * [[Dictionnaire de philosophie/Autonomie|Autonomie]] * [[Dictionnaire de philosophie/Avortement|Avortement]] * [[Dictionnaire de philosophie/Euthanasie|Euthanasie]] * [[Dictionnaire de philosophie/Personne non-humaine|Personne non-humaine]] * [[Dictionnaire de philosophie/Animal|Animal]] * [[Dictionnaire de philosophie/Anthropocentrisme|Anthropocentrisme]] * [[Dictionnaire de philosophie/Morale|Morale]] {{autocat}} cum8e5pf39aiqukot1shc7cwhxq8r1f 767969 767968 2026-06-18T04:33:46Z PandaMystique 119061 767969 wikitext text/x-wiki {{DicoPhilo|Bioéthique|lecture=oui}} == Définition et origines == [[Fichier:Immanuel Kant - Gemaelde 1.jpg|vignette|upright=1.1|Emmanuel Kant : la formule de l'humanité comme fin en soi inspire l'« impératif bioéthique » de Fritz Jahr.]] La '''bioéthique''' constitue un champ interdisciplinaire qui examine les enjeux moraux, juridiques et sociaux soulevés par les avancées de la médecine, des sciences biologiques et des technologies du vivant<ref>Ten Have, H. (2016). ''Global bioethics: An introduction''. Routledge.</ref>. Le terme fut forgé en 1927 par le pasteur protestant allemand Fritz Jahr dans son article « Bio-Ethik: Eine Umschau über die ethischen Beziehungen des Menschen zu Tier und Pflanze », où il appelait au développement d'une éthique écologique englobant toutes les formes de vie<ref>Jahr, F. (1927). « Bio-Ethik: Eine Umschau über die ethischen Beziehungen des Menschen zu Tier und Pflanze ». ''Kosmos'', 24, p. 2-4.</ref>. Jahr formulait à cette occasion un « impératif bioéthique » qui prolonge l'éthique kantienne en l'étendant au-delà de l'humanité : respecter chaque être vivant comme une fin en soi et le traiter, autant que possible, comme tel. Certains historiens situent dès 1926 la première occurrence publique du terme sous sa plume<ref>Sass, H.-M. (2007). « Fritz Jahr's 1927 concept of bioethics ». ''Kennedy Institute of Ethics Journal'', 17(4), p. 279-295.</ref>. Cependant, c'est Van Rensselaer Potter qui popularisa le concept dans les années 1970 avec son ouvrage ''Bioethics: Bridge to the Future'' (1971), envisageant la bioéthique comme un pont entre les connaissances scientifiques et les valeurs humaines<ref>Potter, V. R. (1971). ''Bioethics: Bridge to the future''. Prentice-Hall.</ref>. Déçu par l'orientation médicale étroite que prit le champ, Potter proposa plus tard le terme de « bioéthique globale » (1988) pour réaffirmer l'importance des dimensions écologiques et sociales<ref>Potter, V. R. (1988). ''Global bioethics: Building on the Leopold legacy''. University of Michigan Press.</ref>. Toutefois, le développement institutionnel de la bioéthique s'ancra principalement dans la réflexion sur les pratiques médicales, notamment à la suite des scandales éthiques majeurs du XXe siècle : l'expérimentation nazie en Allemagne, l'étude de Tuskegee sur la syphilis aux États-Unis (1932-1972), et divers abus dans la recherche médicale à travers le monde<ref>Washington, H. (2008). ''Medical apartheid: The dark history of medical experimentation on Black Americans from colonial times to the present''. Anchor Books.</ref>. == Les grandes questions de la bioéthique == Avant d'examiner les écoles et les auteurs, il est utile de dégager le fil qui les relie. La bioéthique naît d'un écart : les pouvoirs que les sciences du vivant confèrent à l'être humain croissent plus vite que les repères moraux capables de les orienter. Réanimation, greffes, procréation assistée, séquençage du génome, prolongation artificielle de la vie : chaque progrès technique ouvre des choix que les morales héritées n'avaient pas anticipés. De cet écart découlent quelques questions récurrentes, que les sections suivantes reprennent sous des angles divers. Qui mérite une protection morale, et à quel titre : l'embryon, l'[[Dictionnaire de philosophie/Animal|animal]], les générations futures ? Jusqu'où s'étend le [[Dictionnaire de philosophie/Droit|droit]] de chacun à décider pour lui-même, et où ce droit rencontre-t-il la vulnérabilité ou la dépendance ? Que devons-nous aux personnes que la médecine ne peut guérir ? Comment répartir équitablement des ressources de santé toujours limitées ? Et quelle responsabilité portons-nous envers une nature et une humanité que nos techniques peuvent altérer durablement ? À ces questions s'opposent de grandes familles de réponses. Certaines pèsent les conséquences des actes, d'autres invoquent des devoirs ou des droits inviolables, d'autres encore partent du caractère de l'agent ou de la trame concrète des relations humaines. Les pages qui suivent parcourent ces réponses sans en consacrer aucune, car l'intérêt de la bioéthique tient à leur confrontation. == Les fondements du principisme == La bioéthique contemporaine s'est largement structurée autour du ''principisme'', approche développée par Tom Beauchamp et James Childress dans leur ouvrage fondateur ''Principles of Biomedical Ethics'' (1979). Cette méthode identifie quatre principes moraux fondamentaux qui doivent guider la réflexion et la pratique biomédicale<ref>Beauchamp, T. L., & Childress, J. F. (2001). ''Principles of biomedical ethics'' (5e éd.). Oxford University Press.</ref> : * L'[[Dictionnaire de philosophie/Autonomie|autonomie]] : le respect de la capacité des personnes à prendre des décisions éclairées concernant leur propre santé et leur corps. Ce principe sous-tend notamment la pratique du consentement éclairé. * La bienfaisance : l'obligation d'agir pour le [[Dictionnaire de philosophie/Bien|bien]] d'autrui, de promouvoir la santé et le bien-être des patients. * La non-malfaisance : le devoir de ne pas causer de tort, incarné par le précepte hippocratique ''primum non nocere'' (d'abord, ne pas nuire). * La justice : l'exigence d'une distribution équitable des ressources de santé et d'un traitement impartial des personnes. Beauchamp et Childress présentent ces principes comme des obligations ''prima facie'', au sens où Ross emploie cette expression : chacune oblige sauf si elle entre en conflit avec une obligation de même rang, auquel cas il revient au jugement de déterminer laquelle prévaut dans la situation<ref>Ross, W. D. (1930). ''The right and the good''. Oxford University Press.</ref>. Les auteurs ancrent ces principes non dans une théorie éthique unique mais dans la « morale commune » (''common morality''), c'est-à-dire l'ensemble des normes partagées par toutes les personnes sérieusement engagées dans la [[Dictionnaire de philosophie/Morale|vie morale]]. Deux opérations relient ces principes aux cas concrets : la spécification, qui en précise la portée pour un type de situation, et la pondération, qui arbitre leurs conflits ; l'ajustement mutuel des principes et des jugements particuliers emprunte la méthode de l'équilibre réfléchi élaborée par Rawls. Beauchamp et Childress refusent que ces quatre principes forment un algorithme de décision : ils délimitent les questions à poser plutôt qu'ils ne livrent des réponses toutes faites, ce qui distingue le principisme d'une simple liste de contrôle<ref>Campbell, A. V. (2013). ''Bioethics: The basics''. Routledge.</ref>. Ces quatre principes, parfois désignés comme le « mantra de Georgetown », ont exercé une influence considérable sur le développement de la bioéthique anglo-américaine et ont été intégrés dans de nombreux codes et déclarations internationaux<ref>Gillon, R. (2003). « Ethics needs principles—four can encompass the rest—and respect for autonomy should be "first among equals" ». ''British Medical Journal'', 327, p. 1003-1006.</ref>. Toutefois, cette approche principiste a fait l'objet de critiques substantielles que nous examinerons ultérieurement. == La déclaration d'Helsinki et les cadres normatifs internationaux == La réflexion bioéthique s'est progressivement institutionnalisée à travers l'adoption de déclarations et de conventions internationales. Le Code de Nuremberg (1947), formulé par le tribunal militaire américain au terme du procès des médecins nazis, en constitue le premier jalon : il fait du « consentement volontaire » du sujet humain la condition sans laquelle aucune expérimentation ne saurait être entreprise, posant le socle de la doctrine du consentement éclairé<ref>Tribunal militaire de Nuremberg (1947). « Permissible Medical Experiments ». Dans ''Trials of War Criminals before the Nuernberg Military Tribunals under Control Council Law No. 10'', vol. 2, p. 181-182. U.S. Government Printing Office, 1949.</ref>. La Déclaration d'Helsinki (1964), élaborée par l'Association médicale mondiale, établit les principes éthiques fondamentaux de la recherche médicale impliquant des sujets humains. Révisée à plusieurs reprises, elle affirme notamment la primauté des intérêts et du bien-être de chaque sujet sur tous les autres intérêts, incluant ceux de la science et de la société. Sa révision la plus récente, adoptée à Helsinki en 2024 lors de la 75e Assemblée générale, constitue désormais la seule version officielle : elle substitue le terme de « participant » à celui de « sujet », renforce la protection des personnes vulnérables et inscrit l'exigence de justice globale au cœur de la conduite de la recherche<ref>World Medical Association (2024). ''Declaration of Helsinki: Ethical principles for medical research involving human participants''. 75e Assemblée générale, Helsinki.</ref>. Sans constituer un traité juridiquement contraignant, la Déclaration exerce sur la recherche médicale mondiale une autorité morale et professionnelle de premier plan, distincte de la force obligatoire d'une convention. L'article publié par Henry Beecher en 1966 dans le ''New England Journal of Medicine'' recensa vingt-deux études cliniques conduites au mépris de l'éthique de la recherche ; il pesa sur l'instauration d'un contrôle institutionnel des protocoles et sur l'affermissement de l'exigence du consentement<ref>Beecher, H. K. (1966). « Ethics and clinical research ». ''New England Journal of Medicine'', 274(24), p. 1354-1360.</ref>. Aux États-Unis, le Rapport Belmont (1979), produit par la Commission nationale pour la protection des sujets humains dans la recherche biomédicale et comportementale, identifie trois principes éthiques fondamentaux : le respect des personnes, la bienfaisance (incluant la non-malfaisance) et la justice<ref>National Commission for the Protection of Human Subjects of Biomedical and Behavioral Research (1979). ''The Belmont Report: Ethical principles and guidelines for the protection of human subjects of research''. Department of Health, Education, and Welfare.</ref>. Ces principes constitueront la matrice conceptuelle dont s'inspireront Beauchamp et Childress pour développer leur approche principiste. En Europe, la Convention d'Oviedo (1997), officiellement intitulée « Convention pour la protection des droits de l'homme et de la dignité de l'être humain à l'égard des applications de la biologie et de la médecine », représente le premier instrument juridique contraignant au niveau international dans le domaine de la bioéthique. Adoptée par le Conseil de l'Europe, elle place la dignité humaine au cœur de son dispositif normatif, s'inscrivant dans une tradition philosophique kantienne qui contraste avec l'utilitarisme pragmatique dominant dans la bioéthique américaine<ref>Andorno, R. (2005). « The Oviedo Convention: A European legal framework at the intersection of human rights and health law ». ''Journal of International Biotechnology Law'', 2(4), p. 133-143.</ref>. L'UNESCO adopte en 2005 la Déclaration universelle sur la bioéthique et les droits de l'homme, premier instrument normatif mondial non contraignant qui lie explicitement bioéthique et droits humains. Cette déclaration énonce quinze principes, incluant le respect de la dignité humaine, la protection des générations futures, la protection de l'environnement et de la biosphère, reflétant ainsi une vision élargie de la bioéthique plus proche de la conception originelle de Potter<ref>Andorno, R. (2007). « Global bioethics at UNESCO: In defence of the Universal Declaration on Bioethics and Human Rights ». ''Journal of Medical Ethics'', 33, p. 150-154.</ref><ref>UNESCO (2005). ''Universal Declaration on Bioethics and Human Rights''. Organisation des Nations Unies pour l'éducation, la science et la culture.</ref>. == Repères dans le contexte français == Le débat bioéthique français présente une physionomie propre. La France compte parmi les premiers États à s'être dotés d'une instance consultative nationale : le Comité consultatif national d'éthique pour les sciences de la vie et de la santé (CCNE), créé en 1983, rend des avis qui nourrissent la délibération publique sans lier le législateur<ref>Décret du 23 février 1983 portant création du Comité consultatif national d'éthique pour les sciences de la vie et de la santé. Paris.</ref>. Le pays a par ailleurs choisi de légiférer par paliers : une première loi de bioéthique en 1994, qui pose la non-commercialisation du corps humain ainsi que l'anonymat et la gratuité des dons, puis des révisions en 2004, qui institue l'Agence de la biomédecine et prohibe le clonage, en 2011, et en 2021<ref>Loi n° 2021-1017 du 2 août 2021 relative à la bioéthique. ''Journal officiel de la République française'', 3 août 2021.</ref>. La loi du 2 août 2021 a ouvert l'assistance médicale à la procréation aux couples de femmes et aux femmes non mariées, reconnu aux personnes issues d'un don le droit d'accéder à leur majorité à l'identité du donneur, et maintenu un encadrement strict de la recherche sur l'embryon, soumise à l'autorisation de l'Agence de la biomédecine et dont les produits ne peuvent être transférés à des fins de gestation. La même orientation explique l'interdiction, en France, des tests génétiques vendus directement aux particuliers à des fins récréatives : l'examen des caractéristiques génétiques d'une personne reste subordonné à une finalité médicale, scientifique ou judiciaire. Le don d'organes y obéit au principe du consentement présumé : toute personne n'ayant pas fait connaître son refus de son vivant, notamment par inscription au registre national des refus, est réputée donneuse. En matière de fin de vie, la loi Leonetti de 2005, puis la loi Claeys-Leonetti du 2 février 2016, ont prohibé l'obstination déraisonnable, rendu les directives anticipées contraignantes et autorisé, pour les malades en phase terminale, une « sédation profonde et continue » maintenue jusqu'au décès, sans légaliser l'aide active à mourir<ref>Loi n° 2016-87 du 2 février 2016 créant de nouveaux droits en faveur des malades et des personnes en fin de vie. ''Journal officiel de la République française''.</ref>. Un projet en ce sens, qui ouvrirait sous conditions le suicide assisté et, par exception, l'[[Dictionnaire de philosophie/Euthanasie|euthanasie]], a été adopté par l'Assemblée nationale puis rejeté par le Sénat ; le débat législatif s'est poursuivi en 2025-2026<ref>Sénat. « Proposition de loi relative au droit à l'aide à mourir ». Dossier législatif 2024-2025.</ref>. == Les critiques du principisme et les approches alternatives == Dès la fin des années 1980, le principisme fait l'objet de critiques substantielles qui conduisent au développement d'approches alternatives. K. Danner Clouser et Bernard Gert dénoncent le principisme comme une méthode trop abstraite et indéterminée, ne fournissant pas d'orientation suffisante pour résoudre les dilemmes éthiques concrets<ref>Clouser, K. D., & Gert, B. (1990). « A critique of principlism ». ''The Journal of Medicine and Philosophy'', 15(2), p. 219-236.</ref>. Selon eux, les quatre principes ne constituent pas une théorie éthique cohérente mais un catalogue de valeurs sans hiérarchie claire ni procédure de résolution des conflits normatifs. === L'éthique du care et les approches féministes === Les approches féministes en bioéthique, qui émergent dans les années 1990, remettent en question la centralité accordée à l'autonomie individuelle par le principisme, dénonçant son caractère androcentrique et individualiste<ref>Tong, R. (1997). ''Feminist approaches to bioethics: Theoretical reflections and practical applications''. Westview Press.</ref>. Des philosophes comme Carol Gilligan et Nel Noddings développent une éthique du care (éthique du soin) qui valorise les relations d'interdépendance, la vulnérabilité et la responsabilité envers autrui plutôt que l'autonomie abstraite<ref>Gilligan, C. (1982). ''In a different voice: Psychological theory and women's development''. Harvard University Press.</ref><ref>Noddings, N. (1984). ''Caring: A feminine approach to ethics and moral education''. University of California Press.</ref>. Eva Feder Kittay critique l'idéal de l'individu autonome et indépendant qui sous-tend les théories libérales de la justice, soulignant que tous les êtres humains sont inévitablement dépendants à certains moments de leur existence et que cette vulnérabilité doit être reconnue comme condition humaine fondamentale plutôt que comme déficience<ref>Kittay, E. F. (1999). ''Love's labor: Essays on women, equality, and dependency''. Routledge.</ref>. Martha Fineman développe de manière similaire le concept de « sujet vulnérable », contestant l'idéologie de l'autonomie qui ignore les structures de dépendance et les inégalités structurelles<ref>Fineman, M. A. (2004). ''The autonomy myth: A theory of dependency''. The New Press.</ref>. La bioéthique féministe s'est particulièrement investie dans l'analyse critique des technologies reproductives, dénonçant leur impact disproportionné sur les femmes et les risques d'exploitation qu'elles comportent<ref>Dickenson, D. (2007). ''Property in the body: Feminist perspectives''. Cambridge University Press.</ref><ref>Baylis, F., & McLeod, C. (2014). ''Family-making: Contemporary ethical challenges''. Oxford University Press.</ref>. Susan Sherwin insiste sur la nécessité d'une analyse contextuelle qui prenne en compte les rapports de pouvoir et les inégalités structurelles de genre dans l'évaluation éthique des pratiques biomédicales<ref>Sherwin, S. (1992). ''No longer patient: Feminist ethics and health care''. Temple University Press.</ref>. === L'approche par les capabilités === Martha Nussbaum et Amartya Sen développent l'approche par les capabilités, c'est-à-dire les capacités réelles dont disposent les personnes, qui déplace le centre de l'analyse éthique des ressources ou des utilités vers ce que chacun est en mesure d'accomplir parmi les fonctionnements qu'il valorise<ref>Sen, A. (1999). ''Development as freedom''. Anchor Books.</ref><ref>Nussbaum, M. C. (2006). ''Frontiers of justice: Disability, nationality, species membership''. Harvard University Press.</ref>. Pour Nussbaum, une société juste doit garantir à chaque personne un seuil minimal de dix capabilités centrales, incluant la vie, la santé corporelle, l'intégrité corporelle, les sens, l'imagination et la pensée, les émotions, la raison pratique, l'affiliation, le rapport avec les autres espèces, le jeu et le contrôle sur son environnement. Cette approche offre un cadre particulièrement fécond pour penser les questions de justice en santé, de handicap et de vulnérabilité, permettant d'évaluer les inégalités de santé non seulement en termes de distribution des ressources mais en termes de ce que les personnes sont effectivement capables de faire et d'être<ref>Stenlund, M. (2017). « Nussbaum's capabilities approach meets values-based practice: Promoting the freedom of thought of mental health service users ». ''Journal of Medical Ethics'', 43(12), p. 828-833.</ref>. === L'éthique de la vertu et la tradition néo-aristotélicienne === [[Fichier:Aristotle Altemps Inv8575.jpg|vignette|upright=1.1|Aristote : la sagesse pratique (phronèsis) guide le jugement moral au cas par cas, modèle des éthiques de la vertu.]] Alasdair MacIntyre réhabilite l'éthique de la vertu dans son ouvrage majeur ''After Virtue'' (1981), critiquant l'échec du projet moderne des Lumières visant à fonder la moralité sur des principes rationnels universels détachés des traditions particulières<ref>MacIntyre, A. (1981). ''After virtue: A study in moral theory''. University of Notre Dame Press.</ref>. Pour MacIntyre, les vertus sont des qualités acquises dont l'exercice permet d'atteindre les biens internes aux pratiques sociales. Cette approche insiste sur la formation du caractère moral et le rôle des communautés et des traditions dans l'élaboration des normes éthiques. Edmund Pellegrino applique cette éthique de la vertu à la médecine, arguant que la relation thérapeutique exige des vertus spécifiques chez le praticien (compassion, fidélité, intégrité, abnégation) qui ne peuvent se réduire à l'application mécanique de principes<ref>Pellegrino, E. D., & Thomasma, D. C. (1993). ''The virtues in medical practice''. Oxford University Press.</ref>. Le bien du patient ne peut être déterminé de manière abstraite mais nécessite une appréciation contextualisée et relationnelle. === Le casuisme et l'éthique narrative === Le casuisme, réhabilité par Albert Jonsen et Stephen Toulmin dans ''The Abuse of Casuistry'' (1988), propose une méthode de résolution des dilemmes éthiques fondée sur l'analogie avec des cas paradigmatiques plutôt que sur la déduction à partir de principes abstraits<ref>Jonsen, A. R., & Toulmin, S. (1988). ''The abuse of casuistry: A history of moral reasoning''. University of California Press.</ref>. Cette approche, inspirée de la tradition juridique de la common law, privilégie le raisonnement par cas et la prudence (phronèsis) aristotélicienne ([[s:Éthique à Nicomaque|texte sur Wikisource]]). L'éthique narrative développée par Rita Charon et Hilde Lindemann insiste sur l'importance des récits dans la compréhension des enjeux éthiques et dans la formation de l'identité morale<ref>Charon, R. (2006). ''Narrative medicine: Honoring the stories of illness''. Oxford University Press.</ref><ref>Lindemann, H. (2014). ''Holding and letting go: The social practice of personal identities''. Oxford University Press.</ref>. Les narrations des patients, de leurs proches et des soignants constituent des ressources épistémiques et morales essentielles pour appréhender la complexité des situations cliniques. == Trois figures contemporaines : Singer, O'Neill et Jonas == === Peter Singer et l'utilitarisme préférentiel === [[Fichier:Peter Singer (philosopher).jpg|vignette|upright=1.1|Peter Singer étend la considération morale à tout être sensible, par-delà la seule espèce humaine.]] Peter Singer représente sans doute le philosophe moral le plus influent et controversé en bioéthique contemporaine. Dans ''Animal Liberation'' (1975), il développe une critique du spécisme, concept qu'il emprunte à Richard Ryder, dénonçant la discrimination arbitraire fondée sur l'appartenance à l'espèce<ref>Singer, P. (1975). ''Animal liberation: A new ethics for our treatment of animals''. HarperCollins.</ref>. Pour Singer, le critère moralement pertinent n'est pas la rationalité ou l'appartenance à l'espèce humaine, mais la capacité à ressentir la souffrance (sentience). Dans ''Practical Ethics'' (1979) et ''Rethinking Life and Death'' (1994), Singer applique son utilitarisme préférentiel à des questions bioéthiques fondamentales : l'[[Dictionnaire de philosophie/Avortement|avortement]], l'infanticide dans certaines circonstances, l'euthanasie volontaire et non-volontaire<ref>Singer, P. (1979). ''Practical ethics''. Cambridge University Press.</ref><ref>Singer, P. (1994). ''Rethinking life and death: The collapse of our traditional ethics''. St. Martin's Press.</ref>. Il soutient que le simple fait d'être biologiquement humain ne confère pas de statut moral particulier, et que ce qui importe est la capacité à avoir des préférences concernant sa propre existence future. Les nouveau-nés, n'ayant pas cette capacité, ne seraient donc pas des personnes au sens moral du terme, ce qui rendrait moralement acceptable leur euthanasie dans certaines circonstances où leur vie serait marquée par une souffrance intense. Plus récemment, dans ''The Point of View of the Universe'' (2014), co-écrit avec Katarzyna de Lazari-Radek, Singer révèle son évolution vers un utilitarisme hédoniste plutôt que préférentiel<ref>Singer, P., & de Lazari-Radek, K. (2014). ''The point of view of the universe: Sidgwick and contemporary ethics''. Oxford University Press.</ref>. Ses positions sur l'altruisme efficace, développées dans ''The Life You Can Save'' (2009), ont inspiré un mouvement mondial visant à optimiser l'impact des actions caritatives selon des critères utilitaristes<ref>Singer, P. (2009). ''The life you can save: Acting now to end world poverty''. Random House.</ref>. Les thèses de Singer ont suscité de vives controverses, particulièrement de la part des défenseurs des droits des personnes handicapées qui voient dans ses arguments une forme de capacitisme (ableism) remettant en cause la valeur égale de toutes les vies humaines<ref>Kittay, E. F. (2009). « The personal is philosophical is political: A philosopher and mother of a cognitively disabled person sends notes from the battlefield ». ''Metaphilosophy'', 40(3-4), p. 606-627.</ref>. === Onora O'Neill et l'autonomie kantienne === [[Fichier:Official portrait of Baroness O'Neill of Bengarve (cropped2).jpg|vignette|upright=1.1|Onora O'Neill : l'autonomie n'a de valeur que soutenue par des relations de confiance.]] Onora O'Neill a profondément renouvelé la compréhension de l'autonomie en bioéthique à travers une lecture rigoureuse de Kant ([[s:Fondements de la métaphysique des mœurs|texte sur Wikisource]]). Dans son ouvrage ''Autonomy and Trust in Bioethics'' (2002), issu de ses conférences Gifford, elle critique la conception individualiste et consumériste de l'autonomie qui domine la bioéthique anglo-américaine<ref>O'Neill, O. (2002). ''Autonomy and trust in bioethics''. Cambridge University Press.</ref>. Pour O'Neill, l'autonomie kantienne n'est pas la simple capacité de faire des choix selon ses préférences (conception millienne ; [[s:De la liberté|texte sur Wikisource]]), mais l'aptitude à agir selon des principes rationnels universalisables. Cette autonomie « principielle » implique une dimension sociale et relationnelle fondamentale : on ne peut être autonome de manière purement individuelle. O'Neill souligne le paradoxe contemporain : alors que les dispositifs institutionnels multiplient les garanties formelles de l'autonomie (formulaires de consentement, protection des données), la confiance dans les professionnels de santé et les institutions biomédicales s'érode<ref>Black, D. (2002). « Autonomy and trust in bioethics ». ''Journal of the Royal Society of Medicine'', 95(9), p. 466-467.</ref>. Elle montre que l'obsession pour l'autonomie individuelle peut paradoxalement miner les conditions de confiance nécessaires à une relation thérapeutique authentique. Son travail a exercé une influence considérable sur la réflexion concernant le consentement éclairé et les relations fiduciaires en médecine<ref>López Jara, C. A., & Holguín Lew, J. C. (2013). « Autonomy, trust and medical ethics in Onora O'Neill's work ». ''Revista Colombiana de Psiquiatría'', 42(1), p. 120-135.</ref>. === Hans Jonas et le principe de responsabilité === [[Fichier:Hans Jonas an der Universität St. Gallen (1983) HSGH 022-001945 (cropped).jpg|vignette|upright=1.1|Hans Jonas, ici en 1983 : sa réflexion fonde une éthique de la responsabilité envers les générations futures.]] Le philosophe allemand Hans Jonas a marqué la bioéthique par son ouvrage fondamental ''Das Prinzip Verantwortung'' (Le Principe Responsabilité, 1979), qui représente l'une des premières tentatives systématiques d'élaborer une éthique pour la civilisation technologique<ref>Jonas, H. (1979). ''Das Prinzip Verantwortung: Versuch einer Ethik für die technologische Zivilisation''. Insel Verlag. Traduction française : ''Le Principe Responsabilité''. Cerf, 1990.</ref>. Face aux menaces existentielles que la technoscience fait peser sur l'humanité et la biosphère, Jonas formule un nouvel impératif catégorique : « Agis de façon que les effets de ton action soient compatibles avec la permanence d'une vie authentiquement humaine sur terre ». Jonas développe une éthique de la responsabilité tournée vers l'avenir et les générations futures, fondée sur une « heuristique de la peur » qui nous enjoint d'accorder la priorité aux prophéties de malheur sur les promesses technologiques<ref>Jonas, H. (1992). ''Philosophical explorations and metaphysical speculation''. University of Chicago Press.</ref>. Cette approche précautionniste a profondément influencé l'éthique environnementale et la réflexion sur les risques biotechnologiques. Le principe de précaution, aujourd'hui largement reconnu dans les conventions internationales sur l'environnement, puise l'une de ses sources philosophiques majeures dans la pensée jonassienne<ref>Philosophia (2018). « On Hans Jonas' The Imperative of Responsibility ». ''Philosophia: E-journal of Philosophy and Culture'', 17, p. 191-207.</ref>. Jonas insiste sur l'asymétrie fondamentale entre les générations présentes et futures : ces dernières n'existent pas encore et ne peuvent donc exercer aucune réciprocité, contrairement au modèle contractualiste. La responsabilité envers elles ne peut se fonder sur un accord mutuel mais sur la valeur intrinsèque de la vie et sur le devoir de préserver les conditions d'une existence authentiquement humaine. Son analyse du nouveau-né comme archétype de l'objet de responsabilité - être vulnérable dont la simple existence lance un appel au soin - constitue une contribution majeure à la phénoménologie morale de la vulnérabilité<ref>Grant, A. (2021). « Responsibility to others in the future: The foundation of Hans Jonas's ethics ». ''Philosophy World Democracy'', 1(1), p. 85-103.</ref>. == Les concepts opératoires des débats appliqués == Par-delà les grandes approches théoriques, la bioéthique appliquée mobilise un petit nombre de distinctions conceptuelles qui structurent les controverses sur le début et la fin de vie. Ces outils n'appartiennent à aucune école particulière : ils fixent le vocabulaire commun à partir duquel les théories rivales argumentent. === Le statut moral et la notion de personne === La plupart des débats sur l'avortement, l'euthanasie ou l'expérimentation reposent sur la question du statut moral : quels êtres comptent pour eux-mêmes, et à quel titre une conduite peut leur causer un tort ? La discussion sépare l'appartenance biologique à l'espèce humaine et la qualité de personne entendue au sens moral. Mary Anne Warren propose une série de critères de la personnalité morale, parmi lesquels la [[Dictionnaire de philosophie/Conscience|conscience]], la capacité de raisonner et la conscience de soi, et soutient que l'embryon ne les remplit pas<ref>Warren, M. A. (1973). « On the moral and legal status of abortion ». ''The Monist'', 57(1), p. 43-61.</ref>. À l'opposé, les tenants d'un statut attaché à l'appartenance à l'espèce, ou à la simple potentialité, refusent de faire dépendre la valeur d'une vie de l'exercice effectif de telles capacités. L'enjeu pratique est direct : selon le critère retenu, l'embryon, le fœtus, le nouveau-né ou le patient en état végétatif se voient reconnaître des protections fort différentes. === Sacralité ou qualité de la vie === Une seconde ligne de partage oppose deux manières d'évaluer la vie humaine. La tradition de la sacralité de la vie tient toute vie humaine pour également inviolable et refuse qu'on mette fin à l'une d'elles au motif de son état ; la Congrégation pour la doctrine de la foi en donne une expression normative dans sa déclaration ''Iura et bona'', qui condamne l'euthanasie tout en admettant le refus de traitements disproportionnés<ref>Congrégation pour la doctrine de la foi (1980). ''Déclaration sur l'euthanasie'' (Iura et bona). Rome.</ref>. À cette position, Jonathan Glover oppose une évaluation par la qualité de la vie, qui rapporte l'intérêt de prolonger une existence à ce qu'elle apporte à celui qui la vit<ref>Glover, J. (1977). ''Causing death and saving lives''. Penguin Books.</ref>. Les approches du handicap rappellent toutefois que les jugements de qualité de vie portés de l'extérieur sous-estiment d'ordinaire le bien-être réel des personnes concernées, ce qui invite à la prudence dès qu'une décision médicale s'appuie sur eux. === Tuer et laisser mourir === La distinction entre tuer et laisser mourir, ou entre acte et omission, commande une part des débats sur l'euthanasie et l'arrêt des traitements. La pratique médicale et le droit la tiennent pour pertinente : retirer un traitement de maintien en vie est admis là où l'injection létale est prohibée. L'affaire britannique Tony Bland, jugée en 1993, autorisa l'interruption de l'alimentation artificielle d'un patient en état végétatif persistant et fit de cette distinction un point d'appui juridique<ref>Campbell, A. V. (2013). ''Bioethics: The basics''. Routledge.</ref>. James Rachels en conteste la portée morale : par son argument dit de la différence nue, il compare deux cas identiques en tout sauf qu'un agent tue quand l'autre laisse mourir, et conclut que le mode de [[Dictionnaire de philosophie/Causalité|causation]] ne change pas à lui seul la valeur morale de l'acte<ref>Rachels, J. (1975). « Active and passive euthanasia ». ''New England Journal of Medicine'', 292(2), p. 78-80.</ref>. Franklin Miller, Robert Truog et Dan Brock vont plus loin et soutiennent que la frontière entre arrêt de traitement et mise à [[Dictionnaire de philosophie/Mort|mort]] repose sur des « fictions morales », croyances commodes qui alignent les pratiques admises sur l'interdit de tuer<ref>Miller, F. G., Truog, R. D., & Brock, D. W. (2010). « Moral fictions and medical ethics ». ''Bioethics'', 24(9), p. 453-460.</ref>. === Le double effet === Le principe du double effet, hérité de l'analyse thomiste de la légitime défense, distingue les effets visés d'un acte et ses effets seulement prévus. Une même action peut être permise lorsque sa fin et ses moyens sont bons, que l'effet mauvais n'est pas recherché comme moyen, et que la raison d'agir est proportionnée au mal toléré<ref>Vaughn, L. (2023). ''Bioethics: Principles, issues, and cases'' (5e éd.). Oxford University Press.</ref>. On y recourt notamment pour la sédation en phase terminale : administrer des doses croissantes d'analgésiques afin de soulager la douleur est jugé licite même au risque d'abréger la vie, dès lors que la mort n'est pas l'objectif visé. Des critiques objectent que la frontière entre intention et prévision se laisse aisément reformuler et qu'elle sert parfois à requalifier après coup ce que l'on souhaite autoriser. Ces distinctions ne tranchent pas par elles-mêmes les controverses : elles fournissent un langage partagé que les théories morales, principisme, conséquentialiste ou vertuiste, investissent ensuite de leurs propres exigences. == Les débats contemporains majeurs (2005-2025) == === La bioéthique du handicap === La bioéthique du handicap (disability bioethics) s'est affirmée comme un courant critique majeur au cours des vingt dernières années. Des philosophes comme Eva Feder Kittay, Jackie Leach Scully, et plus récemment Joel Michael Reynolds et Christine Wieseler, ont développé une critique systématique des présupposés capacitistes qui sous-tendent une grande partie de la réflexion bioéthique dominante<ref>Reynolds, J. M., & Wieseler, C. (2019). ''The disability bioethics reader''. Routledge.</ref><ref>Scully, J. L. (2008). ''Disability bioethics: Moral bodies, moral difference''. Rowman & Littlefield.</ref>. Le capacitisme désigne l'ensemble des attitudes, préjugés et structures sociales qui valorisent les personnes en fonction de leurs capacités physiques et cognitives, présumant que l'absence ou la limitation de certaines capacités diminue la valeur de la vie. Comme le démontre Reynolds, le capacitisme fonctionne comme un « principe conditionnant » en bioéthique, structurant implicitement le sens même de ce qui compte comme vie humaine digne d'être vécue et déterminant quels autres principes seront considérés comme pertinents<ref>Reynolds, J. M. (2021). « Conditioning principles: On bioethics and the problem of ableism ». In E. Victor & L. K. Guidry-Grimes (Eds.), ''Applying nonideal theory to bioethics'' (pp. 99-130). Springer.</ref>. La bioéthique du handicap conteste vivement le « préjugé expressiviste » identifié par Adrienne Asch, selon lequel le diagnostic prénatal et l'avortement sélectif expriment et renforcent des attitudes négatives envers les personnes handicapées<ref>Asch, A. (1999). « Prenatal diagnosis and selective abortion: A challenge to practice and policy ». ''American Journal of Public Health'', 89(11), p. 1649-1657.</ref>. Cette critique s'étend aux débats sur l'euthanasie et l'aide médicale à mourir, où les personnes handicapées constituent un groupe particulièrement vulnérable face aux pressions sociales et aux présomptions concernant la qualité de leur vie<ref>Campbell, S. M., & Stramondo, J. A. (2017). « The complicated relationship of disability and well-being ». ''Kennedy Institute of Ethics Journal'', 27(2), p. 151-184.</ref>. Les recherches empiriques démontrent que, contrairement aux présupposés dominants, les personnes handicapées rapportent des niveaux de bien-être et de satisfaction de vie similaires à ceux de la population générale, une fois que l'adaptation psychologique est prise en compte et que les obstacles sociaux sont levés<ref>Barnes, E. (2016). ''The minority body: A theory of disability''. Oxford University Press.</ref><ref>Bowen, E., MacLeod, A. K., Bowen, R., & Beaumont, J. G. (2025). « Quality of life among people with disabilities: It's complicated ». ''Disability and Society'', 40(1), p. 89-108.</ref>. Ces données remettent en question l'équivalence présumée entre handicap et mauvaise qualité de vie qui sous-tend de nombreux raisonnements bioéthiques. === Le transhumanisme et le posthumanisme === Le transhumanisme représente un mouvement intellectuel et socio-politique « technoprogressiste », c'est-à-dire favorable à l'usage des techniques pour accroître les capacités humaines, qui prône le recours aux biotechnologies pour remodeler l'organisme humain<ref>Porter, A. (2017). « Bioethics and transhumanism ». ''The Journal of Medicine and Philosophy'', 42(3), p. 237-260.</ref>. Il importe de distinguer trois ambitions de portée inégale : l'amélioration thérapeutique, qui restaure une fonction défaillante et recueille un large assentiment ; l'amélioration non thérapeutique, qui augmente des capacités déjà normales et soulève davantage d'objections ; et le projet posthumain proprement dit, qui vise, pour certains transhumanistes, la création d'êtres « posthumains » aux capacités considérablement augmentées. Nick Bostrom, Anders Sandberg et d'autres transhumanistes soutiennent que nous devrions activement chercher à améliorer les capacités cognitives, la longévité et les capacités physiques humaines au-delà de ce que permet la sélection naturelle<ref>Bostrom, N., & Sandberg, A. (2009). « Cognitive enhancement: Methods, ethics, regulatory challenges ». ''Science and Engineering Ethics'', 15(3), p. 311-341.</ref>. Les transhumanistes récusent l'objection selon laquelle l'évolution aurait optimisé les capacités humaines, arguant que la sélection naturelle maximise la reproduction, non le bien-être<ref>Bostrom, N., Sandberg, A., & van der Merwe, M. (2023). « The evolutionary optimality challenge to human enhancement ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 195-217). Springer.</ref>. Ils soutiennent que l'amélioration (enhancement) de l'humeur, des capacités cognitives ou de la longévité pourrait substantiellement accroître le bien-être humain global. Cependant, le projet transhumaniste fait face à des critiques philosophiques et éthiques substantielles. Leon Kass et d'autres « bioconservateurs » dénoncent la vision réductionniste de la nature humaine qu'il véhicule et les risques de déshumanisation qu'il comporte<ref>Kass, L. (2003). « Ageless bodies, happy souls: Biotechnology and the pursuit of perfection ». ''The New Atlantis'', 1, p. 9-28.</ref>. Susan Levin, dans son ouvrage ''Posthuman Bliss? The Failed Promise of Transhumanism'' (2021), développe une critique fondamentale du transhumanisme sur des bases philosophiques et scientifiques, contestant sa conception de la raison, des émotions, de l'esprit, ainsi que sa vision informationnelle de la réalité<ref>Levin, S. B. (2021). ''Posthuman bliss? The failed promise of transhumanism''. Oxford University Press.</ref>. Les inquiétudes éthiques portent notamment sur : les risques d'accroissement des inégalités sociales si les technologies d'amélioration ne sont accessibles qu'aux plus fortunés ; la pression sociale à se « normaliser » ou « s'améliorer » qui pourrait éroder l'autonomie réelle ; les conséquences imprévisibles de modifications biologiques profondes ; et la dissolution potentielle des valeurs humanistes fondamentales<ref>Corby, P. M. (2024). « The philosophical limitations of transhumanism and its societal implications ». ''The Linacre Quarterly'', 91(4), p. 410-428.</ref>. === L'édition génomique et CRISPR-Cas9 === [[Fichier:DNA double helix horizontal.png|vignette|upright=1.1|La double hélice de l'ADN : l'édition du génome par CRISPR-Cas9 a ravivé les débats sur l'amélioration et l'eugénisme.]] L'avènement de la technologie CRISPR-Cas9 a révolutionné les possibilités d'édition du génome avec une précision, une facilité et un coût sans précédent. Brendan Parent analyse les enjeux éthiques soulevés par cette technologie, notamment la distinction entre thérapie génique somatique (modifications non transmissibles) et modifications germinales (transmissibles aux générations futures)<ref>Parent, B. (2023). « Learning from Icarus: The impact of CRISPR on gene editing ethics ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 9-27). Springer.</ref>. Si la thérapie génique somatique pour traiter des maladies graves fait l'objet d'un relatif consensus éthique, l'édition germinale et l'amélioration génétique demeurent hautement controversées. Calum MacKellar développe une critique vigoureuse de l'utilisation de l'édition génomique pour prévenir les handicaps, y voyant une forme d'eugénisme incompatible avec le principe d'égale dignité de tous les êtres humains, sauf si la motivation parentale relève strictement de l'incapacité personnelle à assumer un enfant handicapé<ref>MacKellar, C. (2023). « Bioethical decision making and genome editing ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 29-42). Springer.</ref>. À l'inverse, des philosophes comme Julian Savulescu défendent un « devoir moral de procréation » selon lequel les parents auraient l'obligation de sélectionner ou produire les « meilleurs » enfants possibles<ref>Savulescu, J. (2001). « Procreative beneficence: Why we should select the best children ». ''Bioethics'', 15(5-6), p. 413-426.</ref>. Le scandale de He Jiankui en 2018, lorsque ce chercheur chinois annonça avoir créé les premiers bébés génétiquement modifiés (pour leur conférer une résistance au VIH), illustre l'urgence de régulations internationales robustes et l'insuffisance des cadres éthiques existants pour encadrer ces technologies puissantes<ref>Cyranoski, D., & Ledford, H. (2018). « Genome-edited baby claim provokes international outcry ». ''Nature'', 563, p. 607-608.</ref>. === Une santé globale (One Health) et bioéthique environnementale === La pandémie de COVID-19 a mis en lumière l'interconnexion profonde entre santé humaine, santé animale et santé environnementale, renforçant la pertinence de l'approche One Health (Une seule santé)<ref>Lee, K., & Brummel, Z. L. (2013). « Operationalizing the one health approach: The global governance challenges ». ''Health Policy and Planning'', 28(7), p. 778-785.</ref>. Karori Mbugua et d'autres bioéthiciens soulignent toutefois que cette approche demeure entachée de biais [[Dictionnaire de philosophie/Anthropocentrisme|anthropocentriques]], privilégiant systématiquement la santé humaine au détriment du bien-être animal et de l'intégrité écologique<ref>Mbugua, K. (2024). « Bioethics and One Health: Beyond anthropocentrism ». In L. Omutoko & W. Jaoko (Eds.), ''Bioethics from the global South'' (pp. 83-91). Springer.</ref>. S'inspirant de l'éthique écocentrique d'Aldo Leopold développée dans son essai « The Land Ethic » (1949), plusieurs auteurs plaident pour une extension du cercle de considération morale incluant non seulement les animaux non-humains mais l'ensemble de la communauté biotique<ref>Leopold, A. (1949). ''A sand county almanac and sketches here and there''. Oxford University Press.</ref>. Cette perspective trouve des échos dans les sagesses traditionnelles africaines qui reconnaissent l'interconnexion et l'interdépendance de tous les aspects de la vie, incluant la nature inanimée (montagnes, rivières) dans l'univers moral<ref>Tosam, M. (2019). « African environmental ethics and sustainable development ». ''Journal of Philosophy'', 9(2), p. 172-192.</ref>. La bioéthique environnementale, bien que constituant théoriquement une composante essentielle de la bioéthique (aux côtés de l'éthique médicale et de l'éthique animale), demeure marginalisée dans la pratique académique et institutionnelle<ref>Resnik, D. (2009). « Bioethics and global climate change ». ''Bioethics Forum'', 39(3), p. 1-6.</ref><ref>Ritchie, C. (2016). ''Moving environmental bioethics into the 21st century: Green bioethics and the common good''. Thèse de doctorat, Boston College.</ref>. Cette négligence est particulièrement problématique à l'ère de l'Anthropocène, où l'impact humain sur les systèmes terrestres atteint des niveaux catastrophiques. === La bioéthique globale et la justice épistémique === L'expression « bioéthique globale » désigne à la fois l'extension géographique de la bioéthique au-delà du monde occidental et son élargissement thématique pour inclure les enjeux de santé mondiale, de justice distributive globale et d'équité en santé<ref>Ten Have, H. (2016). ''Global bioethics: An introduction''. Routledge.</ref>. Solomon Benatar, Peter Singer et d'autres ont appelé à recentrer la bioéthique sur les disparités massives en santé globale plutôt que sur les dilemmes de haute technologie de la médecine occidentale<ref>Benatar, S. R., & Singer, P. A. (2010). « Responsibilities in international research: A new look revisited ». ''Journal of Medical Ethics'', 36(4), p. 194-197.</ref>. Toutefois, cette « globalisation » de la bioéthique soulève des questions [[Dictionnaire de philosophie/Épistémologie|épistémologiques]] et politiques cruciales. Des chercheurs issus du Sud global dénoncent l'injustice épistémique qui caractérise la production et la circulation du savoir bioéthique, dominée par les théories, concepts et perspectives du Nord global<ref>Kwete, X., & Tengatenga, J. (2023). « Where is knowledge from the global South? An account of epistemic justice for a global bioethics ». ''Journal of Medical Ethics'', 49, p. 410-417.</ref>. Cette hégémonie épistémique reproduit et légitime des formes de domination néocoloniale dans la recherche biomédicale et les politiques de santé. Jude Thaddaeus Buyondo développe une critique approfondie du principisme bioéthique depuis une perspective africaine, montrant comment le cadre conceptuel dominant de Beauchamp et Childress échoue à appréhender les réalités sociales, culturelles et économiques de l'Afrique<ref>Buyondo, J. T. (2024). ''The critique of bioethical principlism in contrast to a Black African approach to bioethics''. Wipf & Stock Publishers.</ref>. Il plaide pour une bioéthique holistique enracinée dans les valeurs africaines d'Ubuntu et de solidarité communautaire. Cette exigence de décolonisation épistémique de la bioéthique rejoint les appels féministes pour une bioéthique véritablement pluraliste qui intègre la diversité des perspectives culturelles sans pour autant sacrifier les principes éthiques fondamentaux<ref>Tong, R. (2022). « Towards a feminist global ethics ». ''Bioethics'', 36(1), p. 5-12.</ref>. Le défi consiste à naviguer entre l'écueil du relativisme moral et celui de l'impérialisme éthique, en reconnaissant l'existence de valeurs morales transculturelles tout en demeurant attentif aux contextes particuliers et aux rapports de pouvoir qui structurent les échanges interculturels. == Enjeux méthodologiques contemporains == === La théorie non-idéale et la bioéthique empirique === Charles Mills et d'autres philosophes politiques ont développé la distinction entre théorie idéale et théorie non-idéale<ref>Mills, C. W. (2005). « 'Ideal theory' as ideology ». ''Hypatia'', 20(3), p. 165-184.</ref>. La théorie idéale part d'hypothèses d'obéissance parfaite et de conditions sociales favorables pour élaborer des principes de justice ; la théorie non-idéale part au contraire des conditions d'injustice, d'inégalité et de non-respect des règles qui caractérisent le monde réel. Lisa Tessman, Alison Jaggar et d'autres féministes ont appliqué cette distinction à l'éthique et à la bioéthique<ref>Tessman, L. (2009). ''Feminist ethics and social and political philosophy: Theorizing the non-ideal''. Springer.</ref><ref>Jaggar, A. (2009). « L'Imagination au Pouvoir: Comparing John Rawls's method of ideal theory with Iris Marion Young's method of critical theory ». In L. Tessman (Ed.), ''Feminist ethics and social and political philosophy'' (pp. 59-66). Springer.</ref>. Andrew Neitzke argumente qu'une bioéthique non-idéale doit analyser les structures d'oppression et d'exploitation qui caractérisent la médecine capitaliste contemporaine, plutôt que de se limiter à l'examen de dilemmes individuels dans un contexte présumé juste<ref>Neitzke, A. B. (2021). « Critical theoretical methodology for nonideal contributions to bioethics ». In E. Victor & L. K. Guidry-Grimes (Eds.), ''Applying nonideal theory to bioethics'' (pp. 69-97). Springer.</ref>. La marchandisation de la santé, l'influence de l'industrie pharmaceutique sur la recherche et la pratique médicale, les inégalités structurelles d'accès aux soins constituent des réalités que la bioéthique dominante peine à thématiser. Parallèlement, la bioéthique empirique s'est développée comme méthode intégrant systématiquement les données des sciences sociales (sociologie, anthropologie, psychologie) dans l'analyse éthique<ref>Kon, A. A. (2009). « The role of empirical research in bioethics ». ''American Journal of Bioethics'', 9(6-7), p. 59-65.</ref><ref>Borry, P., Schotsmans, P., & Dierickx, K. (2005). « The birth of the empirical turn in bioethics ». ''Bioethics'', 19(1), p. 49-71.</ref>. Cette approche cherche à dépasser l'opposition stérile entre le « est » (faits empiriques) et le « doit » (normes éthiques), reconnaissant que la compréhension empirique des pratiques, attitudes et conséquences éclaire substantiellement le jugement normatif. Toutefois, cette approche doit éviter le piège naturaliste consistant à dériver directement des normes à partir de descriptions factuelles. === L'éthique de l'intelligence artificielle en santé === L'intégration croissante de l'intelligence artificielle (IA) dans les systèmes de santé soulève des enjeux bioéthiques inédits concernant l'explicabilité (explainability) des algorithmes, la responsabilité en cas d'erreur, les biais discriminatoires encodés dans les données d'entraînement, et la relation thérapeutique médiatisée par la technologie<ref>Morley, J., Machado, C. C. V., Burr, C., Cowls, J., Joshi, I., Taddeo, M., & Floridi, L. (2020). « The ethics of AI in health care: A mapping review ». ''Social Science & Medicine'', 260, 113172.</ref>. Sara Gerke, Jenna Becker et I. Glenn Cohen analysent les défis éthiques et juridiques posés par le développement, la mise en œuvre et la supervision de l'IA dans les soins de santé<ref>Gerke, S., Becker, J., & Cohen, I. G. (2023). « The development, implementation, and oversight of artificial intelligence in health care: Legal and ethical issues ». In E. Valdés & J. A. Lecaros (Eds.), ''Handbook of bioethical decisions, Volume I'' (pp. 441-455). Springer.</ref>. Les systèmes d'IA peuvent reproduire et amplifier les discriminations existantes lorsqu'ils sont entraînés sur des données reflétant les biais sociaux. Par exemple, un algorithme d'allocation des ressources en santé peut systématiquement désavantager certains groupes ethniques si les données historiques reflètent des inégalités d'accès préexistantes. La question de l'explicabilité est particulièrement aiguë : comment obtenir un consentement véritablement éclairé lorsque les décisions médicales sont prises par des systèmes de « boîte noire » dont le fonctionnement demeure opaque même pour leurs concepteurs ? À ces difficultés s'ajoutent la protection des données de santé, particulièrement sensibles, dont la collecte massive alimente ces systèmes, et la dépendance des établissements de soins envers les entreprises privées qui conçoivent et possèdent les algorithmes, laquelle soulève des questions de souveraineté, de transparence et de continuité du service. == Conclusion == La bioéthique des vingt dernières années se caractérise par plusieurs mouvements convergents : une remise en question des fondements principistes et individualistes hérités des années 1970-1980 ; un élargissement thématique vers les enjeux de justice globale, de santé environnementale et de vulnérabilité ; une attention accrue aux rapports de pouvoir et aux structures d'oppression qui façonnent les pratiques biomédicales ; et un dialogue croissant avec les perspectives non-occidentales et les savoirs issus de l'expérience vécue de la marginalisation. Les philosophes contemporains – Singer, O'Neill, Jonas, Nussbaum, MacIntyre, Kittay, parmi beaucoup d'autres – ont contribué à affiner considérablement notre compréhension des enjeux éthiques soulevés par la biomédecine et la biotechnologie. Leurs désaccords profonds sur des questions fondamentales (la nature de la personne, le statut moral du fœtus ou du nouveau-né, la valeur du handicap, les limites de l'amélioration humaine) reflètent l'absence de consensus philosophique sur ces questions, mais aussi la richesse d'un débat qui demeure vivant et fécond. Face aux défis inédits posés par l'édition génomique, l'intelligence artificielle, les pandémies, le changement climatique et les inégalités structurelles massives en santé, la bioéthique doit continuer à évoluer. Elle doit intégrer plus systématiquement les perspectives des personnes directement affectées par les politiques de santé ; elle doit reconnaître et corriger ses angles morts épistémiques et culturels ; elle doit développer des outils conceptuels capables d'appréhender les enjeux systémiques et structurels plutôt que se limiter aux dilemmes individuels ; et elle doit cultiver l'humilité face à l'incertitude irréductible qui caractérise de nombreuses décisions dans ce domaine. Comme le soulignait Potter, la bioéthique doit rester un « pont » – pont entre les sciences et les humanités, entre le savoir expert et l'expérience vécue, entre les traditions culturelles diverses, et entre le présent et l'avenir. C'est à cette condition qu'elle pourra remplir sa mission fondamentale : contribuer à un monde où les avancées de la connaissance et de la technique servent effectivement le bien de tous les êtres sensibles et la préservation des conditions d'une vie authentiquement humaine sur Terre. == Références == {{references|colonnes=2}} == Bibliographie sélective == * Beauchamp, T. L., & Childress, J. F. (2019). ''Principles of biomedical ethics'' (8e éd.). Oxford University Press. * Barnes, E. (2016). ''The minority body: A theory of disability''. Oxford University Press. * Dickenson, D. (2007). ''Property in the body: Feminist perspectives''. Cambridge University Press. * Kittay, E. F. (1999). ''Love's labor: Essays on women, equality, and dependency''. Routledge. * Leopold, A. (1949). ''A sand county almanac and sketches here and there''. Oxford University Press. * MacIntyre, A. (1981). ''After virtue: A study in moral theory''. University of Notre Dame Press. * Nussbaum, M. C. (2006). ''Frontiers of justice: Disability, nationality, species membership''. Harvard University Press. * O'Neill, O. (2002). ''Autonomy and trust in bioethics''. Cambridge University Press. * Reynolds, J. M., & Wieseler, C. (2019). ''The disability bioethics reader''. Routledge. * Scully, J. L. (2008). ''Disability bioethics: Moral bodies, moral difference''. Rowman & Littlefield. * Singer, P. (2011). ''Practical ethics'' (3e éd.). Cambridge University Press. * Ten Have, H. (2016). ''Global bioethics: An introduction''. Routledge. * Valdés, E., & Lecaros, J. A. (Eds.) (2023). ''Handbook of bioethical decisions, Volume I: Decisions at the bench''. Springer. * Victor, E., & Guidry-Grimes, L. K. (Eds.) (2021). ''Applying nonideal theory to bioethics''. Springer. == Voir aussi == * [[Dictionnaire de philosophie/Autonomie|Autonomie]] * [[Dictionnaire de philosophie/Avortement|Avortement]] * [[Dictionnaire de philosophie/Euthanasie|Euthanasie]] * [[Dictionnaire de philosophie/Personne non-humaine|Personne non-humaine]] * [[Dictionnaire de philosophie/Animal|Animal]] * [[Dictionnaire de philosophie/Anthropocentrisme|Anthropocentrisme]] * [[Dictionnaire de philosophie/Morale|Morale]] {{autocat}} e5j4ujzhay3stt56wkjwabsbx0l7eua Dictionnaire de philosophie/Pierre Kropotkine 0 83949 767935 767844 2026-06-17T16:29:16Z PandaMystique 119061 /* Écrits de Kropotkine */ 767935 wikitext text/x-wiki {{DicoPhilo|Pierre Kropotkine}} [[Fichier:Atelier Nadar - Pierre Kropotkine.jpg|vignette|upright=1.1|Pierre Kropotkine, photographie de l'atelier Nadar.]] Prince russe issu de la lignée de Rurik, géographe primé par les sociétés savantes de son temps, officier formé à la cour impériale, Pierre Kropotkine (1842-1921) employa toute son énergie à montrer que les sociétés humaines pouvaient se gouverner sans gouvernants. On le présente souvent comme « le prince anarchiste », formule commode qui dit la rupture sociale mais en masque l'essentiel : Kropotkine fut d'abord celui qui voulut donner à l'[[Dictionnaire de philosophie/Anarchisme|anarchie]] une assise scientifique. Là où d'autres en faisaient une exigence morale ou un cri de révolte, il entreprit de l'enraciner dans la nature elle-même, en s'appuyant sur la biologie, l'histoire et l'observation. Sa thèse centrale tient en un mot, qu'il emprunte au langage courant pour lui donner un sens technique : l'entraide. Contre l'idée, dominante à la fin du XIX{{e}}&nbsp;siècle, que la nature serait une arène où chaque individu lutte contre tous, il soutient que la coopération à l'intérieur d'une même espèce constitue un facteur de l'évolution, souvent plus important que la concurrence. De cette observation naturaliste, il tire une conséquence politique : si la sociabilité est inscrite dans le vivant, alors la contrainte de l'État n'a rien de nécessaire. Deux livres portent cette double ambition : ''La Conquête du pain'' (1892), où il dessine une société communiste sans pouvoir central, et ''L'Entraide, un facteur de l'évolution'' (1902), où il argumente la biologie de la coopération. == Repères biographiques == [[Fichier:Peter Kropotkin 1864.png|vignette|Kropotkine en 1864, durant ses années sibériennes.]] Kropotkine naît à Moscou le 9 décembre 1842, dans une famille de la haute aristocratie possédant des serfs. L'enfance se passe au contact de cette servitude domestique, dont il gardera une mémoire précise et indignée : c'est là, plus tard, qu'il situera l'une des sources de sa sensibilité sociale. Entré à près de quinze ans au corps des Pages, l'école la plus fermée de l'Empire, il côtoie le tsar Alexandre II, dont il devient brièvement le page de chambre. Il en sort en 1862 avec les meilleures notes et une décision qui consterne son entourage : au lieu d'une carrière dans la garde, il demande à servir en Sibérie. Les cinq années sibériennes (1862-1867) forment le tournant. Officier cosaque sur l'Amour, il parcourt à cheval des milliers de kilomètres, lève des cartes, étudie les glaciers et la faune. Deux apprentissages s'y croisent. Le premier est scientifique : ses relevés sur la structure des montagnes d'Asie et sur l'extension des anciennes glaciations lui vaudront une réputation de géographe. Le second est politique, et il le formulera sans détour dans ses souvenirs : l'expérience de l'administration impériale lui apprend l'impuissance du commandement. C'est en Sibérie, écrira-t-il, qu'il perdit toute foi dans la discipline d'État, ayant découvert que rien d'utile ne s'accomplit par l'ordre et la punition, mais seulement par l'accord de volontés convergentes. Un poète exilé, Mikhaïlov, lui met alors entre les mains le ''Système des contradictions économiques'' de Proudhon<ref>Pierre Kropotkine, ''Autour d'une vie. Mémoires''. Sur cet épisode, voir George Woodcock et Ivan Avakumovic, ''The Anarchist Prince'', Londres, 1950, p. 57-58.</ref>. De retour dans la capitale, il étudie les mathématiques, travaille pour la Société géographique russe et acquiert une notoriété savante. Membre actif du comité chargé de préparer une expédition arctique, il déduit vers 1871, de la dérive des glaces et des courants au large de la Nouvelle-Zemble, l'existence de terres encore inconnues plus au nord ; cette hypothèse parut confirmée deux ans plus tard par une expédition autrichienne conduite par Julius Payer et Carl Weyprecht, qui baptise l'archipel « Terre François-Joseph ». C'est aussi en 1871 que la Société géographique russe lui offre son secrétariat, c'est-à-dire une vie tout entière vouée à la recherche. Il refuse. La crise morale qui motive ce refus éclaire tout le reste : de quel droit, se demande-t-il, jouir des plaisirs élevés du savoir quand tout, autour de lui, n'est que misère et lutte pour un morceau de pain ? La science lui paraît un privilège tant qu'elle n'est pas le bien de tous<ref>Pierre Kropotkine, ''Autour d'une vie. Mémoires'' ; passage cité et commenté par Ángel Cappelletti, ''El pensamiento de Kropotkin''.</ref>. En 1872, un voyage en Suisse précipite sa conversion. Il y rencontre la Fédération jurassienne, l'aile antiautoritaire de l'Association internationale des travailleurs, et noue des liens avec James Guillaume puis avec l'horloger Adhémar Schwitzguébel, qui l'introduit auprès des ouvriers de Sonvilier. L'indépendance des horlogers du Jura, leur façon de penser par eux-mêmes et de s'organiser sans chefs, l'impressionne vivement : c'est au sortir de ces montagnes, dira-t-il, que ses vues sur le socialisme se fixèrent et qu'il se sut anarchiste. Il rentre en Russie chargé de littérature socialiste, rejoint le cercle Tchaïkovski et porte la propagande chez les ouvriers et les paysans. Arrêté en mars 1874, au lendemain d'une conférence donnée devant la Société géographique sur les formations glaciaires, il passe deux ans au secret dans la forteresse Pierre-et-Paul, où sa santé se délabre. Transféré à l'hôpital militaire, il s'en évade en 1876, et cette évasion devient aussitôt légendaire<ref>Brian Morris, ''Kropotkin'', Oakland, PM Press, 2018, premier chapitre ; Martin A. Miller, ''Kropotkin'', Chicago, 1976, p. 113-124.</ref>. Commence alors un exil de plus de quarante ans. Il fonde et anime le journal ''Le Révolté'', d'abord à Genève. L'assassinat d'Alexandre II en 1881 entraîne l'expulsion des réfugiés russes ; Kropotkine passe en France, où un procès l'envoie à la prison de Clairvaux de 1883 à 1886. Sa détention émeut le monde savant : le naturaliste Alfred Russel Wallace, le poète Swinburne, l'écrivain et artisan socialiste William Morris et nombre de collaborateurs de l{{'}}''Encyclopædia Britannica'' signent une pétition pour sa libération, que Victor Hugo remet en personne au ministre de la Justice ; Renan et l'Académie des sciences de Paris mettent leurs bibliothèques à sa disposition. Signe d'une rivalité intellectuelle durable, Huxley refuse d'y joindre son nom<ref>Ángel Cappelletti, ''El pensamiento de Kropotkin'', p. 388 ; sur les signataires, le refus de Huxley et la remise de la pétition au ministre par Victor Hugo, George Woodcock et Ivan Avakumovic, ''The Anarchist Prince'', 1950, p. 193-195.</ref>. Libéré, il s'installe en Angleterre, où il écrira ses grands livres. L'unité du mouvement se brise en 1914. Hostile de longue date au militarisme, Kropotkine n'est pourtant pas pacifiste : il redoute que la victoire de l'Allemagne impériale n'écrase en Europe toute espérance d'émancipation. En 1916, il signe avec Jean Grave, Tcherkesov et quelques autres le « Manifeste des Seize », qui prend parti pour les Alliés. La majorité de ses compagnons, Malatesta, Emma Goldman, Alexandre Berkman, Rudolf Rocker, y voient un reniement et s'éloignent de lui<ref>Martin A. Miller, ''Kropotkin'', Chicago, 1976, p. 230-238 ; Brian Morris, ''Kropotkin'', 2018.</ref>. La révolution de février 1917 ouvre enfin le retour. En juin, après plus de quarante ans d'exil, Kropotkine rentre en Russie ; une foule d'environ soixante mille personnes l'accueille à Petrograd, en pleine nuit. Mais l'espoir tourne court. Kerenski lui propose un ministère, qu'il refuse, comme il refuse tout poste du gouvernement provisoire ; les anarchistes, de leur côté, lui tiennent rigueur de son ralliement à la guerre. Il s'installe à Moscou, puis se retire en 1918 à Dmitrov, petite ville au nord de la capitale, où il travaille avec la coopérative locale et achève son traité d'éthique. En mai 1919, une entrevue avec Lénine, ménagée par Bontch-Brouïevitch et connue surtout par le récit qu'en a laissé ce dernier, met face à face deux conceptions inconciliables de la révolution : Kropotkine plaide pour les coopératives et les syndicats, que Lénine juge « bavardages », tandis que Lénine défend la dictature et la terreur. Il n'offrira au pouvoir, prévient-il, qu'une aide négative : lui signaler ses fautes. Ses dernières interventions publiques seront des protestations, l'une contre la mainmise de l'État sur la presse, l'autre contre la pratique des otages. Il meurt à Dmitrov le 8 février 1921. Ses funérailles rassemblent des dizaines de milliers de personnes et forment le dernier grand rassemblement anarchiste que la Russie soviétique tolérera : des militants obtiennent une libération provisoire de prison pour y assister<ref>Brian Morris, ''Kropotkin'', 2018 ; Martin A. Miller, ''Kropotkin'', 1976, p. 240-247 ; le compte rendu de l'entretien provient de Vladimir Bontch-Brouïevitch, témoin proche du pouvoir soviétique, et la datation des rencontres avec Lénine demeure discutée.</ref>. == L'entraide comme facteur d'évolution == Pour saisir la portée de l'entraide, il faut se replacer dans le climat intellectuel des années 1880. Le darwinisme, vulgarisé et durci, sert alors à justifier la concurrence économique : la nature serait un champ de bataille où survit le plus apte, et la société devrait s'y conformer. En 1888, le biologiste Thomas Huxley publie un essai retentissant, ''The Struggle for Existence in Human Society'', qui décrit le monde vivant comme une lutte de gladiateurs et la vie tribale comme une guerre de chacun contre tous, à la manière de Hobbes. C'est à cette image que Kropotkine veut répondre. Sa réponse ne sort pas d'un cabinet, mais des forêts de Sibérie. Lecteur de ''L'Origine des espèces'', il y avait cherché en vain la concurrence acharnée entre animaux d'une même espèce que Darwin lui avait appris à attendre. Avec le zoologiste Ivan Poliakov, son compagnon d'exploration dans les régions du Vitim et de l'Amour, il avait parcouru ces terres l'esprit encore plein de Darwin, sans y rencontrer cette guerre intestine. Ce qu'il observait, c'était autre chose : des adaptations contre le froid et les ennemis, des oiseaux et des ruminants s'entraidant lors des migrations, des espèces luttant ensemble contre la disette plutôt que les unes contre les autres. Une conférence du zoologiste russe Karl Kessler, en 1880, lui fournit la formule qu'il fera sienne : l'appui mutuel est une loi de la nature au même titre que la lutte, mais, pour le progrès de l'espèce, il importe davantage. Kropotkine remarque d'ailleurs que les darwiniens russes, moins marqués par Malthus que leurs collègues anglais, avaient depuis longtemps cette intuition<ref>Pierre Kropotkine, ''L'Entraide, un facteur de l'évolution'', premier chapitre ; sur le contexte scientifique, Brian Morris, ''Kropotkin'', 2018.</ref>. Le livre déploie cette thèse en une vaste fresque, des sociétés animales aux « sauvages », des « barbares » à la cité médiévale, jusqu'aux pratiques d'entraide des sociétés modernes. L'argument biologique est précis : ce ne sont pas les individus les plus rivaux qui survivent, mais les espèces les plus sociables, parce que la coopération conserve mieux la vie et favorise les facultés qui assurent l'avenir du groupe. La conclusion renverse le mot d'ordre que Spencer avait forgé et que le darwinisme social reprit à son compte : « les plus aptes » sont les plus solidaires. Kropotkine se garde pourtant de l'excès inverse. Il refuse l'idylle de Rousseau autant que la guerre de Huxley : la nature n'est ni paix pure ni carnage. Surtout, il précise que l'entraide n'est qu'un facteur de l'évolution parmi d'autres, et reconnaît la part de l'affirmation individuelle. À un correspondant qui voulait modifier le titre de son livre, il rappelle qu'il n'a jamais prétendu expliquer comment l'entraide agit sur l'évolution, seulement montrer qu'elle y agit<ref>Caroline Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism, 1872-1886'', Cambridge, 1989, p. 5-6.</ref>. Une part de sa biologie a depuis vieilli, en particulier son lamarckisme et sa croyance en l'hérédité des caractères acquis, que la génétique du XX{{e}}&nbsp;siècle, à laquelle travailla notamment Theodosius Dobzhansky, devait écarter. L'intuition centrale, en revanche, a tenu : Ashley Montagu a jugé que ses données et ses analyses résistaient bien à l'examen, et Stephen Jay Gould lui a rendu justice dans un essai au titre éloquent, « Kropotkin Was No Crackpot »<ref>Sur le lamarckisme de Kropotkine et la synthèse génétique ultérieure, comme sur le jugement d'Ashley Montagu, Brian Morris, ''Kropotkin'', 2018 ; Stephen Jay Gould, « Kropotkin Was No Crackpot », repris dans ''Bully for Brontosaurus'', 1991.</ref>. == Le communisme anarchiste == [[Fichier:La conquête du pain.jpg|vignette|Couverture de ''La Conquête du pain'' (1892), où Kropotkine expose le communisme anarchiste.]] Kropotkine n'a pas inventé l'anarchisme, ni même le communisme anarchiste, dont il fut plutôt le théoricien le plus écouté. Son apport tient à un déplacement précis à l'intérieur du socialisme antiautoritaire. Les héritiers de Bakounine se disaient « collectivistes » : ils voulaient socialiser les moyens de production, mais laissaient subsister une rétribution proportionnée au travail fourni. Au congrès de la Fédération jurassienne tenu à La Chaux-de-Fonds en octobre 1880, il pèse de tout son poids pour faire adopter un autre mot et une autre idée. Le terme de collectivisme, juge-t-il, garde l'odeur du salariat ; il faut lui préférer le communisme, c'est-à-dire la distribution selon les [[Dictionnaire de philosophie/Besoin|besoins]]. Il avait préparé le terrain, écrivant à Reclus et à Cafiero pour s'assurer de leur appui ; mais devant des délégués hésitants, que le mot effrayait, la résolution ne l'emporta que grâce au discours de Carlo Cafiero. La formule elle-même n'était pas neuve : Dumartheray l'avait esquissée dès 1876, et l'idée mûrissait alors dans les groupes italiens et espagnols<ref>Sur le congrès de La Chaux-de-Fonds et le rôle de Cafiero, Caroline Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism, 1872-1886'', Cambridge, 1989, p. 51-64 ; Brian Morris, ''Kropotkin'', 2018.</ref>. L'argument de fond est une critique de la propriété appuyée sur l'histoire de la richesse. Toute production, soutient Kropotkine, est sociale et héritée : chaque parcelle de sol cultivée en Europe a été arrosée de la sueur de plusieurs générations. Les routes, les machines, le savoir accumulé, rien de tout cela n'est l'œuvre d'un seul homme. Dès lors, comment mesurer la part de chacun ? La question est sans réponse, et c'est là que le salariat se révèle injuste : il prétend évaluer une contribution individuelle qui se perd dans un tissu collectif. « De quel droit, demande-t-il, s'approprier la moindre parcelle de cet immense ensemble et dire : ceci est à moi, non à vous ? »<ref>Pierre Kropotkine, ''La Conquête du pain'', premier chapitre (« Nos richesses »).</ref> Kropotkine en tire la formule qu'il reprend au socialisme français : de chacun selon ses moyens, à chacun selon ses besoins. À ceux qui réclament une part proportionnelle, il oppose l'image simple du tas commun où chacun puise. ''La Conquête du pain'' (1892) tire les conséquences pratiques. Une révolution, pour Kropotkine, doit assurer dès le premier jour le bien-être de tous, faute de quoi elle perdra le soutien populaire. Il ne suffit donc pas de socialiser les usines, comme le veulent les collectivistes et les sociaux-démocrates ; il faut socialiser aussi le logement, les vivres, les vêtements, qui sont pour le travailleur des instruments de production au même titre que l'outil. Abolir la propriété privée des moyens de production tout en la maintenant sur les biens de consommation, c'est, dit-il, asseoir la société sur deux principes contraires : elle retombera dans la propriété ou ira jusqu'au communisme. Contre l'objection de la pénurie, il répond par le rationnement local au début, puis par l'essor d'une production que la science rend possible. Et il écarte une caricature : le communisme qu'il défend n'est pas la grande exploitation autoritaire, la charrue à vapeur passée sur les jardins et les vergers ; on ne touchera pas au lopin du paysan qui le cultive lui-même, avec ses enfants, sans salariés<ref>Pierre Kropotkine, ''La Conquête du pain'', 1892 ; cf. Caroline Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism'', 1989, p. 9.</ref>. À l'économie politique, dans sa version libérale comme dans certaines lectures marxistes, il oppose encore un renversement de méthode. Les économistes partent de la production telle qu'elle existe, puis cherchent comment écouler les marchandises ; il faut partir des besoins, soutient Kropotkine, car c'est le besoin qui pousse d'abord l'homme à produire. De là sa réfutation de la théorie de la surproduction : les crises ne viennent pas de ce qu'on produit trop, mais de ce que les masses, tenues dans la pauvreté par l'organisation marchande, consomment trop peu. Loin de produire en excès, l'époque produirait plutôt trop peu, si l'on mesurait la production aux besoins réels qu'elle laisse insatisfaits<ref>Pierre Kropotkine, ''La Conquête du pain'' ; George Woodcock et Ivan Avakumovic, ''The Anarchist Prince'', 1950, p. 318-319.</ref>. == L'intégration du travail et l'éducation intégrale == Le même refus de la spécialisation gouverne ''Champs, usines et ateliers'' (1899). Kropotkine y attaque la division du travail qu'Adam Smith avait érigée en principe. Cette division, écrivait-il déjà dans ''La Conquête du pain'', revient à étiqueter et marquer les hommes pour la vie : l'un épissera des cordages dans une fabrique, l'autre poussera d'énormes paniers de charbon au fond d'une mine, sans que nul comprenne jamais la machine, le métier ni la mine dans leur ensemble ; ainsi se perdent le goût du travail et la faculté d'inventer qui, aux débuts de l'industrie moderne, avaient créé les machines dont on s'enorgueillit. À la division, il oppose l'intégration : réunir l'agriculture et l'industrie, le travail du cerveau et celui de la main, décentraliser la production, faire en sorte que chaque région produise et consomme une grande variété de biens grâce à une agriculture intensive et à de petits ateliers<ref>Pierre Kropotkine, ''La Conquête du pain'' et ''Champs, usines et ateliers'' ; pour la formule citée, George Woodcock et Ivan Avakumovic, ''The Anarchist Prince'', 1950, p. 322 et 322-327.</ref>. Cette intégration appelle une autre école. Kropotkine se méfie de l'« éducation technique » réclamée de son temps, qui ne ferait que pérenniser la coupure entre savants et manœuvres. Il lui préfère l'éducation intégrale : que chaque être humain, sans distinction de naissance, joigne une connaissance réelle des sciences à la maîtrise d'un métier manuel. L'idée n'a rien d'utopique à ses yeux, et il convoque l'histoire des sciences pour le prouver : Galilée taillait ses lunettes, Leibniz inventait des machines, Linné devint botaniste en cultivant le jardin de son père. Le travail manuel, loin de nuire à la pensée abstraite, la nourrit. On reconnaît là une tradition continentale : l'expression même d'éducation intégrale remonte à Fourier, l'idée fut portée par Bakounine et par les pédagogues libertaires Paul Robin et Jean Grave, et Kropotkine, lecteur aussi de William Morris, l'introduit le premier dans le débat éducatif britannique<ref>Pierre Kropotkine, ''Champs, usines et ateliers'' ; Ruth Kinna, ''Kropotkin. Reviewing the Classical Anarchist Tradition'', Édimbourg, 2016, p. 133-134 ; sur la nouveauté de cette position dans les milieux éducatifs britanniques, Brian Morris, ''Kropotkin'', 2018.</ref>. == Une morale tirée de la nature == Le dernier grand chantier de Kropotkine, resté inachevé, est une éthique. Publié après sa mort, son traité (dont nous n'avons que le premier tome) veut fonder la [[Dictionnaire de philosophie/Morale|morale]] sur les résultats des sciences naturelles, sans recourir ni à la religion ni à aucune transcendance. L'entreprise prolonge ''L'Entraide'' : si la sociabilité est un fait de nature, elle peut servir de sol aux sentiments moraux. Kropotkine décrit alors une série ascendante en trois degrés. À la base, l'entraide, c'est-à-dire l'instinct social que nous partageons avec les animaux grégaires et que Darwin tenait pour plus constant encore que l'instinct de conservation. Au-dessus, la justice, qu'il entend au sens de l'équité, soit la reconnaissance de l'[[Dictionnaire de philosophie/Égalité|égalité]] entre les hommes ; il en crédite Proudhon, qui avait fait de la justice le principe premier de toute morale en la dressant contre l'injustice réelle. Au sommet, ce qu'il nomme la magnanimité, le don de soi sans attente de retour, propre à l'homme et qui mérite seul le nom de morale. La nature, résume-t-il, est le premier instructeur moral de l'homme<ref>Pierre Kropotkine, ''L'Éthique'' ; George Crowder, ''Classical Anarchism. The Political Thought of Godwin, Proudhon, Bakunin, and Kropotkin'', Oxford, 1991, p. 162-163.</ref>. Cette généalogie naturaliste se construit contre deux adversaires. Contre Kant d'abord. Kropotkine reconnaît au devoir kantien, à l'impératif catégorique, une grandeur certaine ; mais il lui reproche de laisser entière la question de l'origine du sens moral. Pourquoi obéir à la loi morale ? D'où vient ce commandement mystérieux ? En traitant la morale comme un domaine séparé du monde naturel, Kant, selon lui, se condamne à la faire dériver d'une source quasi divine, sans l'enraciner dans ce sentiment d'égalité qui, pour Kropotkine, fait le fond de la justice<ref>Pierre Kropotkine, ''L'Éthique'' ; voir Brian Morris, ''Kropotkin'', 2018, sur la lecture kropotkinienne de Kant.</ref>. Contre l'utilitarisme ensuite : Kropotkine ne le tient pas pour faux, mais pour court. La morale est plus que la pesée prudente des plaisirs ; le seul calcul du plaisir peut même conduire aux pires conduites. Reste l'influence qu'il revendique, celle de Jean-Marie Guyau et de son ''Esquisse d'une morale sans obligation ni sanction'' (1884). Guyau partait de la vie comme expansion : nous sentons en nous plus de force, plus d'amour, plus de larmes que nous n'en pouvons employer pour nous-mêmes, et de ce trop-plein naît le mouvement vers autrui, comme la plante fleurit sans y être contrainte. Le devoir n'est alors que la conscience d'un pouvoir. Kropotkine adopte cette morale de la surabondance, mais lui ajoute ce que Guyau avait laissé dans l'ombre : la dimension sociale. La morale, conclut-il, est le produit conjoint de l'instinct, du sentiment et de la raison ; elle ne se réduit pas aux faits de la vie, elle s'y appuie<ref>Jean-Marie Guyau, ''Esquisse d'une morale sans obligation ni sanction'', 1884 ; sur l'usage qu'en fait Kropotkine, Ruth Kinna, ''Kropotkin'', 2016, p. 150-151, et Ángel Cappelletti, ''El pensamiento de Kropotkin''.</ref>. == L'anarchie comme conception scientifique du monde == Ce souci de fonder en nature vaut aussi pour la politique. Kropotkine présente l'anarchie non comme une doctrine parmi d'autres, mais comme une vision d'ensemble du monde, ce que les penseurs allemands nomment ''Weltanschauung'', appuyée sur la méthode des sciences de la nature. L'anarchie, écrit-il, ne reconnaît pas d'autre méthode que celle des sciences naturelles. Son objet est de se former une idée de l'univers entier, y compris l'homme et la société, par la voie de l'induction et de la déduction, comme on étudie une fleur ou une ruche. Puisque l'esprit humain et la vie sociale sont des phénomènes naturels, rien ne justifie de changer de méthode en passant de la fleur à l'homme, ou de la colonie de castors à la cité<ref>Pierre Kropotkine, ''La Science moderne et l'anarchie'' ; Richard Morgan, ''The Making of Kropotkin's Anarchist Thought'', Londres, 2020, p. 74-75.</ref>. Cette position le sépare de deux côtés. D'un côté, des [[Dictionnaire de philosophie/Métaphysique|métaphysiques]] de la religion et de l'idéalisme allemand : il rejette aussi bien le dieu tout-puissant que l'Esprit universel de Hegel. De l'autre, de la [[Dictionnaire de philosophie/Dialectique|dialectique]] marxiste, qu'il tient pour une survivance de cette même métaphysique. Il avait pourtant emprunté à Comte et à Spencer l'idée d'une philosophie synthétique, embrassant d'un même mouvement la nature et la société, sans les suivre lorsqu'ils faisaient de la lutte pour la vie une loi sociale. La science, à ses yeux, ne livre jamais de vérités définitives, seulement une approximation toujours révisable, à la manière dont l'entendait le physiologiste Claude Bernard. Son attachement à la science alla d'ailleurs jusqu'à l'aveuglement : en 1913, il s'en prit vivement à Bergson, coupable selon lui de rabaisser la science en accordant trop à l'intuition dans la découverte<ref>Sur cette attaque de 1913, Caroline Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism'', 1989, p. 2 ; sur l'ambition synthétique héritée de Comte et Spencer, Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism'', p. 3.</ref>. Sa critique de [[Dictionnaire de philosophie/Karl Marx|Marx]] procède du même principe. ''Le Capital'', concède-t-il, est un admirable pamphlet, mais sa portée scientifique lui paraît nulle : le matérialisme historique est à ses yeux [[Dictionnaire de philosophie/Déterminisme|déterministe]], donc paralysant pour l'action, et fondé sur des prédictions que les faits ont démenties<ref>Lettre de Kropotkine à James Guillaume (1903), citée par Caroline Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism'', 1989, p. 3.</ref>. Il y a là un point que ses propres lecteurs lui ont retourné. À vouloir faire de l'anarchie une science, Kropotkine retombe parfois dans le défaut qu'il dénonçait chez Huxley, Spencer ou Marx : il s'appuie moins sur des lois vérifiables que sur une analogie séduisante entre la nature et la société. L'historien Martin Miller a noté que cet « anarchisme scientifique » repose sur une métaphore puissante, mais fragile<ref>Martin A. Miller, ''Kropotkin'', Chicago, 1976, p. 189.</ref>. == L'État, la commune et le fédéralisme == L'État, pour Kropotkine, ne se confond pas avec la société. C'est une formation historique, née pour protéger les privilèges d'une minorité, et qu'il convient d'étudier froidement, avec la même disposition d'esprit que s'il s'agissait d'une société de fourmis ou d'abeilles<ref>Pierre Kropotkine, « L'État, son rôle historique » et ''La Science moderne et l'anarchie'' ; pour la citation sur la méthode, Richard Morgan, ''The Making of Kropotkin's Anarchist Thought'', 2020, p. 74.</ref>. Cette approche le conduit à relire le Moyen Âge à rebours des Lumières dont il se réclame pourtant. Dans les cités libres, fédérations de quartiers et de guildes confédérées entre elles, il voit la forme la plus aboutie d'organisation sans État : entraide, arbitrage à la place du jugement, prix fixés d'un commun accord, approvisionnement assuré par la commune. Et ces villes savaient s'unir : la ligue lombarde, les ligues rhénane et toscane, les vieux cantons suisses montrent à ses yeux que des communes pouvaient se fédérer librement, par pacte et sans se soumettre à un centre. Jamais, ose-t-il écrire, ni avant ni depuis, l'humanité ne connut un bien-être pour tous comparable à celui des cités du Moyen Âge. L'État moderne, militaire et monarchique, se serait édifié du XVI{{e}} au XVIII{{e}}&nbsp;siècle sur les ruines de ces communes. La bourgeoisie, ensuite, n'a pas détruit cet appareil : elle en a hérité et l'a transformé à son profit. De là vient la défiance de Kropotkine envers tout « État ouvrier ». Confier à l'État la terre, les mines, les banques et les usines, comme le proposent les socialistes autoritaires, ce serait forger un instrument de tyrannie plus puissant encore, un capitalisme d'État où le pouvoir passe du capitaliste au bureaucrate. Les classes opprimées qui s'emparent de l'État, prévient-il, deviennent à leur tour des classes oppressives<ref>Ángel Cappelletti, ''El pensamiento de Kropotkin'' ; Pierre Kropotkine, ''La Science moderne et l'anarchie''.</ref>. Le progrès est ailleurs : dans la décentralisation, territoriale et fonctionnelle, dans la libre fédération des communes et des groupes, dans une organisation qui monte de la base vers le sommet et de la périphérie vers le centre, au rebours de la hiérarchie existante. La tournure que prit la révolution russe lui parut, jusqu'à sa mort, donner raison à ces avertissements. == Tensions et postérité == L'édifice de Kropotkine n'a pas échappé à la critique, et c'est sur son point d'appui même, la nature, qu'elle a porté. Si la morale et la politique se déduisent de l'ordre naturel, encore faut-il que la nature enseigne quelque chose en matière de valeurs. Or rien n'est moins sûr. George Crowder a montré que tout l'anarchisme classique, Kropotkine compris, repose sur un « naturalisme éthique » : l'idée que la valeur est inscrite dans le tissu du monde et que la science l'y découvrira. Cette idée se heurte à l'objection de Mill, selon laquelle la conformité à la nature n'a aucun rapport avec le bien et le mal. Entre le fait et la valeur, entre ce qui est et ce qui doit être, la science moderne a plutôt creusé un fossé qu'elle ne l'a comblé. La promesse de lire dans le vivant les règles de la conduite humaine paraît, à cette lumière, intenable<ref>George Crowder, ''Classical Anarchism'', 1991, p. 183-184, citant John Stuart Mill, ''La Nature''.</ref>. Ses défenseurs répondent que l'on simplifie sa position. Kropotkine, fait observer Brian Morris, prétendait fonder la morale sur les faits de la vie, non l'y réduire ; il rejetait la séparation rigide du fait et de la valeur, et tenait la connaissance scientifique pour une série d'approximations, non pour un dogme. Sa naturalisation de l'éthique serait ainsi moins naïve qu'il n'y paraît : elle ne tire pas un devoir d'un fait, elle reconnaît dans la sociabilité le terrain où poussent les sentiments moraux<ref>Brian Morris, ''Kropotkin'', PM Press, 2018.</ref>. Le débat reste ouvert, et il déborde Kropotkine : c'est celui de tout naturalisme moral. On lui a reproché aussi un optimisme trop confiant, sur la bonté humaine comme sur l'abondance prochaine. Son influence a pourtant traversé le siècle. Les travaux sur la coopération, l'[[Dictionnaire de philosophie/Altruisme|altruisme]] et la théorie des jeux évolutionnaire lui ont donné en partie raison. L'écologie sociale de Murray Bookchin, la géographie attentive aux communautés, les réflexions sur l'autogestion et le municipalisme lui doivent beaucoup. Et le tour autoritaire que prit la révolution russe, qu'il dénonça jusqu'à sa mort, a donné à sa critique de l'État un écho qu'elle n'avait pas de son vivant. Le « prince anarchiste » aura voulu, en somme, ce que peu osent encore : penser ensemble la nature et la liberté. == Notes et références == {{references|colonnes=2}} == Œuvres principales == === Écrits de Kropotkine === * ''Paroles d'un révolté'', recueil d'articles établi par Élisée Reclus, Paris, 1885 ([[s:Paroles d'un révolté|texte sur Wikisource]]). * ''Aux jeunes gens'', 1880 ([[s:Aux jeunes gens|texte sur Wikisource]]). * ''La Morale anarchiste'', 1891 ([[s:La Morale anarchiste|texte sur Wikisource]]). * ''La Conquête du pain'', Paris, 1892 ([[s:La Conquête du pain|texte sur Wikisource]]). * ''Champs, usines et ateliers'', 1899 ([[s:Champs, usines et ateliers|texte sur Wikisource]]). * ''Autour d'une vie. Mémoires'', Paris, 1902 (édition originale anglaise : ''Memoirs of a Revolutionist'', 1899). * ''L'Entraide, un facteur de l'évolution'', 1902 (édition anglaise : ''Mutual Aid: A Factor of Evolution'' ; traduction française, 1906). * ''La Grande Révolution, 1789-1793'', Paris, 1909 ([[s:La Grande Révolution|texte sur Wikisource]]). * ''La Science moderne et l'anarchie'', Paris, 1913. * ''L'Éthique'', publication posthume (édition russe, 1922 ; traduction anglaise, ''Ethics: Origin and Development'', 1924. === Études === * {{Ouvrage|langue=en|prénom1=Caroline|nom1=Cahm|titre=Kropotkin and the Rise of Revolutionary Anarchism, 1872-1886|lieu=Cambridge|éditeur=Cambridge University Press|année=1989}} * {{Ouvrage|langue=en|prénom1=George|nom1=Crowder|titre=Classical Anarchism|sous-titre=The Political Thought of Godwin, Proudhon, Bakunin, and Kropotkin|lieu=Oxford|éditeur=Clarendon Press|année=1991}} * {{Ouvrage|langue=en|prénom1=Ruth|nom1=Kinna|titre=Kropotkin|sous-titre=Reviewing the Classical Anarchist Tradition|lieu=Édimbourg|éditeur=Edinburgh University Press|année=2016}} * {{Ouvrage|langue=en|prénom1=Martin A.|nom1=Miller|titre=Kropotkin|lieu=Chicago|éditeur=University of Chicago Press|année=1976}} * {{Ouvrage|langue=en|prénom1=Richard|nom1=Morgan|titre=The Making of Kropotkin's Anarchist Thought|lieu=Londres|éditeur=Routledge|année=2020}} * {{Ouvrage|langue=en|prénom1=Brian|nom1=Morris|titre=Kropotkin|sous-titre=The Politics of Community|lieu=Oakland|éditeur=PM Press|année=2018}} * {{Ouvrage|langue=en|prénom1=George|nom1=Woodcock|prénom2=Ivan|nom2=Avakumovic|titre=The Anarchist Prince|sous-titre=A Biographical Study of Peter Kropotkin|lieu=Londres|éditeur=T. V. Boardman|année=1950}} * {{Ouvrage|langue=es|prénom1=Ángel|nom1=Cappelletti|titre=El pensamiento de Kropotkin|sous-titre=ciencia, ética y anarquía|lieu=Madrid|éditeur=Zero|année=1978}} * {{Ouvrage|langue=en|prénom1=Pierre|nom1=Kropotkine|responsabilité1=édition de Marshall S. Shatz|titre=The Conquest of Bread and Other Writings|lieu=Cambridge|éditeur=Cambridge University Press|année=1995}} {{AutoCat}} [[Catégorie:Philosophe]] {{DEFAULTSORT:Kropotkine, Pierre}} 68v1i9rjvmfjxikq2ymhy5k0258cbyk Dictionnaire de philosophie/N 0 83950 767977 2026-06-18T05:19:34Z PandaMystique 119061 Page créée avec « {{DicoPhilo|N}} <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2em; width: 100%; margin-bottom: 2em;"> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Nation :Nature :Néant :Nécessité :Négation :Négativité :Néokantisme :Néoplatonisme :Néostoïcisme </div> <div style="padding: 1.5em; background: linea... » 767977 wikitext text/x-wiki {{DicoPhilo|N}} <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2em; width: 100%; margin-bottom: 2em;"> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Nation :Nature :Néant :Nécessité :Négation :Négativité :Néokantisme :Néoplatonisme :Néostoïcisme </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Nihilisme :Noème :Noèse :Nom :Nombre :Nominalisme :Non-contradiction :Non-être </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Non-violence :Normal :Normativité :Norme :Notion :Noumène </div> </div> {{PhiloRecherche}} {{autocat}} p3zrykyznekcebsrniczgwp16xgufix Dictionnaire de philosophie/O 0 83951 767978 2026-06-18T05:23:59Z PandaMystique 119061 Page créée avec « {{DicoPhilo|O}} <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2em; width: 100%; margin-bottom: 2em;"> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Obéissance :Objection :Objectivité :Objet :Obligation :Obscurantisme :Observation :Obstacle épistémologique :Occasionnalisme :Oligarchie </div> <div style=... » 767978 wikitext text/x-wiki {{DicoPhilo|O}} <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2em; width: 100%; margin-bottom: 2em;"> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Obéissance :Objection :Objectivité :Objet :Obligation :Obscurantisme :Observation :Obstacle épistémologique :Occasionnalisme :Oligarchie </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Omnipotence :Omniscience :Ontique :Ontologie :Onto-théologie :Opérationnalisme :Opinion :Opposition :Oppression </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Optimisme :Ordre :Organisme :Orgueil :Origine :Oubli :Ousia :Outil </div> </div> {{PhiloRecherche}} {{autocat}} 1chpfgkbofzynwxqhencft0y46gisim Dictionnaire de philosophie/Q 0 83952 767979 2026-06-18T05:29:04Z PandaMystique 119061 Page créée avec « {{DicoPhilo|Q}} <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2em; width: 100%; margin-bottom: 2em;"> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Quadrivium :Qualia :Qualité :Quantification </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radiu... » 767979 wikitext text/x-wiki {{DicoPhilo|Q}} <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2em; width: 100%; margin-bottom: 2em;"> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Quadrivium :Qualia :Qualité :Quantification </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Quantité :Querelle des universaux :Question :Quiddité </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :Quiétisme :Quiétude :Quintessence :Quotidienneté </div> </div> {{PhiloRecherche}} {{autocat}} gv06ome27127l9ma3h8ojf3wc7of8v6