Wikilivres
frwikibooks
https://fr.wikibooks.org/wiki/Accueil
MediaWiki 1.47.0-wmf.8
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
Dictionnaire de philosophie/B
0
30554
768892
768292
2026-06-29T03:31:36Z
PandaMystique
119061
768892
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);">
:Bachelard, Gaston
:Bacon, Francis
:Banalité du mal
:Barbarie
:[[Dictionnaire de philosophie/Willard Van Orman Quine/Barbe de Platon|Barbe de Platon]] (<small>voir aussi : [[Dictionnaire de philosophie/Willard Van Orman Quine|Quine]]</small>)
:[[Dictionnaire de philosophie/Bateau de Neurath|Bateau de Neurath]]
:Bateau de Thésée
:Baudrillard, Jean
:Baumgarten, Alexander
:Béatitude
:[[Dictionnaire de philosophie/Beau|Beau]]
</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);">
:Béhaviorisme
:Bentham, Jeremy
:Bergson, Henri
:Berkeley, George
:Berlin, Isaiah
:[[Dictionnaire de philosophie/Besoin|Besoin]]
:[[Dictionnaire de philosophie/Bien|Bien]]
:Bien commun
:Bien-être
:[[Dictionnaire de philosophie/Bioéthique|Bioéthique]]
:Biopolitique
:Biopouvoir
</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);">
:Bloch, Ernst
:Boèce
:Bon sens
:[[Dictionnaire de philosophie/Bonheur|Bonheur]]
:Bonne volonté
:Bouddhisme
:Bourdieu, Pierre
:Bruno, Giordano
:Buber, Martin
:Butler, Judith
</div></div>
{{PhiloRecherche}}
{{Autocat}}
86hza2b50vjotkss9ohedaqc08wydib
Dictionnaire de philosophie/G
0
32934
768889
767288
2026-06-29T02:59:02Z
PandaMystique
119061
768889
wikitext
text/x-wiki
{{DicoPhilo|G}}
<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/Hans-Georg Gadamer|Gadamer, Hans-Georg]]
:[[Dictionnaire de philosophie/Galilée|Galilée]]
:[[Dictionnaire de philosophie/Pierre Gassendi|Gassendi, Pierre]]
:[[Dictionnaire de philosophie/Généalogie|Généalogie]]
:[[Dictionnaire de philosophie/Généralité|Généralité]]
:[[Dictionnaire de philosophie/Génération|Génération]]
:[[Dictionnaire de philosophie/Générosité|Générosité]]
:[[Dictionnaire de philosophie/Génie|Génie]]
:[[Dictionnaire de philosophie/Genre|Genre]]
</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/Gestalt|Gestalt]]
:[[Philosophie de la connaissance/Le Problème de Gettier|Gettier (Problème de)]]
:[[Dictionnaire de philosophie/Ghana|Ghana]]
:[[Dictionnaire de philosophie/Étienne Gilson|Gilson, Étienne]]
:[[Dictionnaire de philosophie/Gnoséologie|Gnoséologie]]
:[[Dictionnaire de philosophie/Gnosticisme|Gnosticisme]]
:[[Dictionnaire de philosophie/Kurt Gödel|Gödel, Kurt]]
:[[Dictionnaire de philosophie/Nelson Goodman|Goodman, Nelson]]
:[[Dictionnaire de philosophie/Gorgias|Gorgias]]
</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/Goût|Goût]]
:[[Dictionnaire de philosophie/Grammaire|Grammaire]]
:[[Dictionnaire de philosophie/Antonio Gramsci|Gramsci, Antonio]]
:[[Dictionnaire de philosophie/Gratuité|Gratuité]]
:[[Dictionnaire de philosophie/Paul Grice|Grice, Paul]]
:[[Dictionnaire de philosophie/Félix Guattari|Guattari, Félix]]
:[[Dictionnaire de philosophie/Guerre|Guerre]]
</div>
</div>
{{PhiloRecherche}}
{{autocat}}
lqyl5y0p8355stpict3kivdwyqm8l3w
Discussion utilisateur:Matthius
3
33356
768855
696956
2026-06-28T19:15:04Z
DavidL
1746
768855
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
j79cdbmjaxmo35ikiz49f7c2sbe2ywx
768856
768855
2026-06-28T19:22:12Z
Matthius
11787
/* Erreurs à éviter */
768856
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai.
qtcpdx7a4dq4mans3r72yaoac7ln181
768857
768856
2026-06-28T19:22:24Z
Matthius
11787
/* Erreurs à éviter */
768857
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
hho6u6clnrx1j23ziiv5bi3enlfo670
768858
768857
2026-06-28T19:26:42Z
Matthius
11787
/* Erreurs à éviter */
768858
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
i8pfzgpnx1112id2x7ioxxcxlchi8qy
768859
768858
2026-06-28T19:29:11Z
Matthius
11787
/* Erreurs à éviter */
768859
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
kj1mpqm0v8h2cm5gnj68k8hh50kjj11
768865
768859
2026-06-28T19:52:52Z
Matthius
11787
/* Erreurs à éviter */
768865
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Par contre j'avais vu trop large effectivement. Il y a eu plus de participation que j'avais enregistré. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
7kfcas91zebn0tvwtakhk5pw21h5i23
768866
768865
2026-06-28T19:54:07Z
Matthius
11787
/* Erreurs à éviter */
768866
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Par contre j'avais vu trop large effectivement. Il y a eu plus de participation que j'avais enregistré. On peut deviner mon livrel avec le nombre conséquent de titres. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
40at3zhq9ew4xqf4g9o36y4fibotp2w
768868
768866
2026-06-28T19:57:42Z
Matthius
11787
/* Erreurs à éviter */
768868
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Par contre j'avais vu trop large effectivement. Il y a eu plus de participation que j'avais enregistré. On peut deviner mon livrel avec le nombre conséquent de titres associés à des petits paragraphes. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
rykmf4ard36ckdvr98x9vcueyt78iyr
768870
768868
2026-06-28T20:03:22Z
Matthius
11787
/* Erreurs à éviter */
768870
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Par contre je m'étais trompé sur des chapitres effectivement. Il y a eu plus de participation que j'avais enregistré. On peut deviner mon livrel avec le nombre conséquent de titres associés à des petits paragraphes. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
4gz5a3c8zqvxkv6mcwmq2i8d95k9o4y
768871
768870
2026-06-28T20:04:49Z
Matthius
11787
/* Erreurs à éviter */
768871
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Notez que j'ai voulu mettre à jour depuis. Par contre je m'étais trompé sur des chapitres effectivement. Il y a eu plus de participation que j'avais enregistré. On peut deviner mon livrel avec le nombre conséquent de titres associés à des petits paragraphes. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
7la6jpqjubid9r23x3oh83ye3igda3i
768877
768871
2026-06-28T20:11:40Z
Matthius
11787
/* Erreurs à éviter */
768877
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Notez que j'ai voulu mettre à jour depuis. Par contre je m'étais trompé sur des chapitres effectivement. Il y a eu plus de participation que j'avais enregistré. On peut deviner mon livrel avec le nombre conséquent de titres associés à des petits paragraphes ou une explication longue au début. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
3mztu4usdzqio93q9b3a2m2qu9lijcf
768878
768877
2026-06-28T20:16:35Z
Matthius
11787
/* Erreurs à éviter */
768878
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Notez que j'ai voulu mettre à jour depuis. Par contre je m'étais trompé sur des chapitres effectivement. Il y a eu plus de participation que j'avais enregistré. On peut deviner mon livrel avec le nombre conséquent de titres associés à des petits paragraphes ou une explication longue au début. Libres à ceux qui ont participé de s'ajouter mais eux sont dans l'historique. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
on2cd9w37jse66c2wv5r522hgfj6lbi
768881
768878
2026-06-28T20:47:45Z
Matthius
11787
/* Erreurs à éviter */
768881
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Je ne suis pas responsable du manque d'archivage de wikimedia. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Notez que j'ai voulu mettre à jour depuis. Par contre je m'étais trompé sur des chapitres effectivement. Il y a eu plus de participation que j'avais enregistré. On peut deviner mon livrel avec le nombre conséquent de titres associés à des petits paragraphes ou une explication longue au début. Libres à ceux qui ont participé de s'ajouter mais eux sont dans l'historique. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
es4j7pgt62cq31bq8hs1zgbi8v4bbnt
768886
768881
2026-06-28T21:35:47Z
Matthius
11787
/* Erreurs à éviter */
768886
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que des chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Je ne suis pas responsable du manque d'archivage de wikimedia. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Notez que j'ai voulu mettre à jour depuis. Par contre je m'étais trompé sur des chapitres effectivement. Il y a eu plus de participation que j'avais enregistré. On peut deviner mon livrel avec le nombre conséquent de titres associés à des petits paragraphes ou une explication longue au début. Libres à ceux qui ont participé de s'ajouter mais eux sont dans l'historique. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
tlgpqixrqm8j7c4nknxiswy772c34jk
768888
768886
2026-06-28T22:22:57Z
DavidL
1746
/* Erreurs à éviter */
768888
wikitext
text/x-wiki
Bonjour, Matthius, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] :
*[[Aide:Comment modifier une page|Comment modifier une page]]
*[[Aide:Accueil|Sommaire des pages d'aide]]
*[[Wikilivres:Conventions typographiques|Conventions typographiques]]
*[[Wikilivres:Règles|Règles et recommandations]]
*[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]]
Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation.
[[Utilisateur:VIGNERON|V<span style="font-size:75%">IGNERON</span>]] * [[Discussion Utilisateur:VIGNERON|<sup>discut.</sup>]] 18 novembre 2009 à 08:56 (CET)
== [[L'Economie est physique]] ==
Bonjour, [//fr.wikibooks.org/w/index.php?title=L%27Economie_est_physique&diff=458883&oldid=458874 j'ai déposé un bandeau] avec la procédure à suivre pour faire accepter cette copie. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 17 janvier 2015 à 20:34 (CET)
: Bonjour, il s'agit de mon premier livre sur l'économie réelle.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 9 mars 2019 à 21:04 (CET)
== Vous avez reçu un courriel un peu plus tôt ce mois ==
Bonjour {{PAGENAME}}: Veuillez vérifier vos courriers électroniques ! Objet: "The Community Insights survey is coming!" Nous nous tenons à votre disposition pour toutes questions: surveys@wikimedia.org.
Désolé pour le désagrément, [[:w:fr:Special:Diff/175001885|lire mon explication ici]].
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 24 septembre 2020 à 19:37 (CEST)
<!-- Message envoyé par User:Samuel (WMF)@metawiki en utilisant la liste à https://meta.wikimedia.org/w/index.php?title=User:Samuel_(WMF)/Community_Insights_survey/fr&oldid=20476323 -->
== Éviter les blanchiments de page sans discussion préalable ==
Bonjour. Je reviens vers toi pour te dire qu'il est toujours préférable de discuter avec les créateurs d'une page [https://fr.wikibooks.org/w/index.php?title=Wikilivres:Demandes_de_suppression/2023&diff=prev&oldid=696155 avant d'en effacer le contenu], sans quoi cela peut être pris comme un vandalisme très mal perçu au sein des projets. Je peux adopter le « vous » si cela est souhaité, il ne faut pas hésiter à me le demander. Belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 20 mai 2023 à 21:04 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
** Récidive.
* Vandalisme et trolling
** Prétendre que l'historique est foireux.
Avertissement : plus la liste s'allonge, plus le blocage sera long.
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que des chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Je ne suis pas responsable du manque d'archivage de wikimedia. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Notez que j'ai voulu mettre à jour depuis. Par contre je m'étais trompé sur des chapitres effectivement. Il y a eu plus de participation que j'avais enregistré. On peut deviner mon livrel avec le nombre conséquent de titres associés à des petits paragraphes ou une explication longue au début. Libres à ceux qui ont participé de s'ajouter mais eux sont dans l'historique. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
j1lrpc1h6vevdty0w7z29g9n9sl8c4n
Ubuntu
0
45210
768854
768831
2026-06-28T19:09:58Z
DavidL
1746
Révocation de 3 modifications de [[Special:Contributions/Matthius|Matthius]] ([[User talk:Matthius|discussion]]) vers la dernière version de [[User:DavidL|DavidL]]
680359
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
roo2rq612nq4hppn3uaxw7xq1t3jifb
768860
768854
2026-06-28T19:37:41Z
Matthius
11787
Le livrel libre Ubuntu venait d'une autre page wikibooks qui a été effacée : Voici les droits d'auteur du livrel : http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/
768860
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2 à 9 sans Mailman proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux GNU Linux].
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
03tr77ax4cluocvudmuwo9b61cb95t3
768861
768860
2026-06-28T19:39:10Z
Matthius
11787
/* Sommaire */ http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/
768861
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2 à 9 sans Mailman proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux GNU Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]).
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
6mb9ei5hlkws2s63069xtyit5jeg9ut
768862
768861
2026-06-28T19:43:56Z
Matthius
11787
/* Sommaire */ Astucieux Linux
768862
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2 à 9 sans Mailman proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]).
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
g2zlmb17zkuz93t6cx4sa6j2ch22yfn
768863
768862
2026-06-28T19:50:28Z
Matthius
11787
/* Sommaire */
768863
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2, 3, 5, 6, 7, 9 proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]).
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
hx19304xuvh219dl2dp0qplbkg15wce
768864
768863
2026-06-28T19:51:06Z
Matthius
11787
/* Sommaire */
768864
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2, 3, 5, 6, 7 proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]).
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
9928n61rvehn5rcrf7fmdmnw1h579ad
768867
768864
2026-06-28T19:55:33Z
Matthius
11787
/* Sommaire */
768867
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2, 3, 5, 6 à 8 sans les sous-dossiers proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]).
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
9tz0nbn6h3rab2aomersdpal3g10i2z
768869
768867
2026-06-28T20:02:22Z
Matthius
11787
/* Sommaire */
768869
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2, 3, 5 à 8 sans les sous-dossiers proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]).
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
p89z8okgjgx33msrw5xx9c4bpx74603
768872
768869
2026-06-28T20:05:33Z
Matthius
11787
/* Sommaire */
768872
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2 et 3, 5 à 8 sans les sous-dossiers proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]).
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
8ymkdd5asr2cp2lelgffttf6md2cgcs
768873
768872
2026-06-28T20:06:38Z
Matthius
11787
/* Sommaire */
768873
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2 et 3, 5 à 8 sans des sous-dossiers proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]).
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
s27e3jqllhh2pjf42unnju4v2geokqy
768874
768873
2026-06-28T20:07:05Z
Matthius
11787
/* Sommaire */
768874
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2 et 3, 5 à 8 sans des sous-dossiers et les images proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]).
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
clx9e4a93ef3bxt0nde87lwac2dwtu2
768875
768874
2026-06-28T20:07:23Z
Matthius
11787
/* Sommaire */
768875
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2 et 3, 5 à 8 sans des sous-dossiers et sans les images proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]).
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
0rev45fszk1glfdrbks2hrcm0wwkqbm
768876
768875
2026-06-28T20:07:59Z
Matthius
11787
/* Sommaire */
768876
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2 et 3, 5 à 8 sans les sous-dossiers Mailman et Wine et sans les images proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]).
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
ffbrktgkn7rqmiro9wjubth3qlpmels
768879
768876
2026-06-28T20:20:06Z
Matthius
11787
/* Sommaire */
768879
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2 et 3, 5 à 8 sans les sous-dossiers Mailman et Wine et sans les images proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]), donc de l'auteur [[Utilisateur:Matthius Matthius]].
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
5s4g8mkyf0hdz2ehistfvlxdimq2xjo
768880
768879
2026-06-28T20:21:16Z
Matthius
11787
/* Sommaire */
768880
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
Les chapitres 2 et 3, 5 à 8 sans les sous-dossiers Mailman et Wine et sans les images proviennent du livrel libre [https://archive.org/details/Astucieux-Linux L'Astucieux Linux] ([http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ archive]), donc de l'auteur [[Utilisateur:Matthius|Matthius]].
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
ol1si54nta8rqekx8t6lmjzmxlcnesy
768887
768880
2026-06-28T22:20:03Z
DavidL
1746
Révocation de 14 modifications de [[Special:Contributions/Matthius|Matthius]] ([[User talk:Matthius|discussion]]) vers la dernière version de [[User:DavidL|DavidL]]
680359
wikitext
text/x-wiki
{{Page de garde|image=Ubuntu-logo-2022.svg|imagedesc=Logo d'Ubuntu|description=
Ubuntu est un système d'exploitation, distribution de Linux. Ce livre est un guide d'utilisateur et se veut donc accessible à tous. Pour une utilisation plus technique destinée aux administrateurs, voir ''[[Le système d'exploitation GNU-Linux]]''.
|avancement=Terminé
|cdu=
* {{CDU item|6/68/681|681.3/681.3.0}}
|versions=
{{version imprimable}}
}}
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
{{Autres projets
|w=Ubuntu (système d'exploitation)
|wikt=Ubuntu
|commons=Ubuntu}}
* [[Firefox]]
* [[LibreOffice et OpenOffice.org]]
[[Catégorie:Ubuntu (livre)|*]]
roo2rq612nq4hppn3uaxw7xq1t3jifb
Discussion:Ubuntu
1
45214
768884
333917
2026-06-28T21:34:25Z
Matthius
11787
Matthius
768884
wikitext
text/x-wiki
== Aide ==
Coucou, je peux aider si besoin. [[Utilisateur:Savant-fou|Savant-fou©]] <small><sup>[[Discussion Utilisateur:Savant-fou|me parler]]</sup></small> 22 mai 2011 à 10:40 (CEST)
:Bien sûr, moi je suis coincé à chercher quelle version de mono fera tourner AWB (j'avais pu le faire marcher dans la version précédente d'Ubuntu plus rapidement). [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 22 mai 2011 à 14:34 (CEST)
Bonjour, moi je n'utilise plus ubuntu depuis la dernière version une fois les mises à jours faites tous les menus sont changé et on est bloqué ok le menu est joli mais comme je n'ai plus eu la possibilité de le personnaliser comme avant tous les clique droit sur le menu sont désactivé je peux plus ajouter d'élément au tableau de bord et le menu qui est très beau me fait perdre beaucoup de temps pour sélectionner une applications faut chercher ou elle est tous est déréglé mais sinon c'est pas mal mais je ne sais rien faire comme je veux je suis donc passé à debian.
<br /> [[Utilisateur:stephane0981|stephane0981]] 31 mai 2011 à 22:53
:Bouton « éteindre » en haut à droite → « Réglages du système » → « Fenêtre de connexion » → « Déverouiller » → dans la boite déroulante choisir « Ubuntu classique » pour revenir à GNOME. [[Utilisateur:Savant-fou|Savant-fou©]] <small><sup>[[Discussion Utilisateur:Savant-fou|me parler]]</sup></small> 31 mai 2011 à 23:51 (CEST)
::Merci mais ce serait encore plus fort sur l'espace principal avec une image {{espiègle}}. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 1 juin 2011 à 08:55 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que les chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Je ne suis pas responsable du manque d'archivage de wikimedia. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Notez que j'ai voulu mettre à jour depuis. Par contre je m'étais trompé sur des chapitres effectivement. Il y a eu plus de participation que j'avais enregistré. On peut deviner mon livrel avec le nombre conséquent de titres associés à des petits paragraphes ou une explication longue au début. Libres à ceux qui ont participé de s'ajouter mais eux sont dans l'historique. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
tk6n1ibepszij8ke4eky30gyjgbx4kd
768885
768884
2026-06-28T21:35:26Z
Matthius
11787
/* Erreurs à éviter */ des
768885
wikitext
text/x-wiki
== Aide ==
Coucou, je peux aider si besoin. [[Utilisateur:Savant-fou|Savant-fou©]] <small><sup>[[Discussion Utilisateur:Savant-fou|me parler]]</sup></small> 22 mai 2011 à 10:40 (CEST)
:Bien sûr, moi je suis coincé à chercher quelle version de mono fera tourner AWB (j'avais pu le faire marcher dans la version précédente d'Ubuntu plus rapidement). [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 22 mai 2011 à 14:34 (CEST)
Bonjour, moi je n'utilise plus ubuntu depuis la dernière version une fois les mises à jours faites tous les menus sont changé et on est bloqué ok le menu est joli mais comme je n'ai plus eu la possibilité de le personnaliser comme avant tous les clique droit sur le menu sont désactivé je peux plus ajouter d'élément au tableau de bord et le menu qui est très beau me fait perdre beaucoup de temps pour sélectionner une applications faut chercher ou elle est tous est déréglé mais sinon c'est pas mal mais je ne sais rien faire comme je veux je suis donc passé à debian.
<br /> [[Utilisateur:stephane0981|stephane0981]] 31 mai 2011 à 22:53
:Bouton « éteindre » en haut à droite → « Réglages du système » → « Fenêtre de connexion » → « Déverouiller » → dans la boite déroulante choisir « Ubuntu classique » pour revenir à GNOME. [[Utilisateur:Savant-fou|Savant-fou©]] <small><sup>[[Discussion Utilisateur:Savant-fou|me parler]]</sup></small> 31 mai 2011 à 23:51 (CEST)
::Merci mais ce serait encore plus fort sur l'espace principal avec une image {{espiègle}}. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 1 juin 2011 à 08:55 (CEST)
== Erreurs à éviter ==
* Insertion de fausses informations
** https://fr.wikibooks.org/w/index.php?title=Ubuntu&diff=768831&oldid=680359
-- ◄ [[Utilisateur:DavidL|'''D'''avid '''L''']] • [[Discussion Utilisateur:DavidL|discuter]] ► 28 juin 2026 à 21:14 (CEST)
*** J'ai mis que les chapitres proviennent du livrel libre l'Astucieux GNU Linux, qui est anciennement L'Astucieux Linux ou aides-informatique.com comme l'indique la page. Je suis d'accord que des utilisateurs ont mis des images et changé des articles, mais j'ai écrit que des chapitres proviennent de ce livrel libre ce qui est vrai. Je pense que Jackpotte pourra vous le confirmer. Il a certes créé la page Ubuntu mais cette page venait d'une autre page qui a été effacée. Je ne suis pas responsable du manque d'archivage de wikimedia. Voici pour [http://web.archive.org/web/20101227160455/http://www.aides-informatique.com/ preuve le site web de 2010]. Notez que j'ai voulu mettre à jour depuis. Par contre je m'étais trompé sur des chapitres effectivement. Il y a eu plus de participation que j'avais enregistré. On peut deviner mon livrel avec le nombre conséquent de titres associés à des petits paragraphes ou une explication longue au début. Libres à ceux qui ont participé de s'ajouter mais eux sont dans l'historique. --[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 juin 2026 à 21:22 (CEST)
icbmh7z1ox8vvtn97p431u6i3233hxt
Dictionnaire de philosophie/L
0
49236
768893
767696
2026-06-29T03:39:14Z
PandaMystique
119061
768893
wikitext
text/x-wiki
{{DicoPhilo|L}}
<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);">
:La Boétie
:[[Dictionnaire de philosophie/Julien Offray de La Mettrie|La Mettrie]]
:La Rochefoucauld
:Laïcité
:[[Manuel de terminale de philosophie/Langage|Langage]] <small>(M)</small>
:Lao Tseu
:Légisme
</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);">
:Légitimité
:Leibniz
:Lévinas
:Lévi-Strauss
:Libéralisme
:[[Manuel de terminale de philosophie/Liberté|Liberté]] <small>(M)</small>
:Libre arbitre
</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);">
:Locke
:Logique
:Logos
:Loi
:Lucrèce
:Lumières
</div>
</div>
{{PhiloRecherche}}
{{autocat}}
eq18njx0bt4b3rkx0b5roti1aqln073
Photographie/Personnalités/K/David Knights-Whittome
0
64569
768849
742084
2026-06-28T17:01:17Z
Acabashi
86197
([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Members of the Marlborough House Set.jpg]] → [[File:Members of the Marlborough House Set 02.jpg]] sequencing
768849
wikitext
text/x-wiki
{{Ph s Personnalités}}
'''David Knights-Whittome''' était un photographe [[portrait]]iste britannique, né à Greenwich le 29 décembre 1876 et décédé le 4 novembre 1943 à Sandridge. Sa clientèle incluait les familles royales européennes.
Les parents de David Knights-Whittome étaient Joseph Whittome, un magasinier et pasteur baptiste, et Eunice Smith. Ils eurent 6 autres enfants, dont 3 moururent en bas âge.
[[File:Members of the Marlborough House Set 02.jpg|thumb|Photographie des membres de la ''Marlborough House Set'', 23 novembre 1904, maintenant à la ''[[w:en:National Portrait Gallery, London|National Portrait Gallery]]'' à Londres]]
David Knights-Whittome a travaillé à Hereford, Edmonton et Sutton. Parmi ses modèles on peut citer les rois Edward VII, George V, le Prince Edward, le roi Alphonse XIII d'Espagne, le roi Manuel II du Portugal, la reine Maud de Norvège, etc.
David Knights-Whittome a épousé Sarah Elizabeth « Bessie » Draper à Hertford le 4 juin 1907. Ils eurent deux fils, Maurice et Ronald. Lorsqu'il a pris sa retraite, le couple s'est installé à Saint-Albans, dont il devint conseiller municipal et maire en 1940-41. Son fils Ronald mourut en 1941, alors qu'il était commandant de bord au sein de la Royal Air Force, pendant la seconde guerre mondiale.
Il fut également un membre de la [[Royal Photographic Society]] de 1896 à 1905. Sa collection de plaques et de tirages est conservée par le ''Sutton Local Studies & Archives Centre'' ; les négatifs ont été numérisés dans le cadre du projet ''Past on Glass'' financé à hauteur de 95 000 £ par le ''Heritage Lottery Fund''. Cinq de ses photos figurent dans la collection de la ''[[w:en:National Portrait Gallery, London|National Portrait Gallery]]'' à Londres.
== Liens externes ==
* https://pastonglass.wordpress.com/ Past on Glass
* http://issuu.com/pamelajane/docs/animate_-_for_magcloud?e=8172482 ''Animate: Re-Working the David Knights-Whittome Archive'', livre de Pamela Jane Wheeler
== Galerie de photographies ==
<gallery widths="240px" heights="240px">
(Miss) Bell Barber, 27 Feb 1917 (16580350601).jpg
(Mrs) M Beaumont, 26 Oct (1906) (16395785159).jpg
(Mrs) M Beaumont, 26 Oct (1906) (16555655096).jpg
(S) Halliwell, Esq, 8 Mar 1915 (17374483190).jpg
2nd Lieut Greenfield, 9 Jul 1915 (16858579637).jpg
A B Cleworth, Esq, 19 Apr 1915 (16581577165).jpg
A Bowling, Esq, 12 Feb 1915 (16443531214).jpg
A C Bender, Esq, 18 Jan 1915 (15961795703).jpg
A C Farmer, Esq, 10 Mar 1915 (16394537570).jpg
A C Farmer, Esq, 10 Mar 1915 (16581577515).jpg
A E Jackson, Esq, 6 Feb 1915 (16879755299).jpg
A G Grime, Esq, 11 Mar 1915 (16941748843).jpg
A G Grime, Esq, 11 Mar 1915 (17559786832).jpg
A H Blake, Esq, 29 Dec 1914 (16878434190).jpg
A H Langdun Davies, cat, 4 Nov 1912 (16858568097).jpg
</gallery>
{{T|[[Commons:Category:Glass plate photographs by David Knights-Whittome|voir l'ensemble des photographies de David Knights-Whittome sur Wikimedia Commons]]}}
{{DEFAULTSORT:Knights-Whittome, David}}
{{Ph Personnalités}}
39a58vzcorv311ivdv2p94o57j573j3
Utilisateur:Assassas77
2
64736
768977
721359
2026-06-29T11:57:34Z
Assassas77
50106
/* Chinois */
768977
wikitext
text/x-wiki
{{#babel:fr|en-3|zh-2|zh-min-nan-2|it-1|es-1}}
*[[File:Flag of France.svg|16px]] [[w:fr:Utilisateur:Assassas77|Wikipedia FR]] ([[w:fr:Spécial:Liste_de_suivi|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:en:User:Assassas77|Wikisource EN]] ([[s:en:Special:Watchlist|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:fr:Utilisateur:Assassas77|Wikisource FR]] ([[s:fr:Spécial:Liste_de_suivi|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:zh:用户:Assassas77|Wikisource ZH]] ([[s:zh:Special:Watchlist|suivi]])
*[[File:Wikimedia-favicon.png]] [[c:User:Assassas77|Commons]] ([[c:Special:Watchlist|suivi]])
*[[File:Piece-ico-48px.png|16px]] [[wikt:fr:User:Assassas77|Wiktionnaire FR]] ([[wikt:fr:Special:Watchlist|suivi]])
*[[File:Wikibooks-favicon.png]] [[b:fr:Utilisateur:Assassas77|Wikilivres FR]] ([[b:fr:Special:Watchlist|suivi]])
*[[File:Wikivoyage-ico-48px.png|16px]] [[wikivoyage:fr:Utilisateur:Assassas77|Wikivoyage FR]] ([[wikivoyage:fr:Special:Watchlist|suivi]])
*[[File:Community-ico-48px.png|16px]] [[meta:User:Assassas77|Meta]] ([[meta:Special:Watchlist|suivi]])
*[[File:Mediawiki-ico-48px.png|16px]] [[mw:Special:LanguageStats|Mediawiki]] ([[mw:Special:Watchlist|suivi]])
*[[File:Wikipedia-ico-48px.png|16px]] [[w:nan:I%C5%8Dng-chi%C3%A1:Assassas77|Wikipedia NAN]] ([[w:nan:Special:Watchlist|suivi]])
*[[File:Piece-ico-48px.png|16px]] [[wikt:nan:User:Assassas77|Wiktionnaire NAN]] ([[wikt:nan:Special:Watchlist|suivi]])
*[[File:Wikibooks-favicon.png]] [[b:nan:Utilisateur:Assassas77|Wikilivres NAN]] ([[b:nan:Special:Watchlist|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:nan:用户:Assassas77|Wikisource NAN]] ([[s:nan:Special:Watchlist|suivi]])
*[[/brouillon]]
*[https://fr.wikibooks.org/wiki/Livre_de_cuisine Livre de cuisine]
*[[:Catégorie:Livre de cuisine (livre)|Index de toutes les recettes]]
*[[:Catégorie:Recettes de cuisine (livre)|Recettes triées]]
*[https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial:Suivi_des_liens&limit=100&hidemyself=1&target=Cat%C3%A9gorie%3ALivre_de_cuisine_%28livre%29 Suivi des pages liées Livre de cuisine]<br/><br/>
*[https://fr.wikibooks.org/wiki/Guide_du_vélo_en_ville Guide du vélo en ville]
*[https://fr.wikibooks.org/wiki/Enseignement_du_panjâbî Enseignement du Punjabi]
*[https://fr.wikibooks.org/wiki/Enseignement_de_l%27indonésien Enseignement de l'Indonésien]
*[https://fr.wikibooks.org/wiki/Enseignement_du_chinois Enseignement du Chinois]
*[https://fr.wikibooks.org/wiki/Translinguisme Translinguisme]
*[[Utilisateur:Sub/Wikiversité]]
== Aide-Mémoire pour les livres ==
=== Vérifier que la page est bien dans le Livre de cuisine ===
<pre>
{{livre de cuisine}}
{{ébauche}}
</pre>
=== Vérifier les ingrédients ===
<pre>
{{i|grédient}}
{{i|ingredient|'=o}}
</pre>
=== Traduction ===
<pre>
{{Traduit de|en|charsiu|5/7/2014|244490}}
{{Traduction/Référence|en|Kookboek|244490}}
</pre>
=== Vérifier la présence d'une page Wikipédia à associer ===
* Copier-coller le titre
* Garder le nom de la recette pour la recherche wiki
* Ajouter à l'élément Wikidata section Wikilivres
=== Ajouter une image ===
* Chercher sur Commons, Flickr
=== Pour le bas de page ===
* Parfois :
<pre>
{{wikipédia}}
{{commons|category:}}
{{cuisine|[[Livre de cuisine/pâtes|Pâtes]]}}
</pre>
=== Catégories ===
<pre>
[[Catégorie:|{{SUBPAGENAME}}]]
</pre>
=== Projets ===
* Identifier les ratios dans les recettes
* Améliorer la manière de trouver des recettes (catégories/tirage aléatoire/que faire avec....?)
* Rationaliser les variations dans les recettes : (entre xxx et yyy de farine)
* Améliorer les pages sur les méthodes dans le Livre de cuisine
====▼ Recettes par occasion====
*► Recettes de carnaval
*► Recettes de Noël
*► Recettes de repas de fête
*► Recettes des fêtes pascales
====▼ Recettes par origine====
*► Cuisine d'Afrique
*► Cuisine d'Amérique du Nord
*► Cuisine d'Amérique du Sud
*► Cuisine d'Asie
*► Cuisine d'Europe
*► Cuisine d'Océanie
*► Cuisine du monde
====▼ Recettes par régime alimentaire====
*► Recettes sans gluten
*► Recettes sans lactose
*► Recettes végétaliennes
*► Recettes végétariennes
====▼ Recettes par type de plat====
*► Accompagnements
*► Amuse bouches
*► Bases
*► Boissons
*► Confitures
*► Desserts
*► Entrées
*► Fondues
*► Fritures
*► Galettes
*► Pains
*► Patés
*► Pâtes alimentaires
*► Petits-déjeuners
*► Plat principal
*► Poissons
*► Recettes de pizzas
*► Recettes de ragoût
*► Recettes de tartes
*► Salades
*► Sandwiches
*► Soupes
*► Sucreries
*► Viande
== Chaozhou ==
*utiliser les listes du hanyu shui ping pour déterminer les caractères les plus fréquent
*transformer en teochew
*décomposer ensuite les caractères par la description en bloc (Wiktionnaire Anglais)
*compter le nombre d'occurence de chacun des blocs par niveau
*et ensuite, les classer par élément
*une page avec les différentes normes de prononciation (représentation de tous les morphèmes)
*peh oe, gaginang-cbyzd, missionnaire de quel livre
*la mélodie des tons
== Chinois ==
* écrire un guide d'installation des claviers sur Windows 10
== projet 101fpcanicule ==
101 fiches pratiques pour survivre aux canicules
(En climat tempéré tropical, cout, effort, (avant la canicule- pendant, apres) nivrau technique : cpx technique low, middle, high tech)
Chez soi,
En exterieur
Durant les transports
Au bureau
Dans un espace public couvert
4ukqv4rgqixjyo6ih99205bptqmytht
768978
768977
2026-06-29T11:58:17Z
Assassas77
50106
/* projet 101fpcanicule */
768978
wikitext
text/x-wiki
{{#babel:fr|en-3|zh-2|zh-min-nan-2|it-1|es-1}}
*[[File:Flag of France.svg|16px]] [[w:fr:Utilisateur:Assassas77|Wikipedia FR]] ([[w:fr:Spécial:Liste_de_suivi|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:en:User:Assassas77|Wikisource EN]] ([[s:en:Special:Watchlist|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:fr:Utilisateur:Assassas77|Wikisource FR]] ([[s:fr:Spécial:Liste_de_suivi|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:zh:用户:Assassas77|Wikisource ZH]] ([[s:zh:Special:Watchlist|suivi]])
*[[File:Wikimedia-favicon.png]] [[c:User:Assassas77|Commons]] ([[c:Special:Watchlist|suivi]])
*[[File:Piece-ico-48px.png|16px]] [[wikt:fr:User:Assassas77|Wiktionnaire FR]] ([[wikt:fr:Special:Watchlist|suivi]])
*[[File:Wikibooks-favicon.png]] [[b:fr:Utilisateur:Assassas77|Wikilivres FR]] ([[b:fr:Special:Watchlist|suivi]])
*[[File:Wikivoyage-ico-48px.png|16px]] [[wikivoyage:fr:Utilisateur:Assassas77|Wikivoyage FR]] ([[wikivoyage:fr:Special:Watchlist|suivi]])
*[[File:Community-ico-48px.png|16px]] [[meta:User:Assassas77|Meta]] ([[meta:Special:Watchlist|suivi]])
*[[File:Mediawiki-ico-48px.png|16px]] [[mw:Special:LanguageStats|Mediawiki]] ([[mw:Special:Watchlist|suivi]])
*[[File:Wikipedia-ico-48px.png|16px]] [[w:nan:I%C5%8Dng-chi%C3%A1:Assassas77|Wikipedia NAN]] ([[w:nan:Special:Watchlist|suivi]])
*[[File:Piece-ico-48px.png|16px]] [[wikt:nan:User:Assassas77|Wiktionnaire NAN]] ([[wikt:nan:Special:Watchlist|suivi]])
*[[File:Wikibooks-favicon.png]] [[b:nan:Utilisateur:Assassas77|Wikilivres NAN]] ([[b:nan:Special:Watchlist|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:nan:用户:Assassas77|Wikisource NAN]] ([[s:nan:Special:Watchlist|suivi]])
*[[/brouillon]]
*[https://fr.wikibooks.org/wiki/Livre_de_cuisine Livre de cuisine]
*[[:Catégorie:Livre de cuisine (livre)|Index de toutes les recettes]]
*[[:Catégorie:Recettes de cuisine (livre)|Recettes triées]]
*[https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial:Suivi_des_liens&limit=100&hidemyself=1&target=Cat%C3%A9gorie%3ALivre_de_cuisine_%28livre%29 Suivi des pages liées Livre de cuisine]<br/><br/>
*[https://fr.wikibooks.org/wiki/Guide_du_vélo_en_ville Guide du vélo en ville]
*[https://fr.wikibooks.org/wiki/Enseignement_du_panjâbî Enseignement du Punjabi]
*[https://fr.wikibooks.org/wiki/Enseignement_de_l%27indonésien Enseignement de l'Indonésien]
*[https://fr.wikibooks.org/wiki/Enseignement_du_chinois Enseignement du Chinois]
*[https://fr.wikibooks.org/wiki/Translinguisme Translinguisme]
*[[Utilisateur:Sub/Wikiversité]]
== Aide-Mémoire pour les livres ==
=== Vérifier que la page est bien dans le Livre de cuisine ===
<pre>
{{livre de cuisine}}
{{ébauche}}
</pre>
=== Vérifier les ingrédients ===
<pre>
{{i|grédient}}
{{i|ingredient|'=o}}
</pre>
=== Traduction ===
<pre>
{{Traduit de|en|charsiu|5/7/2014|244490}}
{{Traduction/Référence|en|Kookboek|244490}}
</pre>
=== Vérifier la présence d'une page Wikipédia à associer ===
* Copier-coller le titre
* Garder le nom de la recette pour la recherche wiki
* Ajouter à l'élément Wikidata section Wikilivres
=== Ajouter une image ===
* Chercher sur Commons, Flickr
=== Pour le bas de page ===
* Parfois :
<pre>
{{wikipédia}}
{{commons|category:}}
{{cuisine|[[Livre de cuisine/pâtes|Pâtes]]}}
</pre>
=== Catégories ===
<pre>
[[Catégorie:|{{SUBPAGENAME}}]]
</pre>
=== Projets ===
* Identifier les ratios dans les recettes
* Améliorer la manière de trouver des recettes (catégories/tirage aléatoire/que faire avec....?)
* Rationaliser les variations dans les recettes : (entre xxx et yyy de farine)
* Améliorer les pages sur les méthodes dans le Livre de cuisine
====▼ Recettes par occasion====
*► Recettes de carnaval
*► Recettes de Noël
*► Recettes de repas de fête
*► Recettes des fêtes pascales
====▼ Recettes par origine====
*► Cuisine d'Afrique
*► Cuisine d'Amérique du Nord
*► Cuisine d'Amérique du Sud
*► Cuisine d'Asie
*► Cuisine d'Europe
*► Cuisine d'Océanie
*► Cuisine du monde
====▼ Recettes par régime alimentaire====
*► Recettes sans gluten
*► Recettes sans lactose
*► Recettes végétaliennes
*► Recettes végétariennes
====▼ Recettes par type de plat====
*► Accompagnements
*► Amuse bouches
*► Bases
*► Boissons
*► Confitures
*► Desserts
*► Entrées
*► Fondues
*► Fritures
*► Galettes
*► Pains
*► Patés
*► Pâtes alimentaires
*► Petits-déjeuners
*► Plat principal
*► Poissons
*► Recettes de pizzas
*► Recettes de ragoût
*► Recettes de tartes
*► Salades
*► Sandwiches
*► Soupes
*► Sucreries
*► Viande
== Chaozhou ==
*utiliser les listes du hanyu shui ping pour déterminer les caractères les plus fréquent
*transformer en teochew
*décomposer ensuite les caractères par la description en bloc (Wiktionnaire Anglais)
*compter le nombre d'occurence de chacun des blocs par niveau
*et ensuite, les classer par élément
*une page avec les différentes normes de prononciation (représentation de tous les morphèmes)
*peh oe, gaginang-cbyzd, missionnaire de quel livre
*la mélodie des tons
== Chinois ==
* écrire un guide d'installation des claviers sur Windows 10
== projet 101fpcanicule ==
<pre>
101 fiches pratiques pour survivre aux canicules
(En climat tempéré tropical, cout, effort, (avant la canicule- pendant, apres) nivrau technique : cpx technique low, middle, high tech)
Chez soi,
En exterieur
Durant les transports
Au bureau
Dans un espace public couvert
</pre>
esn3228m82vnjh1l4i2hc5tddgbjwoc
768979
768978
2026-06-29T11:58:34Z
Assassas77
50106
/* projet 101fpcanicule */
768979
wikitext
text/x-wiki
{{#babel:fr|en-3|zh-2|zh-min-nan-2|it-1|es-1}}
*[[File:Flag of France.svg|16px]] [[w:fr:Utilisateur:Assassas77|Wikipedia FR]] ([[w:fr:Spécial:Liste_de_suivi|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:en:User:Assassas77|Wikisource EN]] ([[s:en:Special:Watchlist|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:fr:Utilisateur:Assassas77|Wikisource FR]] ([[s:fr:Spécial:Liste_de_suivi|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:zh:用户:Assassas77|Wikisource ZH]] ([[s:zh:Special:Watchlist|suivi]])
*[[File:Wikimedia-favicon.png]] [[c:User:Assassas77|Commons]] ([[c:Special:Watchlist|suivi]])
*[[File:Piece-ico-48px.png|16px]] [[wikt:fr:User:Assassas77|Wiktionnaire FR]] ([[wikt:fr:Special:Watchlist|suivi]])
*[[File:Wikibooks-favicon.png]] [[b:fr:Utilisateur:Assassas77|Wikilivres FR]] ([[b:fr:Special:Watchlist|suivi]])
*[[File:Wikivoyage-ico-48px.png|16px]] [[wikivoyage:fr:Utilisateur:Assassas77|Wikivoyage FR]] ([[wikivoyage:fr:Special:Watchlist|suivi]])
*[[File:Community-ico-48px.png|16px]] [[meta:User:Assassas77|Meta]] ([[meta:Special:Watchlist|suivi]])
*[[File:Mediawiki-ico-48px.png|16px]] [[mw:Special:LanguageStats|Mediawiki]] ([[mw:Special:Watchlist|suivi]])
*[[File:Wikipedia-ico-48px.png|16px]] [[w:nan:I%C5%8Dng-chi%C3%A1:Assassas77|Wikipedia NAN]] ([[w:nan:Special:Watchlist|suivi]])
*[[File:Piece-ico-48px.png|16px]] [[wikt:nan:User:Assassas77|Wiktionnaire NAN]] ([[wikt:nan:Special:Watchlist|suivi]])
*[[File:Wikibooks-favicon.png]] [[b:nan:Utilisateur:Assassas77|Wikilivres NAN]] ([[b:nan:Special:Watchlist|suivi]])
*[[File:Wikisource-ico-48px.png|16px]] [[s:nan:用户:Assassas77|Wikisource NAN]] ([[s:nan:Special:Watchlist|suivi]])
*[[/brouillon]]
*[https://fr.wikibooks.org/wiki/Livre_de_cuisine Livre de cuisine]
*[[:Catégorie:Livre de cuisine (livre)|Index de toutes les recettes]]
*[[:Catégorie:Recettes de cuisine (livre)|Recettes triées]]
*[https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial:Suivi_des_liens&limit=100&hidemyself=1&target=Cat%C3%A9gorie%3ALivre_de_cuisine_%28livre%29 Suivi des pages liées Livre de cuisine]<br/><br/>
*[https://fr.wikibooks.org/wiki/Guide_du_vélo_en_ville Guide du vélo en ville]
*[https://fr.wikibooks.org/wiki/Enseignement_du_panjâbî Enseignement du Punjabi]
*[https://fr.wikibooks.org/wiki/Enseignement_de_l%27indonésien Enseignement de l'Indonésien]
*[https://fr.wikibooks.org/wiki/Enseignement_du_chinois Enseignement du Chinois]
*[https://fr.wikibooks.org/wiki/Translinguisme Translinguisme]
*[[Utilisateur:Sub/Wikiversité]]
== Aide-Mémoire pour les livres ==
=== Vérifier que la page est bien dans le Livre de cuisine ===
<pre>
{{livre de cuisine}}
{{ébauche}}
</pre>
=== Vérifier les ingrédients ===
<pre>
{{i|grédient}}
{{i|ingredient|'=o}}
</pre>
=== Traduction ===
<pre>
{{Traduit de|en|charsiu|5/7/2014|244490}}
{{Traduction/Référence|en|Kookboek|244490}}
</pre>
=== Vérifier la présence d'une page Wikipédia à associer ===
* Copier-coller le titre
* Garder le nom de la recette pour la recherche wiki
* Ajouter à l'élément Wikidata section Wikilivres
=== Ajouter une image ===
* Chercher sur Commons, Flickr
=== Pour le bas de page ===
* Parfois :
<pre>
{{wikipédia}}
{{commons|category:}}
{{cuisine|[[Livre de cuisine/pâtes|Pâtes]]}}
</pre>
=== Catégories ===
<pre>
[[Catégorie:|{{SUBPAGENAME}}]]
</pre>
=== Projets ===
* Identifier les ratios dans les recettes
* Améliorer la manière de trouver des recettes (catégories/tirage aléatoire/que faire avec....?)
* Rationaliser les variations dans les recettes : (entre xxx et yyy de farine)
* Améliorer les pages sur les méthodes dans le Livre de cuisine
====▼ Recettes par occasion====
*► Recettes de carnaval
*► Recettes de Noël
*► Recettes de repas de fête
*► Recettes des fêtes pascales
====▼ Recettes par origine====
*► Cuisine d'Afrique
*► Cuisine d'Amérique du Nord
*► Cuisine d'Amérique du Sud
*► Cuisine d'Asie
*► Cuisine d'Europe
*► Cuisine d'Océanie
*► Cuisine du monde
====▼ Recettes par régime alimentaire====
*► Recettes sans gluten
*► Recettes sans lactose
*► Recettes végétaliennes
*► Recettes végétariennes
====▼ Recettes par type de plat====
*► Accompagnements
*► Amuse bouches
*► Bases
*► Boissons
*► Confitures
*► Desserts
*► Entrées
*► Fondues
*► Fritures
*► Galettes
*► Pains
*► Patés
*► Pâtes alimentaires
*► Petits-déjeuners
*► Plat principal
*► Poissons
*► Recettes de pizzas
*► Recettes de ragoût
*► Recettes de tartes
*► Salades
*► Sandwiches
*► Soupes
*► Sucreries
*► Viande
== Chaozhou ==
*utiliser les listes du hanyu shui ping pour déterminer les caractères les plus fréquent
*transformer en teochew
*décomposer ensuite les caractères par la description en bloc (Wiktionnaire Anglais)
*compter le nombre d'occurence de chacun des blocs par niveau
*et ensuite, les classer par élément
*une page avec les différentes normes de prononciation (représentation de tous les morphèmes)
*peh oe, gaginang-cbyzd, missionnaire de quel livre
*la mélodie des tons
== Chinois ==
* écrire un guide d'installation des claviers sur Windows 10
== projet 101fpcanicule ==
[[101FPCanicule]]
<pre>
101 fiches pratiques pour survivre aux canicules
(En climat tempéré tropical, cout, effort, (avant la canicule- pendant, apres) nivrau technique : cpx technique low, middle, high tech)
Chez soi,
En exterieur
Durant les transports
Au bureau
Dans un espace public couvert
</pre>
ltgiplu10aoxi3u131tog48zkg62twd
Fonctionnement d'un ordinateur/Les circuits de sélection
0
70056
768906
768493
2026-06-29T11:19:06Z
Mewtow
31375
768906
wikitext
text/x-wiki
Dans ce chapitre, nous allons introduire des circuits électroniques particulièrement importants, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Ils seront réutilisés dans les prochains chapitres, pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur.
==Le décodeur==
[[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]]
Le premier circuit que nous allons voir est le '''décodeur''', un composant qui contient un grand nombre d'entrées et de sorties, avec des sorties qui sont numérotées. Un décodeur possède une entrée sur laquelle on envoie un nombre codé <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un décodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc.
Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro.
Pour résumer, un décodeur est un circuit :
* avec une entrée de <math>N</math> bits ;
* avec <math>2^N</math> sorties de 1 bit ;
* où les sorties sont numérotées en partant de zéro ;
* où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ;
* et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée.
Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro.
Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans toutes les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours.
===La table de vérité d'un décodeur===
Au vu de ce qui vient d'être dit, on peut facilement écrire la table de vérité d'un décodeur. Pour l'exemple, prenons un décodeur 2 vers 4, pour simplifier la table de vérité. Voici sa table de vérité complète, c’est-à-dire qui contient toutes les sorties regroupées :
{|class="wikitable"
|-
! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3
|-
| 0 || 0 || || 1 || 0 || 0 || 0
|-
| 0 || 1 || || 0 || 1 || 0 || 0
|-
| 1 || 0 || || 0 || 0 || 1 || 0
|-
| 1 || 1 || || 0 || 0 || 0 || 1
|}
Vous remarquerez que la table de vérité est assez spéciale. Les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, ce qui traduit le fait qu'une entrée ne met qu'une seule sortie est à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci :
[[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]]
[[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]]
Il y a des choses intéressantes à remarquer sur les équations logiques. Pour rappel, l'équation logique d'une sortie est composée, dans le cas général, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm est l'équation d'un circuit qui compare l'entrée à un nombre bien précis et dépendant du minterm. Si on regarde bien, l'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms. Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm. Enfin, chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée. C'est une autre manière de définir un décodeur : toutes ses sorties codent un minterm, deux sorties différentes ont des minterms différents et tous les minterms possibles sur n bits sont représentés.
Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques. Dans ce qui suit, on suppose que le circuit combinatoire en question a une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats.
[[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]]
Fabriquer un circuit combinatoire avec un décodeur gaspille pas mal de portes logiques. En effet, le décodeur fournit tous les minterms possibles, alors que seule une minorité est réellement utilisée pour fabriquer le circuit combinatoire. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. De plus, les minterms ne sont pas simplifiés. On ne peut pas utiliser les techniques vues dans les chapitres précédents pour simplifier les minterms et réduire le nombre de portes logiques utilisées. Le décodeur reste tel qu'il est, avec l'ensemble des minterms non-simplifiés. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci).
Ceci étant dit, passons à la conception d'un décodeur avec des portes logiques.
===L'intérieur d'un décodeur===
On vient de voir que chaque sortie d'un décodeur correspond à son propre minterm, et que tous les minterms possibles sont représentés. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante que de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre codé entre 0 et 127 et que chaque nombre aura son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127.
Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'adresse vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué. Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager.
[[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]]
Comme autre méthode, plus économe en circuits, on peut créer un décodeur en assemblant plusieurs décodeurs plus simples, nommés sous-décodeurs. Ces sous-décodeurs sont des décodeurs normaux, auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, alors que le décodeur fonctionne normalement sinon. Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final.
[[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]]
==Le démultiplexeur==
Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas.
===Le démultiplexeur à deux sorties===
Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1.
[[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]]
On peut le concevoir facilement en partant de sa table de vérité.
{|class="wikitable"
|-
! Entrée de commande ''Select''
! Entrée de donnée ''Input''
!
! Sortie 1
! Sortie 0
|-
| 0 || 0 || || 0 || 0
|-
|-
| 0 || 1 || || 0 || 1
|-
|-
| 1 || 0 || || 0 || 0
|-
|-
| 1 || 1 || || 1 || 0
|-
|}
===Les démultiplexeurs à plus de deux sorties===
Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées.
[[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]]
Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches.
[[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]]
Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge.
{|class="wikitable"
|-
! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3
|-
| 0 || 0 || 0 || || 0 || 0 || 0 || 0
|-
| 0 || 0 || 1 || || 0 || 0 || 0 || 0
|-
| 0 || 1 || 0 || || 0 || 0 || 0 || 0
|-
| 0 || 1 || 1 || || 0 || 0 || 0 || 0
|-
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|}
En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant :
[[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]]
==Le multiplexeur==
Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus.
[[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]]
Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours.
===Le multiplexeur à deux entrées===
Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors.
[[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]]
Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante :
{|class="wikitable"
|-
!Entrée de commande
!Entrée a
!Entrée b
!Sortie
|-
|0||0||0||0
|-
|0||0||1||0
|-
|0||1||0||1
|-
|0||1||1||1
|-
|1||0||0||0
|-
|1||0||1||1
|-
|1||1||0||0
|-
|1||1||1||1
|}
Sélectionnons les lignes qui mettent la sortie à 1 :
{|class="wikitable"
|-
!Entrée de commande
!Entrée a
!Entrée b
!Sortie
|-
|0||1||0||1
|-
|0||1||1||1
|-
|1||0||1||1
|-
|1||1||1||1
|}
On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc :
: <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math>
L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> :
: <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math>
Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second :
: <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math>
Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 :
: <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math>
On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante :
: <math>(\overline{E_c} . a) + (E_c . b)</math>
Le circuit qui correspond est :
[[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]]
===Les multiplexeurs à plus de deux entrées===
Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions.
[[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]]
Une solution alternative conçoit un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection.
[[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]]
Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné :
* Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro.
* Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1.
Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU.
Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur ! La génération du masque est donc le fait d'un décodeur.
[[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]]
Le circuit précédent n'est cependant pas parfaitement optimisé. En effet, le décodeur est composé d'une couche de portes NON et d'une couche de portes ET. Il est possible de fusionner les portes ET du décodeur, avec celles liée au masque. Le résultat est une simplification qui élimine quelques portes logiques. Voici ce que cela donne pour un multiplexeur 4 vers 1 :
[[File:4to1mux.png|centre|vignette|upright=2|Multiplexeur 2 vers 4, conçu à partir d'un décodeur, simplifié pour éviter des redondances.]]
==L'encodeur==
[[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]]
Il existe un circuit qui fait exactement l'inverse du décodeur : c'est l''''encodeur'''. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a à l'inverse <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un encodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc.
[[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]]
De plus, contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous les laissons pour le chapitre suivant. Le chapitre suivant sera totalement dédié aux encodeurs à priorité, aussi nous préférons nous focaliser sur le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1. En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie.
Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal.
L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans certaines formes de mémoires RAM appelées des mémoires associatives, qui sont utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile.
===L'encodeur 4 vers 2===
Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci :
{|class="wikitable"
|+ Table de vérité d'un encodeur 4 vers 2
|-
! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0
|-
| 0 || 0 || 0 || 1 || || 0 || 0
|-
| 0 || 0 || 1 || 0 || || 0 || 1
|-
| 0 || 1 || 0 || 0 || || 1 || 0
|-
| 1 || 0 || 0 || 0 || || 1 || 1
|}
Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes :
: <math>S1 = E3 + E2</math>
: <math>S0 = E3 + E1</math>
Le tout donne le circuit suivant :
[[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]]
===Les encodeurs à plus de deux sorties===
Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final.
Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous.
{|class="wikitable"
|+ Table de vérité d'un encodeur 8 vers 3
|-
! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0
|-
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1
|-
| 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0
|-
| 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1
|-
| 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0
|-
| 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1
|-
| 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0
|-
| 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1
|}
En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge.
{|class="wikitable"
|+ Table de vérité d'un encodeur 8 vers 3
|-
! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 ||
| 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1
|}
On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs.
Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1.
[[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]]
Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1.
La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci :
[[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]]
==L'encodeur à priorité==
L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue.
La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée.
Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre.
===L'encodeur à priorité conçu à partir de sa table de vérité===
Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats.
Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0.
À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée.
{|class="wikitable"
|-
! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V
|-
| 0 || 0 || 0 || 0 || || 0 || 0 || 0
|-
| 0 || 0 || 0 || 1 || || 0 || 0 || 1
|-
| 0 || 0 || 1 || X || || 0 || 1 || 1
|-
| 0 || 1 || X || X || || 1 || 0 || 1
|-
| 1 || X || X || X || || 1 || 1 || 1
|}
Les équations logiques obtenues sont donc les suivantes :
: <math>V = E3 + E2 + E1 + E0</math>
: <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math>
: <math>S1 = E3 + ( \overline{E3} . E2 )</math>
On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en :
: <math>S0 = E3 + (\overline{E2} . E1)</math>
: <math>S1 = E3 + E2</math>,
Le circuit obtenu est le suivant :
[[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]]
La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée.
[[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]]
Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps.
===Les encodeurs à priorité récursifs===
Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld.
La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même.
Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX.
[[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]]
Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande.
===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible===
Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire.
[[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]]
Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs.
[[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]]
Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci :
{|
|[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]]
|[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]]
|}
Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut.
[[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]]
Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici.
Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet :
: [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les circuits de masquage
| prevText=Les circuits de masquage
| next=Les circuits incrémenteurs/décrémenteurs
| nextText=Les circuits incrémenteurs/décrémenteurs
}}
</noinclude>
2uvwarwvevhur7pu6ryhcclypkzygeu
768916
768906
2026-06-29T11:26:58Z
Mewtow
31375
/* Le décodeur */
768916
wikitext
text/x-wiki
Dans ce chapitre, nous allons introduire des circuits électroniques particulièrement importants, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Ils seront réutilisés dans les prochains chapitres, pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur.
==Le décodeur==
[[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]]
Le premier circuit que nous allons voir est le '''décodeur'''. Il possède une entrée sur laquelle on envoie un nombre codé sur <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un ''décodeur X vers Y'' pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc.
Précisons que les sorties du décodeur sont numérotées. Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro. Pour résumer, un décodeur est un circuit :
* avec une entrée de <math>N</math> bits ;
* avec <math>2^N</math> sorties de 1 bit ;
* où les sorties sont numérotées en partant de zéro ;
* où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ;
* et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée.
Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro.
Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours.
===La table de vérité d'un décodeur===
Étudions maintenant la table de vérité d'un décodeur, en partant d'un décodeur 2 vers 4. Voici sa table de vérité :
{|class="wikitable"
|-
! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3
|-
| 0 || 0 || || 1 || 0 || 0 || 0
|-
| 0 || 1 || || 0 || 1 || 0 || 0
|-
| 1 || 0 || || 0 || 0 || 1 || 0
|-
| 1 || 1 || || 0 || 0 || 0 || 1
|}
Vous remarquerez que les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, car une entrée ne met qu'une seule sortie à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci :
[[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]]
[[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]]
Il y a des choses intéressantes à remarquer sur les équations logiques d'un décodeur. Pour rappel, l'équation logique d'une sortie est composée, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm correspond à un circuit qui compare l'entrée à une constante, constant qui dépend du minterm. Pour un décodeur, on peut observer les faits suivants :
* L'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms.
* Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm.
* Chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée.
C'est une autre manière de définir un décodeur : chaque sortie est associée à un minterm distinct.
===Créer un circuit combinatoire avec un décodeur et une porte OU===
Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques. Dans ce qui suit, on suppose que le circuit combinatoire en question a une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats.
[[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]]
Fabriquer un circuit combinatoire avec un décodeur gaspille pas mal de portes logiques. En effet, le décodeur fournit tous les minterms possibles, alors que seule une minorité est réellement utilisée pour fabriquer le circuit combinatoire. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. De plus, les minterms ne sont pas simplifiés. On ne peut pas utiliser les techniques vues dans les chapitres précédents pour simplifier les minterms et réduire le nombre de portes logiques utilisées. Le décodeur reste tel qu'il est, avec l'ensemble des minterms non-simplifiés. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci).
Ceci étant dit, passons à la conception d'un décodeur avec des portes logiques.
===L'intérieur d'un décodeur===
On vient de voir que chaque sortie d'un décodeur correspond à son propre minterm, et que tous les minterms possibles sont représentés. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante que de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre codé entre 0 et 127 et que chaque nombre aura son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127.
Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'adresse vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué. Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager.
[[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]]
Comme autre méthode, plus économe en circuits, on peut créer un décodeur en assemblant plusieurs décodeurs plus simples, nommés sous-décodeurs. Ces sous-décodeurs sont des décodeurs normaux, auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, alors que le décodeur fonctionne normalement sinon. Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final.
[[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]]
==Le démultiplexeur==
Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas.
===Le démultiplexeur à deux sorties===
Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1.
[[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]]
On peut le concevoir facilement en partant de sa table de vérité.
{|class="wikitable"
|-
! Entrée de commande ''Select''
! Entrée de donnée ''Input''
!
! Sortie 1
! Sortie 0
|-
| 0 || 0 || || 0 || 0
|-
|-
| 0 || 1 || || 0 || 1
|-
|-
| 1 || 0 || || 0 || 0
|-
|-
| 1 || 1 || || 1 || 0
|-
|}
===Les démultiplexeurs à plus de deux sorties===
Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées.
[[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]]
Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches.
[[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]]
Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge.
{|class="wikitable"
|-
! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3
|-
| 0 || 0 || 0 || || 0 || 0 || 0 || 0
|-
| 0 || 0 || 1 || || 0 || 0 || 0 || 0
|-
| 0 || 1 || 0 || || 0 || 0 || 0 || 0
|-
| 0 || 1 || 1 || || 0 || 0 || 0 || 0
|-
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|}
En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant :
[[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]]
==Le multiplexeur==
Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus.
[[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]]
Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours.
===Le multiplexeur à deux entrées===
Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors.
[[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]]
Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante :
{|class="wikitable"
|-
!Entrée de commande
!Entrée a
!Entrée b
!Sortie
|-
|0||0||0||0
|-
|0||0||1||0
|-
|0||1||0||1
|-
|0||1||1||1
|-
|1||0||0||0
|-
|1||0||1||1
|-
|1||1||0||0
|-
|1||1||1||1
|}
Sélectionnons les lignes qui mettent la sortie à 1 :
{|class="wikitable"
|-
!Entrée de commande
!Entrée a
!Entrée b
!Sortie
|-
|0||1||0||1
|-
|0||1||1||1
|-
|1||0||1||1
|-
|1||1||1||1
|}
On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc :
: <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math>
L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> :
: <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math>
Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second :
: <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math>
Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 :
: <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math>
On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante :
: <math>(\overline{E_c} . a) + (E_c . b)</math>
Le circuit qui correspond est :
[[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]]
===Les multiplexeurs à plus de deux entrées===
Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions.
[[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]]
Une solution alternative conçoit un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection.
[[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]]
Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné :
* Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro.
* Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1.
Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU.
Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur ! La génération du masque est donc le fait d'un décodeur.
[[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]]
Le circuit précédent n'est cependant pas parfaitement optimisé. En effet, le décodeur est composé d'une couche de portes NON et d'une couche de portes ET. Il est possible de fusionner les portes ET du décodeur, avec celles liée au masque. Le résultat est une simplification qui élimine quelques portes logiques. Voici ce que cela donne pour un multiplexeur 4 vers 1 :
[[File:4to1mux.png|centre|vignette|upright=2|Multiplexeur 2 vers 4, conçu à partir d'un décodeur, simplifié pour éviter des redondances.]]
==L'encodeur==
[[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]]
Il existe un circuit qui fait exactement l'inverse du décodeur : c'est l''''encodeur'''. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a à l'inverse <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un encodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc.
[[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]]
De plus, contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous les laissons pour le chapitre suivant. Le chapitre suivant sera totalement dédié aux encodeurs à priorité, aussi nous préférons nous focaliser sur le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1. En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie.
Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal.
L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans certaines formes de mémoires RAM appelées des mémoires associatives, qui sont utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile.
===L'encodeur 4 vers 2===
Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci :
{|class="wikitable"
|+ Table de vérité d'un encodeur 4 vers 2
|-
! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0
|-
| 0 || 0 || 0 || 1 || || 0 || 0
|-
| 0 || 0 || 1 || 0 || || 0 || 1
|-
| 0 || 1 || 0 || 0 || || 1 || 0
|-
| 1 || 0 || 0 || 0 || || 1 || 1
|}
Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes :
: <math>S1 = E3 + E2</math>
: <math>S0 = E3 + E1</math>
Le tout donne le circuit suivant :
[[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]]
===Les encodeurs à plus de deux sorties===
Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final.
Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous.
{|class="wikitable"
|+ Table de vérité d'un encodeur 8 vers 3
|-
! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0
|-
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1
|-
| 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0
|-
| 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1
|-
| 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0
|-
| 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1
|-
| 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0
|-
| 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1
|}
En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge.
{|class="wikitable"
|+ Table de vérité d'un encodeur 8 vers 3
|-
! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 ||
| 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1
|}
On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs.
Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1.
[[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]]
Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1.
La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci :
[[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]]
==L'encodeur à priorité==
L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue.
La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée.
Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre.
===L'encodeur à priorité conçu à partir de sa table de vérité===
Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats.
Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0.
À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée.
{|class="wikitable"
|-
! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V
|-
| 0 || 0 || 0 || 0 || || 0 || 0 || 0
|-
| 0 || 0 || 0 || 1 || || 0 || 0 || 1
|-
| 0 || 0 || 1 || X || || 0 || 1 || 1
|-
| 0 || 1 || X || X || || 1 || 0 || 1
|-
| 1 || X || X || X || || 1 || 1 || 1
|}
Les équations logiques obtenues sont donc les suivantes :
: <math>V = E3 + E2 + E1 + E0</math>
: <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math>
: <math>S1 = E3 + ( \overline{E3} . E2 )</math>
On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en :
: <math>S0 = E3 + (\overline{E2} . E1)</math>
: <math>S1 = E3 + E2</math>,
Le circuit obtenu est le suivant :
[[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]]
La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée.
[[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]]
Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps.
===Les encodeurs à priorité récursifs===
Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld.
La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même.
Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX.
[[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]]
Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande.
===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible===
Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire.
[[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]]
Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs.
[[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]]
Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci :
{|
|[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]]
|[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]]
|}
Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut.
[[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]]
Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici.
Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet :
: [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les circuits de masquage
| prevText=Les circuits de masquage
| next=Les circuits incrémenteurs/décrémenteurs
| nextText=Les circuits incrémenteurs/décrémenteurs
}}
</noinclude>
78l67mgos14urzogntag63o6wglc70p
768919
768916
2026-06-29T11:29:23Z
Mewtow
31375
/* Créer un circuit combinatoire avec un décodeur et une porte OU */
768919
wikitext
text/x-wiki
Dans ce chapitre, nous allons introduire des circuits électroniques particulièrement importants, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Ils seront réutilisés dans les prochains chapitres, pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur.
==Le décodeur==
[[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]]
Le premier circuit que nous allons voir est le '''décodeur'''. Il possède une entrée sur laquelle on envoie un nombre codé sur <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un ''décodeur X vers Y'' pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc.
Précisons que les sorties du décodeur sont numérotées. Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro. Pour résumer, un décodeur est un circuit :
* avec une entrée de <math>N</math> bits ;
* avec <math>2^N</math> sorties de 1 bit ;
* où les sorties sont numérotées en partant de zéro ;
* où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ;
* et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée.
Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro.
Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours.
===La table de vérité d'un décodeur===
Étudions maintenant la table de vérité d'un décodeur, en partant d'un décodeur 2 vers 4. Voici sa table de vérité :
{|class="wikitable"
|-
! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3
|-
| 0 || 0 || || 1 || 0 || 0 || 0
|-
| 0 || 1 || || 0 || 1 || 0 || 0
|-
| 1 || 0 || || 0 || 0 || 1 || 0
|-
| 1 || 1 || || 0 || 0 || 0 || 1
|}
Vous remarquerez que les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, car une entrée ne met qu'une seule sortie à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci :
[[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]]
[[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]]
Il y a des choses intéressantes à remarquer sur les équations logiques d'un décodeur. Pour rappel, l'équation logique d'une sortie est composée, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm correspond à un circuit qui compare l'entrée à une constante, constant qui dépend du minterm. Pour un décodeur, on peut observer les faits suivants :
* L'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms.
* Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm.
* Chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée.
C'est une autre manière de définir un décodeur : chaque sortie est associée à un minterm distinct.
Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques.
===Créer un circuit combinatoire avec un décodeur et une porte OU===
Dans ce qui suit, on prend un circuit combinatoire avec une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats. Pour un circuit avec n sorties de 1 bit, il faut utiliser plusieurs portes OU, une par sortie.
[[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]]
Fabriquer un circuit combinatoire avec un décodeur peut gaspiller des portes logiques. En effet, le décodeur fournit tous les minterms possibles, et il est possible que certains ne soient pas utilisés. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci).
===L'intérieur d'un décodeur===
On vient de voir que chaque sortie d'un décodeur correspond à son propre minterm, et que tous les minterms possibles sont représentés. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante que de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre codé entre 0 et 127 et que chaque nombre aura son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127.
Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'adresse vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué. Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager.
[[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]]
Comme autre méthode, plus économe en circuits, on peut créer un décodeur en assemblant plusieurs décodeurs plus simples, nommés sous-décodeurs. Ces sous-décodeurs sont des décodeurs normaux, auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, alors que le décodeur fonctionne normalement sinon. Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final.
[[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]]
==Le démultiplexeur==
Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas.
===Le démultiplexeur à deux sorties===
Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1.
[[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]]
On peut le concevoir facilement en partant de sa table de vérité.
{|class="wikitable"
|-
! Entrée de commande ''Select''
! Entrée de donnée ''Input''
!
! Sortie 1
! Sortie 0
|-
| 0 || 0 || || 0 || 0
|-
|-
| 0 || 1 || || 0 || 1
|-
|-
| 1 || 0 || || 0 || 0
|-
|-
| 1 || 1 || || 1 || 0
|-
|}
===Les démultiplexeurs à plus de deux sorties===
Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées.
[[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]]
Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches.
[[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]]
Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge.
{|class="wikitable"
|-
! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3
|-
| 0 || 0 || 0 || || 0 || 0 || 0 || 0
|-
| 0 || 0 || 1 || || 0 || 0 || 0 || 0
|-
| 0 || 1 || 0 || || 0 || 0 || 0 || 0
|-
| 0 || 1 || 1 || || 0 || 0 || 0 || 0
|-
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|}
En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant :
[[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]]
==Le multiplexeur==
Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus.
[[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]]
Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours.
===Le multiplexeur à deux entrées===
Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors.
[[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]]
Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante :
{|class="wikitable"
|-
!Entrée de commande
!Entrée a
!Entrée b
!Sortie
|-
|0||0||0||0
|-
|0||0||1||0
|-
|0||1||0||1
|-
|0||1||1||1
|-
|1||0||0||0
|-
|1||0||1||1
|-
|1||1||0||0
|-
|1||1||1||1
|}
Sélectionnons les lignes qui mettent la sortie à 1 :
{|class="wikitable"
|-
!Entrée de commande
!Entrée a
!Entrée b
!Sortie
|-
|0||1||0||1
|-
|0||1||1||1
|-
|1||0||1||1
|-
|1||1||1||1
|}
On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc :
: <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math>
L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> :
: <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math>
Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second :
: <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math>
Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 :
: <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math>
On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante :
: <math>(\overline{E_c} . a) + (E_c . b)</math>
Le circuit qui correspond est :
[[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]]
===Les multiplexeurs à plus de deux entrées===
Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions.
[[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]]
Une solution alternative conçoit un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection.
[[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]]
Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné :
* Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro.
* Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1.
Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU.
Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur ! La génération du masque est donc le fait d'un décodeur.
[[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]]
Le circuit précédent n'est cependant pas parfaitement optimisé. En effet, le décodeur est composé d'une couche de portes NON et d'une couche de portes ET. Il est possible de fusionner les portes ET du décodeur, avec celles liée au masque. Le résultat est une simplification qui élimine quelques portes logiques. Voici ce que cela donne pour un multiplexeur 4 vers 1 :
[[File:4to1mux.png|centre|vignette|upright=2|Multiplexeur 2 vers 4, conçu à partir d'un décodeur, simplifié pour éviter des redondances.]]
==L'encodeur==
[[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]]
Il existe un circuit qui fait exactement l'inverse du décodeur : c'est l''''encodeur'''. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a à l'inverse <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un encodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc.
[[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]]
De plus, contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous les laissons pour le chapitre suivant. Le chapitre suivant sera totalement dédié aux encodeurs à priorité, aussi nous préférons nous focaliser sur le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1. En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie.
Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal.
L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans certaines formes de mémoires RAM appelées des mémoires associatives, qui sont utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile.
===L'encodeur 4 vers 2===
Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci :
{|class="wikitable"
|+ Table de vérité d'un encodeur 4 vers 2
|-
! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0
|-
| 0 || 0 || 0 || 1 || || 0 || 0
|-
| 0 || 0 || 1 || 0 || || 0 || 1
|-
| 0 || 1 || 0 || 0 || || 1 || 0
|-
| 1 || 0 || 0 || 0 || || 1 || 1
|}
Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes :
: <math>S1 = E3 + E2</math>
: <math>S0 = E3 + E1</math>
Le tout donne le circuit suivant :
[[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]]
===Les encodeurs à plus de deux sorties===
Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final.
Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous.
{|class="wikitable"
|+ Table de vérité d'un encodeur 8 vers 3
|-
! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0
|-
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1
|-
| 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0
|-
| 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1
|-
| 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0
|-
| 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1
|-
| 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0
|-
| 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1
|}
En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge.
{|class="wikitable"
|+ Table de vérité d'un encodeur 8 vers 3
|-
! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 ||
| 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1
|}
On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs.
Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1.
[[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]]
Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1.
La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci :
[[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]]
==L'encodeur à priorité==
L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue.
La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée.
Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre.
===L'encodeur à priorité conçu à partir de sa table de vérité===
Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats.
Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0.
À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée.
{|class="wikitable"
|-
! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V
|-
| 0 || 0 || 0 || 0 || || 0 || 0 || 0
|-
| 0 || 0 || 0 || 1 || || 0 || 0 || 1
|-
| 0 || 0 || 1 || X || || 0 || 1 || 1
|-
| 0 || 1 || X || X || || 1 || 0 || 1
|-
| 1 || X || X || X || || 1 || 1 || 1
|}
Les équations logiques obtenues sont donc les suivantes :
: <math>V = E3 + E2 + E1 + E0</math>
: <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math>
: <math>S1 = E3 + ( \overline{E3} . E2 )</math>
On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en :
: <math>S0 = E3 + (\overline{E2} . E1)</math>
: <math>S1 = E3 + E2</math>,
Le circuit obtenu est le suivant :
[[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]]
La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée.
[[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]]
Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps.
===Les encodeurs à priorité récursifs===
Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld.
La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même.
Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX.
[[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]]
Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande.
===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible===
Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire.
[[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]]
Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs.
[[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]]
Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci :
{|
|[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]]
|[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]]
|}
Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut.
[[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]]
Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici.
Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet :
: [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les circuits de masquage
| prevText=Les circuits de masquage
| next=Les circuits incrémenteurs/décrémenteurs
| nextText=Les circuits incrémenteurs/décrémenteurs
}}
</noinclude>
cfj1us4o583ffwmlt3bvq0ce479c677
768935
768919
2026-06-29T11:34:14Z
Mewtow
31375
/* L'intérieur d'un décodeur */
768935
wikitext
text/x-wiki
Dans ce chapitre, nous allons introduire des circuits électroniques particulièrement importants, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Ils seront réutilisés dans les prochains chapitres, pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur.
==Le décodeur==
[[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]]
Le premier circuit que nous allons voir est le '''décodeur'''. Il possède une entrée sur laquelle on envoie un nombre codé sur <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un ''décodeur X vers Y'' pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc.
Précisons que les sorties du décodeur sont numérotées. Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro. Pour résumer, un décodeur est un circuit :
* avec une entrée de <math>N</math> bits ;
* avec <math>2^N</math> sorties de 1 bit ;
* où les sorties sont numérotées en partant de zéro ;
* où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ;
* et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée.
Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro.
Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours.
===La table de vérité d'un décodeur===
Étudions maintenant la table de vérité d'un décodeur, en partant d'un décodeur 2 vers 4. Voici sa table de vérité :
{|class="wikitable"
|-
! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3
|-
| 0 || 0 || || 1 || 0 || 0 || 0
|-
| 0 || 1 || || 0 || 1 || 0 || 0
|-
| 1 || 0 || || 0 || 0 || 1 || 0
|-
| 1 || 1 || || 0 || 0 || 0 || 1
|}
Vous remarquerez que les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, car une entrée ne met qu'une seule sortie à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci :
[[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]]
[[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]]
Il y a des choses intéressantes à remarquer sur les équations logiques d'un décodeur. Pour rappel, l'équation logique d'une sortie est composée, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm correspond à un circuit qui compare l'entrée à une constante, constant qui dépend du minterm. Pour un décodeur, on peut observer les faits suivants :
* L'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms.
* Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm.
* Chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée.
C'est une autre manière de définir un décodeur : chaque sortie est associée à un minterm distinct.
Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques.
===Créer un circuit combinatoire avec un décodeur et une porte OU===
Dans ce qui suit, on prend un circuit combinatoire avec une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats. Pour un circuit avec n sorties de 1 bit, il faut utiliser plusieurs portes OU, une par sortie.
[[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]]
Fabriquer un circuit combinatoire avec un décodeur peut gaspiller des portes logiques. En effet, le décodeur fournit tous les minterms possibles, et il est possible que certains ne soient pas utilisés. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci).
===L'intérieur d'un décodeur===
On vient de voir qu'un décodeur contient tous les minterm possibles. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante, autant de comparateurs qu'il n'a de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre entre 0 et 127 et que chaque nombre a son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127.
Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'entrée vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué.
[[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]]
Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager.
Une autre méthode, plus économe en circuits, crée un décodeur en assemblant plusieurs décodeurs plus simples. Les décodeurs plus simples sont ici appelés des '''sous-décodeurs'''. Les sous-décodeurs sont des décodeurs auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, le décodeur fonctionne normalement sinon.
Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final.
[[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]]
==Le démultiplexeur==
Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas.
===Le démultiplexeur à deux sorties===
Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1.
[[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]]
On peut le concevoir facilement en partant de sa table de vérité.
{|class="wikitable"
|-
! Entrée de commande ''Select''
! Entrée de donnée ''Input''
!
! Sortie 1
! Sortie 0
|-
| 0 || 0 || || 0 || 0
|-
|-
| 0 || 1 || || 0 || 1
|-
|-
| 1 || 0 || || 0 || 0
|-
|-
| 1 || 1 || || 1 || 0
|-
|}
===Les démultiplexeurs à plus de deux sorties===
Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées.
[[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]]
Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches.
[[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]]
Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge.
{|class="wikitable"
|-
! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3
|-
| 0 || 0 || 0 || || 0 || 0 || 0 || 0
|-
| 0 || 0 || 1 || || 0 || 0 || 0 || 0
|-
| 0 || 1 || 0 || || 0 || 0 || 0 || 0
|-
| 0 || 1 || 1 || || 0 || 0 || 0 || 0
|-
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|}
En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant :
[[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]]
==Le multiplexeur==
Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus.
[[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]]
Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours.
===Le multiplexeur à deux entrées===
Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors.
[[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]]
Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante :
{|class="wikitable"
|-
!Entrée de commande
!Entrée a
!Entrée b
!Sortie
|-
|0||0||0||0
|-
|0||0||1||0
|-
|0||1||0||1
|-
|0||1||1||1
|-
|1||0||0||0
|-
|1||0||1||1
|-
|1||1||0||0
|-
|1||1||1||1
|}
Sélectionnons les lignes qui mettent la sortie à 1 :
{|class="wikitable"
|-
!Entrée de commande
!Entrée a
!Entrée b
!Sortie
|-
|0||1||0||1
|-
|0||1||1||1
|-
|1||0||1||1
|-
|1||1||1||1
|}
On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc :
: <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math>
L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> :
: <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math>
Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second :
: <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math>
Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 :
: <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math>
On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante :
: <math>(\overline{E_c} . a) + (E_c . b)</math>
Le circuit qui correspond est :
[[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]]
===Les multiplexeurs à plus de deux entrées===
Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions.
[[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]]
Une solution alternative conçoit un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection.
[[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]]
Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné :
* Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro.
* Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1.
Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU.
Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur ! La génération du masque est donc le fait d'un décodeur.
[[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]]
Le circuit précédent n'est cependant pas parfaitement optimisé. En effet, le décodeur est composé d'une couche de portes NON et d'une couche de portes ET. Il est possible de fusionner les portes ET du décodeur, avec celles liée au masque. Le résultat est une simplification qui élimine quelques portes logiques. Voici ce que cela donne pour un multiplexeur 4 vers 1 :
[[File:4to1mux.png|centre|vignette|upright=2|Multiplexeur 2 vers 4, conçu à partir d'un décodeur, simplifié pour éviter des redondances.]]
==L'encodeur==
[[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]]
Il existe un circuit qui fait exactement l'inverse du décodeur : c'est l''''encodeur'''. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a à l'inverse <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un encodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc.
[[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]]
De plus, contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous les laissons pour le chapitre suivant. Le chapitre suivant sera totalement dédié aux encodeurs à priorité, aussi nous préférons nous focaliser sur le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1. En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie.
Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal.
L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans certaines formes de mémoires RAM appelées des mémoires associatives, qui sont utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile.
===L'encodeur 4 vers 2===
Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci :
{|class="wikitable"
|+ Table de vérité d'un encodeur 4 vers 2
|-
! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0
|-
| 0 || 0 || 0 || 1 || || 0 || 0
|-
| 0 || 0 || 1 || 0 || || 0 || 1
|-
| 0 || 1 || 0 || 0 || || 1 || 0
|-
| 1 || 0 || 0 || 0 || || 1 || 1
|}
Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes :
: <math>S1 = E3 + E2</math>
: <math>S0 = E3 + E1</math>
Le tout donne le circuit suivant :
[[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]]
===Les encodeurs à plus de deux sorties===
Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final.
Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous.
{|class="wikitable"
|+ Table de vérité d'un encodeur 8 vers 3
|-
! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0
|-
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1
|-
| 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0
|-
| 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1
|-
| 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0
|-
| 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1
|-
| 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0
|-
| 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1
|}
En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge.
{|class="wikitable"
|+ Table de vérité d'un encodeur 8 vers 3
|-
! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 ||
| 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1
|}
On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs.
Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1.
[[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]]
Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1.
La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci :
[[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]]
==L'encodeur à priorité==
L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue.
La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée.
Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre.
===L'encodeur à priorité conçu à partir de sa table de vérité===
Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats.
Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0.
À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée.
{|class="wikitable"
|-
! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V
|-
| 0 || 0 || 0 || 0 || || 0 || 0 || 0
|-
| 0 || 0 || 0 || 1 || || 0 || 0 || 1
|-
| 0 || 0 || 1 || X || || 0 || 1 || 1
|-
| 0 || 1 || X || X || || 1 || 0 || 1
|-
| 1 || X || X || X || || 1 || 1 || 1
|}
Les équations logiques obtenues sont donc les suivantes :
: <math>V = E3 + E2 + E1 + E0</math>
: <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math>
: <math>S1 = E3 + ( \overline{E3} . E2 )</math>
On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en :
: <math>S0 = E3 + (\overline{E2} . E1)</math>
: <math>S1 = E3 + E2</math>,
Le circuit obtenu est le suivant :
[[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]]
La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée.
[[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]]
Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps.
===Les encodeurs à priorité récursifs===
Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld.
La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même.
Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX.
[[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]]
Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande.
===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible===
Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire.
[[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]]
Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs.
[[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]]
Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci :
{|
|[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]]
|[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]]
|}
Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut.
[[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]]
Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici.
Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet :
: [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les circuits de masquage
| prevText=Les circuits de masquage
| next=Les circuits incrémenteurs/décrémenteurs
| nextText=Les circuits incrémenteurs/décrémenteurs
}}
</noinclude>
hbcchao0zdxotrg8hlnpreu1u7m0bhg
768944
768935
2026-06-29T11:41:04Z
Mewtow
31375
/* L'encodeur */
768944
wikitext
text/x-wiki
Dans ce chapitre, nous allons introduire des circuits électroniques particulièrement importants, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Ils seront réutilisés dans les prochains chapitres, pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur.
==Le décodeur==
[[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]]
Le premier circuit que nous allons voir est le '''décodeur'''. Il possède une entrée sur laquelle on envoie un nombre codé sur <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un ''décodeur X vers Y'' pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc.
Précisons que les sorties du décodeur sont numérotées. Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro. Pour résumer, un décodeur est un circuit :
* avec une entrée de <math>N</math> bits ;
* avec <math>2^N</math> sorties de 1 bit ;
* où les sorties sont numérotées en partant de zéro ;
* où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ;
* et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée.
Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro.
Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours.
===La table de vérité d'un décodeur===
Étudions maintenant la table de vérité d'un décodeur, en partant d'un décodeur 2 vers 4. Voici sa table de vérité :
{|class="wikitable"
|-
! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3
|-
| 0 || 0 || || 1 || 0 || 0 || 0
|-
| 0 || 1 || || 0 || 1 || 0 || 0
|-
| 1 || 0 || || 0 || 0 || 1 || 0
|-
| 1 || 1 || || 0 || 0 || 0 || 1
|}
Vous remarquerez que les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, car une entrée ne met qu'une seule sortie à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci :
[[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]]
[[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]]
Il y a des choses intéressantes à remarquer sur les équations logiques d'un décodeur. Pour rappel, l'équation logique d'une sortie est composée, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm correspond à un circuit qui compare l'entrée à une constante, constant qui dépend du minterm. Pour un décodeur, on peut observer les faits suivants :
* L'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms.
* Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm.
* Chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée.
C'est une autre manière de définir un décodeur : chaque sortie est associée à un minterm distinct.
Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques.
===Créer un circuit combinatoire avec un décodeur et une porte OU===
Dans ce qui suit, on prend un circuit combinatoire avec une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats. Pour un circuit avec n sorties de 1 bit, il faut utiliser plusieurs portes OU, une par sortie.
[[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]]
Fabriquer un circuit combinatoire avec un décodeur peut gaspiller des portes logiques. En effet, le décodeur fournit tous les minterms possibles, et il est possible que certains ne soient pas utilisés. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci).
===L'intérieur d'un décodeur===
On vient de voir qu'un décodeur contient tous les minterm possibles. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante, autant de comparateurs qu'il n'a de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre entre 0 et 127 et que chaque nombre a son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127.
Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'entrée vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué.
[[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]]
Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager.
Une autre méthode, plus économe en circuits, crée un décodeur en assemblant plusieurs décodeurs plus simples. Les décodeurs plus simples sont ici appelés des '''sous-décodeurs'''. Les sous-décodeurs sont des décodeurs auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, le décodeur fonctionne normalement sinon.
Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final.
[[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]]
==Le démultiplexeur==
Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas.
===Le démultiplexeur à deux sorties===
Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1.
[[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]]
On peut le concevoir facilement en partant de sa table de vérité.
{|class="wikitable"
|-
! Entrée de commande ''Select''
! Entrée de donnée ''Input''
!
! Sortie 1
! Sortie 0
|-
| 0 || 0 || || 0 || 0
|-
|-
| 0 || 1 || || 0 || 1
|-
|-
| 1 || 0 || || 0 || 0
|-
|-
| 1 || 1 || || 1 || 0
|-
|}
===Les démultiplexeurs à plus de deux sorties===
Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées.
[[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]]
Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches.
[[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]]
Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge.
{|class="wikitable"
|-
! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3
|-
| 0 || 0 || 0 || || 0 || 0 || 0 || 0
|-
| 0 || 0 || 1 || || 0 || 0 || 0 || 0
|-
| 0 || 1 || 0 || || 0 || 0 || 0 || 0
|-
| 0 || 1 || 1 || || 0 || 0 || 0 || 0
|-
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|}
En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant :
[[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]]
==Le multiplexeur==
Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus.
[[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]]
Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours.
===Le multiplexeur à deux entrées===
Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors.
[[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]]
Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante :
{|class="wikitable"
|-
!Entrée de commande
!Entrée a
!Entrée b
!Sortie
|-
|0||0||0||0
|-
|0||0||1||0
|-
|0||1||0||1
|-
|0||1||1||1
|-
|1||0||0||0
|-
|1||0||1||1
|-
|1||1||0||0
|-
|1||1||1||1
|}
Sélectionnons les lignes qui mettent la sortie à 1 :
{|class="wikitable"
|-
!Entrée de commande
!Entrée a
!Entrée b
!Sortie
|-
|0||1||0||1
|-
|0||1||1||1
|-
|1||0||1||1
|-
|1||1||1||1
|}
On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc :
: <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math>
L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> :
: <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math>
Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second :
: <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math>
Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 :
: <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math>
On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante :
: <math>(\overline{E_c} . a) + (E_c . b)</math>
Le circuit qui correspond est :
[[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]]
===Les multiplexeurs à plus de deux entrées===
Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions.
[[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]]
Une solution alternative conçoit un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection.
[[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]]
Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné :
* Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro.
* Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1.
Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU.
Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur ! La génération du masque est donc le fait d'un décodeur.
[[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]]
Le circuit précédent n'est cependant pas parfaitement optimisé. En effet, le décodeur est composé d'une couche de portes NON et d'une couche de portes ET. Il est possible de fusionner les portes ET du décodeur, avec celles liée au masque. Le résultat est une simplification qui élimine quelques portes logiques. Voici ce que cela donne pour un multiplexeur 4 vers 1 :
[[File:4to1mux.png|centre|vignette|upright=2|Multiplexeur 2 vers 4, conçu à partir d'un décodeur, simplifié pour éviter des redondances.]]
==L'encodeur==
[[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]]
L''''encodeur''' est le circuit opposé au décodeur. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un ''encodeur X vers Y'', ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc.
[[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]]
Contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous allons commencer par le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1.
En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie. Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal.
L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans les mémoires associatives, des mémoires RAM utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile.
===L'encodeur 4 vers 2===
Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci :
{|class="wikitable"
|+ Table de vérité d'un encodeur 4 vers 2
|-
! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0
|-
| 0 || 0 || 0 || 1 || || 0 || 0
|-
| 0 || 0 || 1 || 0 || || 0 || 1
|-
| 0 || 1 || 0 || 0 || || 1 || 0
|-
| 1 || 0 || 0 || 0 || || 1 || 1
|}
Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes :
: <math>S1 = E3 + E2</math>
: <math>S0 = E3 + E1</math>
Le tout donne le circuit suivant :
[[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]]
===Les encodeurs à plus de deux sorties===
Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final.
Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous.
{|class="wikitable"
|+ Table de vérité d'un encodeur 8 vers 3
|-
! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0
|-
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1
|-
| 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0
|-
| 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1
|-
| 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0
|-
| 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1
|-
| 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0
|-
| 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1
|}
En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge.
{|class="wikitable"
|+ Table de vérité d'un encodeur 8 vers 3
|-
! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 ||
| 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 ||
| 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1
|-
| bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0
|-
| bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 ||
| 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1
|}
On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs.
Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1.
[[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]]
Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1.
La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci :
[[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]]
==L'encodeur à priorité==
L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue.
La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée.
Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre.
===L'encodeur à priorité conçu à partir de sa table de vérité===
Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats.
Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0.
À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée.
{|class="wikitable"
|-
! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V
|-
| 0 || 0 || 0 || 0 || || 0 || 0 || 0
|-
| 0 || 0 || 0 || 1 || || 0 || 0 || 1
|-
| 0 || 0 || 1 || X || || 0 || 1 || 1
|-
| 0 || 1 || X || X || || 1 || 0 || 1
|-
| 1 || X || X || X || || 1 || 1 || 1
|}
Les équations logiques obtenues sont donc les suivantes :
: <math>V = E3 + E2 + E1 + E0</math>
: <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math>
: <math>S1 = E3 + ( \overline{E3} . E2 )</math>
On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en :
: <math>S0 = E3 + (\overline{E2} . E1)</math>
: <math>S1 = E3 + E2</math>,
Le circuit obtenu est le suivant :
[[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]]
La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée.
[[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]]
Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps.
===Les encodeurs à priorité récursifs===
Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld.
La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même.
Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX.
[[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]]
Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande.
===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible===
Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire.
[[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]]
Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs.
[[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]]
Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci :
{|
|[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]]
|[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]]
|}
Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut.
[[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]]
Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici.
Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet :
: [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les circuits de masquage
| prevText=Les circuits de masquage
| next=Les circuits incrémenteurs/décrémenteurs
| nextText=Les circuits incrémenteurs/décrémenteurs
}}
</noinclude>
c4bx2vb3bsihyc42bb72ykdrdmrafdt
Fonctionnement d'un ordinateur/Les circuits de masquage
0
70434
768899
767926
2026-06-29T11:16:04Z
Mewtow
31375
768899
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. 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.
La plus simple d'entre elles est l'opération NON, aussi appelée opération de complémentation. Elle 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. Elle est accompagnée par des opérations bit à bit 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, l'opération est appliquée colonne par colonne. 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 un opérande unique, qui sont au nombre de 4. Les opérations bit à bit sur un seul opérande sont plus simples à voir, nous verrons les opérations bit à bit à deux opérandes plus tard.
==Les opérations bit à bit à un opérande==
Les opérations bit à bit n'ayant qu'un seul 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 plusieurs circuits : 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 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. 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]]
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.
===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 beaucoup dans les prochains chapitres.
L'implémentation naïve met les trois circuits précédents les uns à la suite des autres, ce qui demande d'utiliser trois bits de commandes. Il est possible d'ajouter un circuit combinatoire pour se débrouiller avec seulement deux bits de commande.
[[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 ! En effet, 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}}
myjnkj5bfpkzeagoo5wo4odkelu33zn
Fonctionnement d'un ordinateur/Les compteurs et timers
0
78073
768850
768645
2026-06-28T17:24:38Z
Mewtow
31375
/* Les compteurs modulo */
768850
wikitext
text/x-wiki
Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs.
[[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]]
Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux.
==L'interface d'un compteur/décompteur==
Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge.
Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue.
Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde.
Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter.
[[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]]
Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones.
==L'intérieur d'un compteur==
A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue.
[[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]]
===Les compteurs synchrones basiques===
L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur :
[[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone utilisant des bascules D.]]
Une simplification permet de faire disparaitre les portes XOR. Les portes XOR servent ici d'inverseur commandable, commandé par la retenue entrante. Elles inversent le contenu de la bascule quand la retenue entrante vaut 1, elles laissent la bascule inchangée si la retenue vaut 0. Or, nous avons déjà une bascule qui inverse son contenu sous certaines condition : la bascule T ! Il est donc possible de fusionner chaque bascule D avec la porte XOR associée, pour donner une bascule T. Le circuit final est celui-ci :
[[File:Compteur synchrone à bascules T.jpg|centre|vignette|upright=2|Compteur synchrone utilisant des bascules T.]]
Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre.
===Les compteurs en cascade===
[[File:8 Bit Counter.svg|vignette|Compteur 8 bits fabriqués avec deux compteurs 4 bits.]]
Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 8 bits à partir de deux compteurs 4 bits, enchainés l'un à la suite de l'autre. Idem avec 4 compteurs 4 bits, ce qui fait un compteur de 16 bits.
Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation.
Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue peut être calculée en utilisant des optimisations comme l'anticipation de retenue, ce qui veut dire qu'elle est calculée sans propager les retenues, directement à partir des bits de l'opérande. Concrètement, la retenue est calculée en faisant un ET logique entre tous les bits du décompte.
[[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]]
Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe.
[[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]]
===Les compteurs modulo===
La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ...
Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6 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. 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=1.5|Compteur modulo N.]]
Pour une minorité de compteurs, la valeur maximale est configurable. Le compteur est alors appelé un '''compteur programmable'''. Un compteur programmable contient un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail.
[[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]]
Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur.
==Les ''timers'' : compter des durées, compter des cycles d'horloge==
Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge.
Les ''timers'' peuvent compter de deux manières différentes, appelées ''mode une fois'' et ''mode périodique''.
* En '''mode une fois''', le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge.
* En '''mode périodique''', le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini.
[[File:Programmable interval timer timing diagram.jpg|centre|vignette|upright=2.5|Exemple d'un ''Timer'' périodique, qui émet un signal tous les 6 cycles d'horloge.]]
Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Avec un compteur, le compteur est initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteindre la valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite, est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés.
Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Il peut être mémorisé dans un '''registre d’intervalle''' dédié.
[[File:Programmable interval timer.jpg|centre|vignette|upright=2|''Timer'' périodique basé sur un décompteur. La porte NOR détecte si le décompteur atteint zéro.]]
Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''.
===Le ''watchdog timer''===
Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt.
[[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]]
===Le ''Time Stamp Counter'' des processeurs x86===
Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres.
Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable.
===L'horloge temps réel===
L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée.
En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre).
===Le ''Programmable Interval Timer'' : l'Intel 8253===
L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu.
[[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]]
L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique.
[[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]]
L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration :
* Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro.
* Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits.
* Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits.
* Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre.
L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits.
===Le ''High Precision Event Timer'' (HPET)===
De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256.
[[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]]
Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253.
Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé.
==Les compteurs en code Gray==
Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit ceux 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 ! Pour comparer, en binaire normal, lorsqu'on passe incrémente un nombre, il peut y avoir plusieurs bits qui changent. La moyenne est d'environ deux bits par incrémentation. Les compteurs en code Gray ont beaucoup d'avantages, qui sont tous liés à cette propriété.
Le premier l'absence d'état transitoires douteux. Le problème est que les bits modifiés par une incrémentation ne le sont pas en même temps. Les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où seuls les bits de poids faibles ont été modifiés. C'est un problème si le contenu de ce compteur est relié à des circuits rapides, qui peuvent voir cet état transitoire, mais ne le doivent pas sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas.
Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. S'il faut échanger des informations entre ces deux domaines d'horloge, divers problèmes surviennent. Un domaine d'horloge sera plus rapide que l'autre, et pourra voir les états transitoires invisible de l'autre circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, ce qui fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente !
Un autre avantage mineurs est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Et la majeure partie de cette consommation sert à faire passer un bit de 0 à 1 ou de 1 à 0. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique.
La moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray, on devine que ces derniers consomment deux fois moins d'énergie par incrémentation. Et cet avantage a des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer.
Un autre avantage en matière de consommation énergétique est lié auxs transitions d'état douteuses. Les circuits connectés au compteur vont voir ces transitions d'état douteuses et modifier leur état interne en réaction. Bien sur, l'état final correct sera atteint une fois que le compteur sera stabilisé, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspond à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée !
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les registres et mémoires adressables
| prevText=Les registres et mémoires adressables
| next=Les registres à décalage et les LSFR
| nextText=Les registres à décalage et les LSFR
}}
</noinclude>
hc9haj7qlyq20vf7ox4s74xo87c4f3k
768851
768850
2026-06-28T17:37:45Z
Mewtow
31375
/* Les compteurs modulo */
768851
wikitext
text/x-wiki
Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs.
[[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]]
Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux.
==L'interface d'un compteur/décompteur==
Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge.
Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue.
Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde.
Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter.
[[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]]
Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones.
==L'intérieur d'un compteur==
A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue.
[[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]]
===Les compteurs synchrones basiques===
L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur :
[[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone utilisant des bascules D.]]
Une simplification permet de faire disparaitre les portes XOR. Les portes XOR servent ici d'inverseur commandable, commandé par la retenue entrante. Elles inversent le contenu de la bascule quand la retenue entrante vaut 1, elles laissent la bascule inchangée si la retenue vaut 0. Or, nous avons déjà une bascule qui inverse son contenu sous certaines condition : la bascule T ! Il est donc possible de fusionner chaque bascule D avec la porte XOR associée, pour donner une bascule T. Le circuit final est celui-ci :
[[File:Compteur synchrone à bascules T.jpg|centre|vignette|upright=2|Compteur synchrone utilisant des bascules T.]]
Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre.
===Les compteurs en cascade===
[[File:8 Bit Counter.svg|vignette|Compteur 8 bits fabriqués avec deux compteurs 4 bits.]]
Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 8 bits à partir de deux compteurs 4 bits, enchainés l'un à la suite de l'autre. Idem avec 4 compteurs 4 bits, ce qui fait un compteur de 16 bits.
Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation.
Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue peut être calculée en utilisant des optimisations comme l'anticipation de retenue, ce qui veut dire qu'elle est calculée sans propager les retenues, directement à partir des bits de l'opérande. Concrètement, la retenue est calculée en faisant un ET logique entre tous les bits du décompte.
[[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]]
Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe.
[[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]]
===Les compteurs modulo===
La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ...
Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6 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. 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=1.5|Compteur modulo N.]]
Pour une minorité de compteurs, la valeur maximale est configurable. Le compteur est alors appelé un '''compteur programmable'''. Un compteur programmable contient un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail.
[[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]]
Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur.
===Les décompteurs et compteurs/décompteurs===
Il est possible de créer un décompteur en couplant un registre avec un circuit décrémenteur. Cependant, il existe des alternatives assez intéressantes à étudier. L'une d'entre elle se base sur un principe mathématique assez simple, que je vais introduire par un exemple. Prenons un compteur 4 bits, qui compte de 0 à 15, et un décompteur 4 bits qui compte dans le sen inverse. Les deux parcourent les mêmes valeurs, mais dans le sens inverse. Regardons ce que cela donne en décimal :
{|class="wikitable"
|-
! Cycle 1
| 0000 (0) || 1111 (15)
|-
! Cycle 1
| 0001 (1) || 1110 (14)
|-
! Cycle 1
| 0010 (2) || 1101 (13)
|-
! Cycle 1
| 0011 (3) || 1100 (12)
|-
! Cycle 1
| 0100 (4) || 1011 (11)
|-
! Cycle 1
| 0101 (5) || 1010 (10)
|-
! Cycle 1
| 0110 (6) || 1001 (9)
|-
! Cycle 1
| 0111 (7) || 1000 (8)
|-
! Cycle 1
| 1000 (8) || 0111 (7)
|-
! Cycle 1
| 1001(9) || 0110 (6)
|-
! Cycle 1
| 1010 (10) || 0101 (5)
|-
! Cycle 1
| 1011 (11) || 0100 (4)
|-
! Cycle 1
| 1100 (12) || 0011 (3)
|-
! Cycle 1
| 1101 (13) || 0010 (2)
|-
! Cycle 1
| 1110(14) || 0001 (1)
|-
! Cycle 1
| 1111 (15) || 0000 (0)
|}
La valeur d'un compteur et d'un compteur sont l'exact inverse l'un de l'autre ! Inverse dans le sens les bits sont inversés, les 0 devenant des 1 et réciproquement.
Pour avoir un décompteur, il suffit donc de prendre un compteur et d'inverser sa sortie.
==Les ''timers'' : compter des durées, compter des cycles d'horloge==
Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge.
Les ''timers'' peuvent compter de deux manières différentes, appelées ''mode une fois'' et ''mode périodique''.
* En '''mode une fois''', le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge.
* En '''mode périodique''', le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini.
[[File:Programmable interval timer timing diagram.jpg|centre|vignette|upright=2.5|Exemple d'un ''Timer'' périodique, qui émet un signal tous les 6 cycles d'horloge.]]
Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Avec un compteur, le compteur est initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteindre la valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite, est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés.
Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Il peut être mémorisé dans un '''registre d’intervalle''' dédié.
[[File:Programmable interval timer.jpg|centre|vignette|upright=2|''Timer'' périodique basé sur un décompteur. La porte NOR détecte si le décompteur atteint zéro.]]
Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''.
===Le ''watchdog timer''===
Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt.
[[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]]
===Le ''Time Stamp Counter'' des processeurs x86===
Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres.
Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable.
===L'horloge temps réel===
L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée.
En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre).
===Le ''Programmable Interval Timer'' : l'Intel 8253===
L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu.
[[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]]
L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique.
[[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]]
L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration :
* Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro.
* Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits.
* Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits.
* Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre.
L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits.
===Le ''High Precision Event Timer'' (HPET)===
De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256.
[[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]]
Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253.
Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé.
==Les compteurs en code Gray==
Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit ceux 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 ! Pour comparer, en binaire normal, lorsqu'on passe incrémente un nombre, il peut y avoir plusieurs bits qui changent. La moyenne est d'environ deux bits par incrémentation. Les compteurs en code Gray ont beaucoup d'avantages, qui sont tous liés à cette propriété.
Le premier l'absence d'état transitoires douteux. Le problème est que les bits modifiés par une incrémentation ne le sont pas en même temps. Les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où seuls les bits de poids faibles ont été modifiés. C'est un problème si le contenu de ce compteur est relié à des circuits rapides, qui peuvent voir cet état transitoire, mais ne le doivent pas sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas.
Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. S'il faut échanger des informations entre ces deux domaines d'horloge, divers problèmes surviennent. Un domaine d'horloge sera plus rapide que l'autre, et pourra voir les états transitoires invisible de l'autre circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, ce qui fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente !
Un autre avantage mineurs est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Et la majeure partie de cette consommation sert à faire passer un bit de 0 à 1 ou de 1 à 0. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique.
La moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray, on devine que ces derniers consomment deux fois moins d'énergie par incrémentation. Et cet avantage a des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer.
Un autre avantage en matière de consommation énergétique est lié auxs transitions d'état douteuses. Les circuits connectés au compteur vont voir ces transitions d'état douteuses et modifier leur état interne en réaction. Bien sur, l'état final correct sera atteint une fois que le compteur sera stabilisé, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspond à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée !
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les registres et mémoires adressables
| prevText=Les registres et mémoires adressables
| next=Les registres à décalage et les LSFR
| nextText=Les registres à décalage et les LSFR
}}
</noinclude>
s4dn2z24qvagbghyjcpxybm9rj45oe8
768852
768851
2026-06-28T17:38:51Z
Mewtow
31375
/* Les décompteurs et compteurs/décompteurs */
768852
wikitext
text/x-wiki
Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs.
[[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]]
Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux.
==L'interface d'un compteur/décompteur==
Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge.
Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue.
Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde.
Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter.
[[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]]
Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones.
==L'intérieur d'un compteur==
A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue.
[[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]]
===Les compteurs synchrones basiques===
L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur :
[[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone utilisant des bascules D.]]
Une simplification permet de faire disparaitre les portes XOR. Les portes XOR servent ici d'inverseur commandable, commandé par la retenue entrante. Elles inversent le contenu de la bascule quand la retenue entrante vaut 1, elles laissent la bascule inchangée si la retenue vaut 0. Or, nous avons déjà une bascule qui inverse son contenu sous certaines condition : la bascule T ! Il est donc possible de fusionner chaque bascule D avec la porte XOR associée, pour donner une bascule T. Le circuit final est celui-ci :
[[File:Compteur synchrone à bascules T.jpg|centre|vignette|upright=2|Compteur synchrone utilisant des bascules T.]]
Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre.
===Les compteurs en cascade===
[[File:8 Bit Counter.svg|vignette|Compteur 8 bits fabriqués avec deux compteurs 4 bits.]]
Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 8 bits à partir de deux compteurs 4 bits, enchainés l'un à la suite de l'autre. Idem avec 4 compteurs 4 bits, ce qui fait un compteur de 16 bits.
Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation.
Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue peut être calculée en utilisant des optimisations comme l'anticipation de retenue, ce qui veut dire qu'elle est calculée sans propager les retenues, directement à partir des bits de l'opérande. Concrètement, la retenue est calculée en faisant un ET logique entre tous les bits du décompte.
[[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]]
Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe.
[[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]]
===Les compteurs modulo===
La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ...
Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6 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. 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=1.5|Compteur modulo N.]]
Pour une minorité de compteurs, la valeur maximale est configurable. Le compteur est alors appelé un '''compteur programmable'''. Un compteur programmable contient un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail.
[[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]]
Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur.
===Les décompteurs et compteurs/décompteurs===
Il est possible de créer un décompteur en couplant un registre avec un circuit décrémenteur. Cependant, il existe des alternatives assez intéressantes à étudier. L'une d'entre elle se base sur un principe mathématique assez simple, que je vais introduire par un exemple. Prenons un compteur 4 bits, qui compte de 0 à 15, et un décompteur 4 bits qui compte dans le sen inverse. Les deux parcourent les mêmes valeurs, mais dans le sens inverse. Regardons ce que cela donne en décimal :
{|class="wikitable"
|-
! Cycle 1
| 0000 (0) || 1111 (15)
|-
! Cycle 1
| 0001 (1) || 1110 (14)
|-
! Cycle 1
| 0010 (2) || 1101 (13)
|-
! Cycle 1
| 0011 (3) || 1100 (12)
|-
! Cycle 1
| 0100 (4) || 1011 (11)
|-
! Cycle 1
| 0101 (5) || 1010 (10)
|-
! Cycle 1
| 0110 (6) || 1001 (9)
|-
! Cycle 1
| 0111 (7) || 1000 (8)
|-
! Cycle 1
| 1000 (8) || 0111 (7)
|-
! Cycle 1
| 1001(9) || 0110 (6)
|-
! Cycle 1
| 1010 (10) || 0101 (5)
|-
! Cycle 1
| 1011 (11) || 0100 (4)
|-
! Cycle 1
| 1100 (12) || 0011 (3)
|-
! Cycle 1
| 1101 (13) || 0010 (2)
|-
! Cycle 1
| 1110(14) || 0001 (1)
|-
! Cycle 1
| 1111 (15) || 0000 (0)
|}
La valeur d'un compteur et d'un compteur sont l'exact inverse l'un de l'autre ! Inverse dans le sens les bits sont inversés, les 0 devenant des 1 et réciproquement. Et cela ne marche pas que pour des compteurs ou décompteurs 4 bits, mais pour tous les compteurs et décompteurs.
Pour avoir un décompteur, il suffit donc de prendre un compteur et d'inverser sa sortie.
==Les ''timers'' : compter des durées, compter des cycles d'horloge==
Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge.
Les ''timers'' peuvent compter de deux manières différentes, appelées ''mode une fois'' et ''mode périodique''.
* En '''mode une fois''', le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge.
* En '''mode périodique''', le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini.
[[File:Programmable interval timer timing diagram.jpg|centre|vignette|upright=2.5|Exemple d'un ''Timer'' périodique, qui émet un signal tous les 6 cycles d'horloge.]]
Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Avec un compteur, le compteur est initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteindre la valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite, est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés.
Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Il peut être mémorisé dans un '''registre d’intervalle''' dédié.
[[File:Programmable interval timer.jpg|centre|vignette|upright=2|''Timer'' périodique basé sur un décompteur. La porte NOR détecte si le décompteur atteint zéro.]]
Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''.
===Le ''watchdog timer''===
Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt.
[[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]]
===Le ''Time Stamp Counter'' des processeurs x86===
Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres.
Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable.
===L'horloge temps réel===
L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée.
En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre).
===Le ''Programmable Interval Timer'' : l'Intel 8253===
L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu.
[[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]]
L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique.
[[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]]
L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration :
* Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro.
* Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits.
* Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits.
* Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre.
L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits.
===Le ''High Precision Event Timer'' (HPET)===
De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256.
[[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]]
Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253.
Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé.
==Les compteurs en code Gray==
Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit ceux 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 ! Pour comparer, en binaire normal, lorsqu'on passe incrémente un nombre, il peut y avoir plusieurs bits qui changent. La moyenne est d'environ deux bits par incrémentation. Les compteurs en code Gray ont beaucoup d'avantages, qui sont tous liés à cette propriété.
Le premier l'absence d'état transitoires douteux. Le problème est que les bits modifiés par une incrémentation ne le sont pas en même temps. Les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où seuls les bits de poids faibles ont été modifiés. C'est un problème si le contenu de ce compteur est relié à des circuits rapides, qui peuvent voir cet état transitoire, mais ne le doivent pas sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas.
Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. S'il faut échanger des informations entre ces deux domaines d'horloge, divers problèmes surviennent. Un domaine d'horloge sera plus rapide que l'autre, et pourra voir les états transitoires invisible de l'autre circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, ce qui fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente !
Un autre avantage mineurs est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Et la majeure partie de cette consommation sert à faire passer un bit de 0 à 1 ou de 1 à 0. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique.
La moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray, on devine que ces derniers consomment deux fois moins d'énergie par incrémentation. Et cet avantage a des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer.
Un autre avantage en matière de consommation énergétique est lié auxs transitions d'état douteuses. Les circuits connectés au compteur vont voir ces transitions d'état douteuses et modifier leur état interne en réaction. Bien sur, l'état final correct sera atteint une fois que le compteur sera stabilisé, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspond à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée !
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les registres et mémoires adressables
| prevText=Les registres et mémoires adressables
| next=Les registres à décalage et les LSFR
| nextText=Les registres à décalage et les LSFR
}}
</noinclude>
m62fm1q2cwfa5h7989c287ikqplfc2y
768853
768852
2026-06-28T17:39:30Z
Mewtow
31375
/* Les décompteurs et compteurs/décompteurs */
768853
wikitext
text/x-wiki
Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs.
[[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]]
Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux.
==L'interface d'un compteur/décompteur==
Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge.
Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue.
Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde.
Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter.
[[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]]
Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones.
==L'intérieur d'un compteur==
A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue.
[[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]]
===Les compteurs synchrones basiques===
L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur :
[[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone utilisant des bascules D.]]
Une simplification permet de faire disparaitre les portes XOR. Les portes XOR servent ici d'inverseur commandable, commandé par la retenue entrante. Elles inversent le contenu de la bascule quand la retenue entrante vaut 1, elles laissent la bascule inchangée si la retenue vaut 0. Or, nous avons déjà une bascule qui inverse son contenu sous certaines condition : la bascule T ! Il est donc possible de fusionner chaque bascule D avec la porte XOR associée, pour donner une bascule T. Le circuit final est celui-ci :
[[File:Compteur synchrone à bascules T.jpg|centre|vignette|upright=2|Compteur synchrone utilisant des bascules T.]]
Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre.
===Les compteurs en cascade===
[[File:8 Bit Counter.svg|vignette|Compteur 8 bits fabriqués avec deux compteurs 4 bits.]]
Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 8 bits à partir de deux compteurs 4 bits, enchainés l'un à la suite de l'autre. Idem avec 4 compteurs 4 bits, ce qui fait un compteur de 16 bits.
Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation.
Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue peut être calculée en utilisant des optimisations comme l'anticipation de retenue, ce qui veut dire qu'elle est calculée sans propager les retenues, directement à partir des bits de l'opérande. Concrètement, la retenue est calculée en faisant un ET logique entre tous les bits du décompte.
[[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]]
Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe.
[[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]]
===Les compteurs modulo===
La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ...
Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6 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. 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=1.5|Compteur modulo N.]]
Pour une minorité de compteurs, la valeur maximale est configurable. Le compteur est alors appelé un '''compteur programmable'''. Un compteur programmable contient un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail.
[[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]]
Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur.
===Les décompteurs et compteurs/décompteurs===
Il est possible de créer un décompteur en couplant un registre avec un circuit décrémenteur. Cependant, il existe des alternatives assez intéressantes à étudier. L'une d'entre elle se base sur un principe mathématique assez simple, que je vais introduire par un exemple. Prenons un compteur 4 bits, qui compte de 0 à 15, et un décompteur 4 bits qui compte dans le sen inverse. Les deux parcourent les mêmes valeurs, mais dans le sens inverse. Regardons ce que cela donne en décimal :
{|class="wikitable"
|-
! Cycle 1
| 0000 (0) || 1111 (15)
|-
! Cycle 2
| 0001 (1) || 1110 (14)
|-
! Cycle 3
| 0010 (2) || 1101 (13)
|-
! Cycle 4
| 0011 (3) || 1100 (12)
|-
! Cycle 5
| 0100 (4) || 1011 (11)
|-
! Cycle 6
| 0101 (5) || 1010 (10)
|-
! Cycle 7
| 0110 (6) || 1001 (9)
|-
! Cycle 8
| 0111 (7) || 1000 (8)
|-
! Cycle 9
| 1000 (8) || 0111 (7)
|-
! Cycle 10
| 1001(9) || 0110 (6)
|-
! Cycle 11
| 1010 (10) || 0101 (5)
|-
! Cycle 12
| 1011 (11) || 0100 (4)
|-
! Cycle 13
| 1100 (12) || 0011 (3)
|-
! Cycle 14
| 1101 (13) || 0010 (2)
|-
! Cycle 15
| 1110(14) || 0001 (1)
|-
! Cycle 16
| 1111 (15) || 0000 (0)
|}
La valeur d'un compteur et d'un compteur sont l'exact inverse l'un de l'autre ! Inverse dans le sens les bits sont inversés, les 0 devenant des 1 et réciproquement. Et cela ne marche pas que pour des compteurs ou décompteurs 4 bits, mais pour tous les compteurs et décompteurs.
Pour avoir un décompteur, il suffit donc de prendre un compteur et d'inverser sa sortie.
==Les ''timers'' : compter des durées, compter des cycles d'horloge==
Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge.
Les ''timers'' peuvent compter de deux manières différentes, appelées ''mode une fois'' et ''mode périodique''.
* En '''mode une fois''', le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge.
* En '''mode périodique''', le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini.
[[File:Programmable interval timer timing diagram.jpg|centre|vignette|upright=2.5|Exemple d'un ''Timer'' périodique, qui émet un signal tous les 6 cycles d'horloge.]]
Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Avec un compteur, le compteur est initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteindre la valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite, est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés.
Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Il peut être mémorisé dans un '''registre d’intervalle''' dédié.
[[File:Programmable interval timer.jpg|centre|vignette|upright=2|''Timer'' périodique basé sur un décompteur. La porte NOR détecte si le décompteur atteint zéro.]]
Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''.
===Le ''watchdog timer''===
Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt.
[[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]]
===Le ''Time Stamp Counter'' des processeurs x86===
Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres.
Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable.
===L'horloge temps réel===
L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée.
En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre).
===Le ''Programmable Interval Timer'' : l'Intel 8253===
L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu.
[[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]]
L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique.
[[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]]
L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration :
* Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro.
* Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits.
* Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits.
* Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre.
L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits.
===Le ''High Precision Event Timer'' (HPET)===
De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256.
[[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]]
Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253.
Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé.
==Les compteurs en code Gray==
Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit ceux 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 ! Pour comparer, en binaire normal, lorsqu'on passe incrémente un nombre, il peut y avoir plusieurs bits qui changent. La moyenne est d'environ deux bits par incrémentation. Les compteurs en code Gray ont beaucoup d'avantages, qui sont tous liés à cette propriété.
Le premier l'absence d'état transitoires douteux. Le problème est que les bits modifiés par une incrémentation ne le sont pas en même temps. Les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où seuls les bits de poids faibles ont été modifiés. C'est un problème si le contenu de ce compteur est relié à des circuits rapides, qui peuvent voir cet état transitoire, mais ne le doivent pas sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas.
Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. S'il faut échanger des informations entre ces deux domaines d'horloge, divers problèmes surviennent. Un domaine d'horloge sera plus rapide que l'autre, et pourra voir les états transitoires invisible de l'autre circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, ce qui fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente !
Un autre avantage mineurs est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Et la majeure partie de cette consommation sert à faire passer un bit de 0 à 1 ou de 1 à 0. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique.
La moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray, on devine que ces derniers consomment deux fois moins d'énergie par incrémentation. Et cet avantage a des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer.
Un autre avantage en matière de consommation énergétique est lié auxs transitions d'état douteuses. Les circuits connectés au compteur vont voir ces transitions d'état douteuses et modifier leur état interne en réaction. Bien sur, l'état final correct sera atteint une fois que le compteur sera stabilisé, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspond à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée !
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les registres et mémoires adressables
| prevText=Les registres et mémoires adressables
| next=Les registres à décalage et les LSFR
| nextText=Les registres à décalage et les LSFR
}}
</noinclude>
dfi54hgala8w24z5nhdwa77luaj7alv
Fonctionnement d'un ordinateur/Les unités arithmétiques et logiques entières (simples)
0
80707
768834
768726
2026-06-28T14:41:04Z
Mewtow
31375
/* La manipulation de la retenue dans l'additionneur complet */
768834
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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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]]
[[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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
a66ja244c1r8ldydvixlntb2qcpvnne
768835
768834
2026-06-28T14:41:39Z
Mewtow
31375
/* La manipulation de la retenue dans l'additionneur complet */
768835
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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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.
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
ewgctih2ukxxkt7o0kc5825wym86m65
768836
768835
2026-06-28T14:42:06Z
Mewtow
31375
/* La manipulation de la retenue dans l'additionneur complet */
768836
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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
h743p04iaxiwwpcwf8gd6za2yokgu0v
768837
768836
2026-06-28T14:47:02Z
Mewtow
31375
768837
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
iwj1gw85e421b9a4gyd5byen1jv95ba
768838
768837
2026-06-28T14:48:17Z
Mewtow
31375
/* L'interface d'une unité de calcul et sa conception */
768838
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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. 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.
Une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, 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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
bcl84hk7q968pkyl9g3u8i6k3zrffac
768839
768838
2026-06-28T14:49:44Z
Mewtow
31375
/* Les ALU qui manipulent les retenues */
768839
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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. 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.
Une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, 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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 n'implémente pas les opérations ET/OU/XOR bit à bit. L'ALU que nous allons voir dans cette section en est capable. 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
gz1vnyhxij2qywyz06p5ipmgwv44j7h
768840
768839
2026-06-28T14:50:38Z
Mewtow
31375
/* Les ALU qui manipulent les retenues */
768840
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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. 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.
Une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, 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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 n'implémente pas les opérations ET/OU/XOR bit à bit. L'ALU que nous allons voir dans cette section en est capable. L'idée est d'émuler d'autres opérations à partir de l'addition, en manipulant les retenues. 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
ttkmht86w869t56lagdbrzq1afkc54j
768841
768840
2026-06-28T14:52:21Z
Mewtow
31375
/* Un additionneur complet est une petite ALU de 1 bit */
768841
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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. 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.
Une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, 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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 n'implémente pas les opérations ET/OU/XOR bit à bit. L'ALU que nous allons voir dans cette section en est capable. L'idée est d'émuler d'autres opérations à partir de l'addition, en manipulant les retenues. 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, comme les opérations NOT, OU, ET, XOR, NXOR. Pour rappel, un additionneur complet implémente ces équations logiques :
: <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 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
dscwd1mhraiobboq24adarr3rqeia38
768842
768841
2026-06-28T14:53:43Z
Mewtow
31375
/* Les ALU à manipulation de retenue */
768842
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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. 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.
Une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, 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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 n'implémente pas les opérations ET/OU/XOR bit à bit. L'ALU que nous allons voir dans cette section en est capable. L'idée est d'émuler d'autres opérations à partir de l'addition, en manipulant les retenues. 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, comme les opérations NOT, OU, ET, XOR, NXOR. Pour rappel, un additionneur complet implémente ces équations logiques :
: <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 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 peut être fusionné avec l'inverseur commandable, ce qui donne un circuit composé de portes universelles 1 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
sgxcsq7fu234riwcz4pkypkb7pzgeun
768843
768842
2026-06-28T14:58:57Z
Mewtow
31375
/* Les ALU à manipulation de retenue */
768843
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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. 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.
Une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, 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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 n'implémente pas les opérations ET/OU/XOR bit à bit. L'ALU que nous allons voir dans cette section en est capable. L'idée est d'émuler d'autres opérations à partir de l'addition, en manipulant les retenues. 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, comme les opérations NOT, OU, ET, XOR, NXOR. Pour rappel, un additionneur complet implémente ces équations logiques :
: <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 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. Ce circuit peut être implémenté avec des portes universelles 1 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
6jwxtvdude33jjt4rd35arnzd5cviwi
768844
768843
2026-06-28T15:00:28Z
Mewtow
31375
/* Les ALU à manipulation de retenue */
768844
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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. 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.
Une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, 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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 n'implémente pas les opérations ET/OU/XOR bit à bit. L'ALU que nous allons voir dans cette section en est capable. L'idée est d'émuler d'autres opérations à partir de l'addition, en manipulant les retenues. 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, comme les opérations NOT, OU, ET, XOR, NXOR. Pour rappel, un additionneur complet implémente ces équations logiques :
: <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 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. 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
kht1rpyeenaoh1fbhq1t8t9bf311ns3
768845
768844
2026-06-28T15:00:44Z
Mewtow
31375
/* Les ALU qui manipulent les retenues */
768845
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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. 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.
Une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, 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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 n'implémente pas les opérations ET/OU/XOR bit à bit. L'ALU que nous allons voir dans cette section en est capable. L'idée est d'émuler d'autres opérations à partir de l'addition, en manipulant les retenues. 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...
===Les ALU à manipulation de retenue===
Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, comme les opérations NOT, OU, ET, XOR, NXOR. Pour rappel, un additionneur complet implémente ces équations logiques :
: <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 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.
Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
9hxmlzo418qznz1zwg3cr2vqgfq09rp
768846
768845
2026-06-28T15:01:31Z
Mewtow
31375
/* Les ALU à manipulation de retenue */
768846
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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. 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.
Une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, 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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 n'implémente pas les opérations ET/OU/XOR bit à bit. L'ALU que nous allons voir dans cette section en est capable. L'idée est d'émuler d'autres opérations à partir de l'addition, en manipulant les retenues. 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...
===Les ALU à manipulation de retenue extérieure aux additionneurs===
Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, comme les opérations NOT, OU, ET, XOR, NXOR. Pour rappel, un additionneur complet implémente ces équations logiques :
: <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 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.
Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. 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 utilise fusionne ce multiplexeur avec l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
jdtdrs6c4h1i50ua2mzpuy0ti4phzh4
768847
768846
2026-06-28T15:02:03Z
Mewtow
31375
/* La manipulation de la retenue dans l'additionneur complet */
768847
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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. 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.
Une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, 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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 n'implémente pas les opérations ET/OU/XOR bit à bit. L'ALU que nous allons voir dans cette section en est capable. L'idée est d'émuler d'autres opérations à partir de l'addition, en manipulant les retenues. 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...
===Les ALU à manipulation de retenue extérieure aux additionneurs===
Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, comme les opérations NOT, OU, ET, XOR, NXOR. Pour rappel, un additionneur complet implémente ces équations logiques :
: <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 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.
Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. 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 s'en passe totalement. L'idée est que la retenue est manipulée à l’intérieur de l'additionneur lui-même.
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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
7gf2vd7w2axmpew3ucna7uxn6m0i2ai
768848
768847
2026-06-28T15:55:27Z
Mewtow
31375
/* La manipulation de la retenue dans l'additionneur complet */
768848
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. Mais il est possible d'aller encore plus loin ! Dans ce chapitre, nous allons voir un circuit appelé l''''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). 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. Créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire, une unité de contrôle, et d'interconnecter le tout. 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 a évidemment deux entrées pour les opérandes et une sortie pour le résultat. Elle a 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''.
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. 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.
Une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, 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]]
===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.]]
===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ées de l'époque géraient des opérandes de 2, 4, 8 bits, rarement 16 bits.
Il était possible d'assembler plusieurs ALU de 4/8 bits 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. Un autre exemple classique est celui de l'ALU 74181, une ALU de 4 bits, qu'on pouvait combiner pour créer des ALUs de 16 bits ou plus. 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, la seconde calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition entre les deux ALUs. Pour cela, il y a deux solutions.
Avec la première solution, la première ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante. 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.
Une autre solution utilisait un circuit d'anticipation de retenue, séparé de l'ALU. Les retenues étaient alors calculées par ce circuit, qui envoyait les retenues calculées sur les entrées de retenue des ALUs. Un exemple classique est celui de l'ALU 74181, mentionnée plus haut. Il était 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 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 n'implémente pas les opérations ET/OU/XOR bit à bit. L'ALU que nous allons voir dans cette section en est capable. L'idée est d'émuler d'autres opérations à partir de l'addition, en manipulant les retenues. 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...
===Les ALU à manipulation de retenue extérieure aux additionneurs===
Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, comme les opérations NOT, OU, ET, XOR, NXOR. Pour rappel, un additionneur complet implémente ces équations logiques :
: <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 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.
Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. 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===
Il est maintenant temps de voir une ALU où la retenue est manipulée à l’intérieur de l'additionneur lui-même. 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. Les deux cas particuliers sont gérés par les 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. 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. De plus, le circuit en jaune est aussi à prendre en compte. Voici exactement à quoi ressemble ce circuit :
[[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]]
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=1.5|Additionneur complet basé sur un MUX]]
Le demi-additionneur est composé de deux portes logiques : une porte ET et une porte XOR. 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=1.5|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=1.5|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=1.5|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===
[[File:SN74S181N.JPG|vignette|upright=1.0|Circuit imprimé d'une 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>
1ys9xxvijg8ynp96ru98269mhreu7hl
Dictionnaire de philosophie/U
0
83067
768895
767291
2026-06-29T03:47:47Z
PandaMystique
119061
768895
wikitext
text/x-wiki
{{DicoPhilo|U}}
<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/Ubuntu|Ubuntu]]
:[[Dictionnaire de philosophie/Un|Un]]
:[[Dictionnaire de philosophie/Miguel de Unamuno|Unamuno]]
:[[Dictionnaire de philosophie/Unité|Unité]]
</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/Universalisme|Universalisme]]
:[[Dictionnaire de philosophie/Universaux|Universaux]]
:[[Dictionnaire de philosophie/Universel|Universel]]
</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/Usage|Usage]]
:[[Dictionnaire de philosophie/Utilitarisme|Utilitarisme]]
:[[Dictionnaire de philosophie/Utopie|Utopie]]
</div>
</div>
{{PhiloRecherche}}
{{autocat}}
desdr1zwwt47kv9jtcfxc92f8kj1901
Discussion Wikilivres:Le Bistro/2026
5
83406
768960
768596
2026-06-29T11:48:02Z
MediaWiki message delivery
36013
/* Actualités techniques n° 2026-27 */ nouvelle section
768960
wikitext
text/x-wiki
== Actualités techniques n° 2026-03 ==
<section begin="technews-2026-W03"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/03|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* La Fondation Wikimedia a publié des questions directrices pour son plan annuel de juillet 2026 à juin 2027 sur les plateformes [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2026-2027/Product & Technology OKRs|Meta]] et ''[[diffblog:2025/12/10/shaping-wikimedia-foundations-2026-2027-annual-goals-key-questions-for-the-wikimedia-movement/|Diff]]''. Celles-ci portent sur les tendances mondiales, une expérimentation plus rapide et plus constructive, un meilleur accompagnement des nouveaux contributeurs, le renforcement du rôle des éditeurs et des utilisateurs avancés, l'amélioration de la collaboration entre les projets, ainsi que le développement et la fidélisation du lectorat. Des commentaires et suggestions sont les bienvenus sur la [[m:Talk:Wikimedia Foundation Annual Plan/2026-2027|page de discussion]].
'''Actualités pour la contribution'''
* Dans le cadre des travaux en cours de l'équipe technique communautaire sur le projet [[m:Special:MyLanguage/Community Wishlist/W372|Listes de surveillance multiples]], l'affichage de [[Special:EditWatchlist|Modifier la liste de surveillance]] sera mis à jour entant que qu'une première étape vers la prise en charge de plusieurs listes de surveillance. De plus, la pagination de [[Special:Search|Recherche]] sera également mise à jour, dans le cadre du travail sur le souhait [[m:Special:MyLanguage/Community Wishlist/W186|Refonte de la pagination / navigation des pages]]. [https://phabricator.wikimedia.org/T411596]
* [[m:Special:GlobalWatchlist|La Liste de Surveillance Globale]] est une [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] de MediaWiki qui vous permet de voir vos listes de surveillance provenant de différents wikis sur la même page. Il a récemment été mis à jour pour ressembler davantage à la [[Special:Watchlist|Liste de surveillance]] régulière, par exemple en le préparant pour les comptes temporaires dans le masquage IP (y compris le réacheminement des liens des utilisateurs vers les pages de contributions), en mettant les titres de page en gras et en ouvrant les liens dans les résumés d'édition et les balises dans de nouveaux onglets du navigateur. [https://phabricator.wikimedia.org/T398361][https://phabricator.wikimedia.org/T298919][https://phabricator.wikimedia.org/T273526][https://phabricator.wikimedia.org/T286309]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:28|la tâche soumise|les {{formatnum:28}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:28||s}} la semaine dernière]]. Par exemple, le problème selon lequel les blocs globaux ne disposaient pas de l'option permettant de désactiver l'envoi d'e-mails a maintenant été résolu et sera disponible à l'utilisation à partir de la semaine du 13 janvier. [https://phabricator.wikimedia.org/T401293]
'''Actualités pour la contribution technique'''
* L'[[mw:Special:MyLanguage/VisualEditor/Citation tool|outil de citation VisualEditor]] et les [[mw:Special:MyLanguage/Help:Reference Previews|Aperçus de référence]] prennent désormais en charge "carte" comme type de référence. [https://phabricator.wikimedia.org/T411083]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.46/wmf.10|MediaWiki]]/[[mw:MediaWiki 1.46/wmf.11|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/03|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W03"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 12 janvier 2026 à 20:33 (CET)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29907192 -->
== Thank You for Last Year – Join Wiki Loves Ramadan 2026 ==
Dear Wikimedia communities,
We hope you are doing well, and we wish you a happy New Year.
''Last year, we captured light. This year, we’ll capture legacy.''
In 2025, communities around the world shared the glow of Ramadan nights and the warmth of collective iftars. In 2026, ''Wiki Loves Ramadan'' is expanding, bringing more stories, more cultures, and deeper global connections across Wikimedia projects.
We invite you to explore the ''Wiki Loves Ramadan 2026'' [[m:Special:MyLanguage/Wiki Loves Ramadan 2026|Meta page]] to learn how you can participate and [[m:Special:MyLanguage/Wiki Loves Ramadan 2026/Participating communities|sign up]] your community.
📷 ''Photo campaign on '' [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan 2026|Wikimedia Commons]]
If you have questions about the project, please refer to the FAQs:
* [[m:Special:MyLanguage/Wiki Loves Ramadan/FAQ/|Meta-Wiki]]
* [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan/FAQ|Wikimedia Commons]]
''Early registration for updates is now open via the '''[[m:Special:RegisterForEvent/2710|Event page]]'''''
''Stay connected and receive updates:''
* [https://t.me/WikiLovesRamadan Telegram channel]
* [https://lists.wikimedia.org/postorius/lists/wikilovesramadan.lists.wikimedia.org/ Mailing list]
We look forward to collaborating with you and your community.
'''The Wiki Loves Ramadan 2026 Organizing Team''' 16 janvier 2026 à 20:44 (CET)
<!-- Message envoyé par User:ZI Jony@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29879549 -->
== <span lang="en" dir="ltr">Tech News: 2026-04</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W04"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/04|Translations]] are available.
'''Updates for editors'''
* The tray shown on [[Special:Diff|Special:Diff]] in mobile view has been redesigned. It is now collapsed by default, and incorporates a link to undo the edit being viewed, making it easier for mobile editors and reviewers to take action while keeping the interface uncluttered. [https://phabricator.wikimedia.org/T402297]
* [[m:Special:GlobalWatchlist|The Global Watchlist]] lets you view your watchlists from multiple wikis on one page. The [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] continues to improve — it now automatically determines the text direction (ensuring correct display of sites with unusual domain names) and shows detailed descriptions for log actions. Later this week, a new permanent link for page creations and CSS classes for each entry element will be added. [https://phabricator.wikimedia.org/T412505][https://phabricator.wikimedia.org/T287929][https://phabricator.wikimedia.org/T262768][https://phabricator.wikimedia.org/T414135]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:32}} community-submitted {{PLURAL:32|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the previously observed issue in Vector 2022, where anchor link targets were obscured by the sticky header, has now been addressed. [https://phabricator.wikimedia.org/T406114]
'''Updates for technical contributors'''
* As mentioned in the [[m:Special:MyLanguage/Tech/News/2025/44|October 2025 deprecation announcement]], MediaWiki Interfaces team will begin sunsetting all transform endpoints containing a trailing slash from the MediaWiki REST API the week of January 26. Changes are expected to roll out to all wikis on or before January 30th. All API users currently calling them are encouraged to transition to the non-trailing slash versions. Both endpoint variations can be found, compared, and tested using the [https://test.wikipedia.org/wiki/Special:RestSandbox REST Sandbox]. If you have questions or encounter any problems, please file a ticket in Phabricator to the [https://phabricator.wikimedia.org/project/view/6931/ #MW-Interfaces-Team board].
* Interactive reference documentation for the [[mw:Special:MyLanguage/Wikimedia REST API|Wikimedia REST API]] has moved. Requests to API docs previously hosted through [[mw:Special:MyLanguage/RESTBase|RESTBase]] (e.g.: <code dir=ltr>https://en.wikipedia.org/api/rest_v1/</code>) are now redirected to the [[w:en:Special:RestSandbox|REST Sandbox]].
* The [[mw:Special:MyLanguage/Wikidata Platform|WMF Wikidata Platform team]] (WDP) has published its [[d:Special:MyLanguage/Wikidata:Wikidata Platform team/Newsletter|January 2026 newsletter]]. It includes updates on the legacy full-graph endpoint decommissioning, the User-Agent policy change, the monthly Blazegraph migration office hours, and efforts to reduce regressions caused by the legacy endpoint shutdown. As a reminder, you can [[m:Special:MyLanguage/Global message delivery/Targets/WDP team updates|subscribe to the WDP newsletter]]!
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.12|MediaWiki]]
'''Meetings and events'''
* The [[mw:Wikimedia Hackathon Northwestern Europe 2026|Wikimedia Hackathon Northwestern Europe 2026]] will take place on 13-14 March 2026 in Arnhem, the Netherlands. Applications opened mid-December and will close soon or when capacity is reached. It's a two-day, technically oriented hackathon bringing together Wikimedians from the region. Hope to see you there!
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/04|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W04"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19 janvier 2026 à 21:29 (CET)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29943403 -->
== Révision annuelle du code universel de conduite et des lignes directrices de l'application ==
<section begin="announcement-content" />
Nous vous informons que la période de relecture annuelle du Code de conduite universel et des règles d'applications est actuellement ouverte. Vous pouvez faire vos commentaires sur les modifications que vous souhaitez apporter jusqu'au 9 février 2026. C'est la première d'une série d'étapes nécessaires pour la révision annuelle. Vous trouverez [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|d'autres informations et les discussions auxquelles participer sur la page UCoC de Meta]].
Le [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Comité de coordination du code universel de conduite]] (U4C — Universal Code of Conduct Coordinating Committee) est un groupe global dont le rôle est de fournir une implémentation équitable et cohérente de l'UCoC. Cette relecture annuelle a été envisagée et mise en place par l'U4C. Pour plus d'informations et les responsabilités de l'U4C, veuillez lire la [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|Charte de l'U4C]].
Veuillez partager ces informations avec les autres membres concernés de votre communauté.
-- En coopération avec l'U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|discussion]])<section end="announcement-content" />
19 janvier 2026 à 22:01 (CET)
<!-- Message envoyé par User:Keegan (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== Actualités techniques n° 2026-05 ==
<section begin="technews-2026-W05"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/05|D’autres traductions]] sont disponibles.
'''Actualités pour la contribution'''
* La Fondation Wikimedia invite à donner des commentaires sur [[m:Special:MyLanguage/Product and Technology Advisory Council/Year1 Reflections and Proposed Way Forward 2026 Update|l’avenir proposé]] du [[:m:Special:MyLanguage/Product and Technology Advisory Council|Conseil consultatif des produits et technologies]] jusqu’au 28 février.
* Tous les utilisateurs disposant d'un compte enregistré peuvent désormais utiliser des clés d'accès pour la [[m:Special:MyLanguage/Help:Two-factor authentication|double authentification]] (2FA). Les clés d'accès sont un moyen simple de se connecter sans utiliser un second appareil. Elles vérifient l'identité de l'utilisateur à l'aide d'une empreinte digitale, d'une reconnaissance faciale ou d'un code PIN. Pour configurer une clé d'accès, configurez d'abord une méthode 2FA classique. Actuellement, pour se connecter avec une clé d'accès, les utilisateurs doivent également utiliser un mot de passe. Plus tard ce trimestre, la connexion sans mot de passe permettra aux utilisateurs de se connecter d'un simple clic avec une clé d'accès. Les utilisateurs disposant de droits avancés devront également avoir la 2FA activée. Cela fait partie du projet [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Sécurité du compte]].
* Les contributeurs non enregistrés sur des IP bloquées ou des plages d'IP bloquées peuvent désormais interagir sur le wiki pour faire appel d'un blocage en créant un compte temporaire afin de contester un blocage sur la page de discussion de l'utilisateur, sauf si l'option « empêcher cet utilisateur de modifier sa propre page de discussion » est activée. Cela résout le problème des utilisateurs déconnectés incapables d'utiliser le processus de déblocage par défaut via la page de discussion de l'utilisateur. [https://phabricator.wikimedia.org/T398673]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:20|la tâche soumise|les {{formatnum:20}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:20||s}} la semaine dernière]]. Par exemple, la description des méthodes d'authentification à deux facteurs (2FA) sur la page de gestion a été mise à jour. Il est désormais plus clair et plus facile pour les utilisateurs à comprendre et à utiliser. [https://phabricator.wikimedia.org/T332385]
'''Actualités pour la contribution technique'''
* Une nouvelle variable AbuseFilter, <code>account_type</code>, a été ajoutée pour fournir un moyen fiable de déterminer le type de compte créé dans les actions <code>createaccount</code> et <code>autocreateaccount</code>. Dans le cadre de ce changement, la variable <code>accountname</code> a été renommée en <code>account_name</code>, et <code>accountname</code> est désormais obsolète. Les gestionnaires de filtres doivent mettre à jour tous les filtres qui utilisent des vérifications de type de compte codées en dur ou la variable obsolète. [https://phabricator.wikimedia.org/T414049]
* Les vignettes d'images demandées dans des tailles non standard, et en utilisant des méthodes non standard telles que les requêtes directes à <code dir=ltr><nowiki>upload.wikimedia.org/…</nowiki></code>, cesseront de fonctionner dans un proche avenir. Ce changement vise à prévenir les abus externes continus par des robots et des aspirateurs web. Certains utilisateurs ayant des CSS/JS personnalisés, les administrateurs d'interface qui peuvent corriger les gadgets et les thèmes locaux, ainsi que les auteurs d'outils, devront mettre à jour leur code pour utiliser des tailles de vignettes standard. [[phab:T414805|Des détails, des liens de recherche et des exemples de correction sont disponibles dans la tâche]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.46/wmf.13|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/05|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W05"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 26 janvier 2026 à 22:17 (CET)
<!-- Message envoyé par User:UOzurumba (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29969530 -->
== <span lang="en" dir="ltr">Tech News: 2026-06</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W06"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/06|Translations]] are available.
'''Updates for editors'''
* The "{{int:pageinfo-toolboxlink}}" feature, which gives validating information about a page ([{{fullurl:{{FULLPAGENAME}}|action=info}} example]), now automatically includes a table of contents. If there is a local [[{{ns:8}}:Pageinfo-header]] page created by individual users, it can now be removed. [https://phabricator.wikimedia.org/T363726]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:21}} community-submitted {{PLURAL:21|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, VisualEditor previously added bold or italic formatting inside link descriptions, making the wikicode complex. This has now been fixed. [https://phabricator.wikimedia.org/T409669]
'''Updates for technical contributors'''
* There was no XML dump on 20 January. Additionally, from now on, dumps will be generated once per month only. [https://phabricator.wikimedia.org/T414389]
* The MediaWiki Interfaces team removed support for all transform endpoints containing a trailing slash from the [https://www.mediawiki.org/wiki/Special:MyLanguage/API:REST%20API MediaWiki REST API]. All API users currently calling those endpoints are encouraged to transition to the non-trailing slash versions. If you have questions or encounter any problems, please file a ticket in phabricator to the [https://phabricator.wikimedia.org/project/view/6931/ #MW-Interfaces-Team board].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.14|MediaWiki]]
'''Weekly highlight'''
* Users are reminded that the Wikimedia Foundation has shared some guiding questions for the July 2026–June 2027 Annual Plan on [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2026-2027/Product & Technology OKRs|Meta]] and ''[[diffblog:2025/12/10/shaping-wikimedia-foundations-2026-2027-annual-goals-key-questions-for-the-wikimedia-movement/|Diff]]''. These focus on global trends, faster and healthier experimentation, better support for newcomers, strengthening editors and advanced users, improving collaboration across projects, and growing and retaining readership. Feedback and ideas are welcome on the [[m:Talk:Wikimedia Foundation Annual Plan/2026-2027|talk page]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/06|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W06"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 2 février 2026 à 18:43 (CET)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30000986 -->
== Actualités techniques n° 2026-07 ==
<section begin="technews-2026-W07"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/07|D’autres traductions]] sont disponibles.
'''Actualités pour la contribution'''
* [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Concerne un souhait]] Les contributeurs connectés qui gèrent de grandes ou complexes listes de suivi peuvent désormais organiser et filtrer les pages surveillées de manière à améliorer leurs flux de travail grâce à la nouvelle fonctionnalité [[mw:Special:MyLanguage/Help:Watchlist labels|Étiquettes de liste de suivi]]. En ajoutant des étiquettes personnalisées (par exemple : pages que vous avez créées, pages surveillées pour vandalisme, ou pages de discussion), les utilisateurs peuvent identifier plus rapidement ce qui nécessite une attention, réduire la charge cognitive et répondre plus efficacement. Cela améliore l'utilisabilité de la liste de suivi, en particulier pour les éditeurs très actifs.
* Une nouvelle fonctionnalité disponible sur [[Special:Contributions|Special:Contributions]] montre [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts|des comptes temporaires]] qui sont probablement utilisés par la même personne, et rend ainsi le patrouillage moins chronophage. En vérifiant les contributions d'un compte temporaire, les utilisateurs ayant accès aux adresses IP des comptes temporaires peuvent désormais avoir une vue des contributions des comptes temporaires associés. La fonctionnalité recherche toutes les adresses IP associées à un compte temporaire donné pendant la période de conservation des données et affiche toutes les contributions de tous les comptes temporaires ayant utilisé ces adresses IP. [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts#February 2026: Improvements to the patroller tooling|Plus...]] [https://phabricator.wikimedia.org/T415674]
* Lorsque les éditeurs prévisualisent une modification de wikitexte, la boîte de rappel indiquant qu'ils ne voient qu'une prévisualisation (qui est affichée en haut) a désormais un fond gris/neutre au lieu d'un fond jaune/d'avertissement. Cela facilite la distinction entre les notes de prévisualisation et les avertissements réels (par exemple, les conflits de modification ou les cibles de redirection problématiques), qui seront désormais affichés dans des boîtes d'avertissement ou d'erreur séparées. [https://phabricator.wikimedia.org/T414742]
* La [[m:Special:GlobalWatchlist|Liste de suivi globale]] vous permet de consulter vos listes de suivi provenant de plusieurs wikis sur une seule page. L' [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] continue de s'améliorer — elle prend désormais en charge correctement plus d'un site Wikibase, par exemple à la fois [[d:|Wikidata]] et [[testwikidata:|testwikidata]]. De plus, des problèmes concernant la direction du texte ont été résolus pour les utilisateurs qui préfèrent Wikidata ou d'autres sites Wikibase dans des langues de droite à gauche (RTL). [https://phabricator.wikimedia.org/T415440][https://phabricator.wikimedia.org/T415458]
* <span lang="en" dir="ltr" class="mw-content-ltr">The automatic "magic links" for ISBN, RFC, and PMID numbers have been [[mw:Special:MyLanguage/Help:Magic links|deprecated in wikitext since 2021]] due to inflexibility and difficulties with localization. Several wikis have successfully replaced RFC and PMID magic links with equivalent external links, but a template was often required to replace the functionality of the ISBN magic link. There is now a new [[mw:Special:MyLanguage/Help:Magic words#isbn|built-in parser function]] <code dir=ltr><nowiki>{{#isbn}}</nowiki></code> available to replace the basic functionality of the ISBN magic link. This makes it easier for wikis who wish to migrate off of the deprecated magic link functionality to do so.</span> [https://phabricator.wikimedia.org/T145604]
* Deux nouveaux wikis ont été créés :
** un {{int:project-localized-name-group-wikipedia}} dans [[d:Q35401|Jju]] ([[w:kaj:|<code>w:kaj:</code>]]) [https://phabricator.wikimedia.org/T413283]
** un {{int:project-localized-name-group-wikipedia}} dans [[d:Q1186896|Nawat]] ([[w:ppl:|<code>w:ppl:</code>]]) [https://phabricator.wikimedia.org/T413273]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:23|la tâche soumise|les {{formatnum:23}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:23||s}} la semaine dernière]].
'''Actualités pour la contribution technique'''
* Un nouveau groupe d'utilisateurs global a été créé : [[{{int:grouppage-local-bot}}|{{int:group-local-bot}}]]. Il sera utilisé en interne par le logiciel pour permettre aux robots communautaires de contourner les limites de débit appliquées aux [[w:en:Web_scraping|web scrapers]] abusifs. Les comptes approuvés en tant que robots sur au moins un wiki Wikimedia seront automatiquement ajoutés à ce groupe. Cela ne changera pas les autorisations dont dispose le robot. [https://phabricator.wikimedia.org/T415588]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.46/wmf.15|MediaWiki]]
'''Rencontres et évènements'''
* La [[mw:Special:MyLanguage/MediaWiki Users and Developers Conference Spring 2026|Conférence des utilisateurs et des développeurs de MediaWiki, Printemps 2026]] se tiendra du 25 au 27 mars à Salt Lake City, États-Unis. Cet événement est organisé par et pour la communauté MediaWiki de tiers. Vous pouvez proposer des sessions et vous inscrire pour y assister. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/AZBWVI46SDEB65PGR5J6E4TYOQQEZXM7/]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/07|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W07"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 10 février 2026 à 00:30 (CET)
<!-- Message envoyé par User:Quiddity (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30026671 -->
== Actualités techniques n° 2026-08 ==
<section begin="technews-2026-W08"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/08|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* <span class="mw-translate-fuzzy">L'[[mw:Special:MyLanguage/Wikimedia Site Reliability Engineering|équipe SRE]] va procéder au nettoyage d'[[m:Special:MyLanguage/Etherpad|Etherpad]], l'éditeur web open source de documents collaboratifs en temps réel. Tous les blocs-notes seront définitivement supprimés après le 30 avril 2026 – si des projets de migration sont encore en cours à cette date, l'équipe pourra réexaminer la date au cas par cas. Veuillez effectuer des sauvegardes locales de tout contenu que vous souhaitez conserver, car les données supprimées ne pourront pas être récupérées. Ce nettoyage permet de réduire la taille de la base de données et l'empreinte de l'infrastructure. Etherpad continuera de prendre en charge la collaboration en temps réel, mais le stockage à long terme n'est plus assuré. D'autres nettoyages pourront avoir lieu ultérieurement sans préavis.</span> [https://phabricator.wikimedia.org/T415237]
'''Actualités pour la contribution'''
* L'équipe de Recherche d'Informations lancera une [[mw:Special:MyLanguage/Readers/Information Retrieval/Phase 1|expérimentation sur l'application mobile Android]], afin de tester des fonctionnalités de recherche hybrides capables de gérer à la fois les requêtes sémantiques et par mots-clés. L'amélioration de la recherche sur la plateforme permettra aux lecteurs de trouver plus facilement ce qu'ils cherchent, directement sur Wikipédia. L'expérimentation sera d'abord lancée sur Wikipédia en grec fin février, puis sur les versions anglaise, française et portugaise en mars. [https://diff.wikimedia.org/2026/01/08/semantic-search-making-it-easier-to-find-the-information-readers-want/ En savoir plus] sur le blog ''Diff''. [https://www.mediawiki.org/wiki/Readers/Information_Retrieval]
* L'équipe « Croissance des lecteurs » mènera [[mw:Special:MyLanguage/Readers/Reader Growth/WE3.10.2 Mobile Table of Contents|une expérience]] auprès des utilisateurs de la version mobile du site web qui ajoute une table des matières et développe automatiquement toutes les sections des articles, afin de mieux comprendre les problèmes de navigation qu'ils rencontrent. Le test sera disponible sur les versions arabe, chinoise, anglaise, française, indonésienne et vietnamienne de Wikipedia.
* Auparavant, les notifications ([[{{ns:8}}:Sitenotice]] et [[{{ns:8}}:Anonnotice]]) du site ne s'affichaient que sur la version ordinateur. Maintenant, elles s'afficheront désormais sur toutes les plateformes. Les utilisateurs mobiles verront ces notifications. Les administrateurs du site doivent être prêts à tester et à corriger les notifications sur les appareils mobiles afin d'éviter toute interférence avec les articles. Pour désactiver ces notifications, les administrateurs d'interface peuvent ajouter <code dir="ltr">#siteNotice { display: none; }</code> à [[{{ns:8}}:Minerva.css]]. [https://phabricator.wikimedia.org/T138572][https://phabricator.wikimedia.org/T416644]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:19|la tâche soumise|les {{formatnum:19}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:19||s}} la semaine dernière]]. Par exemple, un problème concernant la section ''[[Special:RecentChanges|Spécial:Modifications récentes]]'' a été résolu. Auparavant, cliquer sur « Masquer » dans les filtres actifs entraînait la disparition du bouton « Afficher les nouvelles modifications depuis… », alors qu'il aurait dû rester visible. Ce bouton fonctionne désormais correctement. [https://phabricator.wikimedia.org/T406339]
'''Actualités pour la contribution technique'''
* Une nouvelle documentation est désormais disponible pour aider les rédacteurs à déboguer les fonctionnalités de recherche interne. Elle facilite le dépannage lorsque des pages n'apparaissent pas dans les résultats, lorsque le classement semble inattendu et lorsqu'il est nécessaire d'inspecter le contenu indexé, ce qui permet de mieux comprendre et d'analyser le comportement de la recherche. [[mw:Help:CirrusSearch/Debug|En savoir plus]]. [https://phabricator.wikimedia.org/T411169]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.46/wmf.16|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/08|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W08"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16 février 2026 à 20:17 (CET)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30086330 -->
== <span lang="en" dir="ltr">Tech News: 2026-09</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W09"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/09|Translations]] are available.
'''Weekly highlight'''
* [[mw:Special:MyLanguage/Edit check/Reference Check|Reference Check]] has been deployed to English Wikipedia, completing its rollout across all Wikipedias. The feature prompts newcomers to add a citation before publishing new content, helping reduce common citation-related reverts and improve verifiability. In A/B testing, the impact was substantial: newcomers shown Reference Check were approximately 2.2 times more likely to include a reference on desktop and about 17.5 times more likely on mobile web. [https://analytics.wikimedia.org/published/reports/editing/reference_check_ab_test_report_final_2025.html]
'''Updates for editors'''
* The [[mw:Special:MyLanguage/Extension:InterwikiSorting|InterwikiSorting extension]], which allowed for the [[m:Special:MyLanguage/Interwiki sorting order|sorting of interwiki links]], has been undeployed from Wikipedia. As a result, editors who had enabled interwiki link sorting in non-compact mode (full list format) will now see links reordered. The links moving forward will be listed in the alphabetical order of language code. [https://phabricator.wikimedia.org/T253764]
* Later this week, people who are editing a page-section using the mobile visual editor, will notice a new "Edit full page" button. When tapped, you will be able to edit the entire article. This helps when the change you want to make is outside the section you initially opened. [https://phabricator.wikimedia.org/T387175][https://phabricator.wikimedia.org/T409112]
* [[mw:Special:MyLanguage/Readers/Reader Experience|The Reader Experience team]] is inviting editors to assess whether dark mode should still be considered "beta" on their wiki, based on their experience of how well it functions on desktop and mobile. If the feature is deemed mature, editors can update the interface messages in <code dir=ltr>MediaWiki:skin-theme-description</code> and <code dir=ltr>MediaWiki:Vector-night-mode-beta-tag</code> to indicate that dark mode is ready and no longer considered beta.
* The improved [[mw:Wikimedia_Apps/Team/iOS/Activity_Tab|Activity tab]] which displays user-insights is now available to all users of the Wikipedia iOS app (version 7.9.0 and later). Following earlier A/B testing that showed higher account creation among users with access to the feature, it has been rolled out to 100% of users along with some updates. The Activity tab now shows your edited articles in the timeline, offers editing impact insights like contribution counts and article view trends, and customization options to improve in-app experience for users.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:21}} community-submitted {{PLURAL:21|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, a bug that prevented [[mw:Special:MyLanguage/Extension:DiscussionTools|DiscussionTools]] from working on mobile has now been fixed, restoring full functionality. [https://phabricator.wikimedia.org/T415303]
'''Updates for technical contributors'''
* The [[m:Special:GlobalWatchlist|Global Watchlist]] lets you view your watchlists from multiple wikis on one page. The [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] that makes this possible continues to improve. The latest upgrade is the inclusion of a [[mw:Extension:GlobalWatchlist#hook|new hook]], <code dir=ltr>ext.globalwatchlist.rebuild</code>, which fires after each watchlist rebuild. This allows you to run gadgets and user scripts for the Special page. [https://phabricator.wikimedia.org/T275159]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.17|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/09|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W09"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 23 février 2026 à 20:03 (CET)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30119102 -->
== Actualités techniques n° 2026-10 ==
<section begin="technews-2026-W10"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/10|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* Le [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments|mode Anniversaire]] Wikipedia 25 est maintenant disponible sur Wikipédia en français, anglais, betawi, breton, chinois, espagnol, gorontalo, indonésien, italien, luxembourgeois, madurais, néerlandais, sicilien, tchèque, thaï et vietnamien ! Cette campagne à temps limitée célèbre 25 ans de Wikipédia avec une mascotte : « Baby Globe », disponible sous la forme d'un réglage. Lorsque ce réglage est activé, Baby Globe est montrée sur [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments/article configuration|environ 2 500 articles]], attendant d'être découverte par des lecteurs. Chaque communauté peut choisir d'activer le mode Anniversaire par consensus et en demandant à un administrateur de le rendre disponible et de le personaliser via une [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments#Community Configuration Demo|configuration]] sur le wiki local.
'''Actualités pour la contribution'''
* Le [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|sous-référencement]], une nouvelle fonctionalité pour réutiliser des références avec des détails différents est maintenant disponible sur Wikipédia en suédois, polonais et [[:phab:T418209|quelques autres]]. Vous pouvez [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#test|essayer la fonctionalité]] sur ces projets ou sur testwiki et [https://en.wikipedia.beta.wmcloud.org/wiki/Sub-referencing betawiki]. Les retours des premiers essais sur Wikipédia en allemand ont été [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing/Learnings|publiés dans un rapport]]. Contactez l'équipe de Wikimédia Allemagne si vous êtes [[:m:Talk:WMDE Technical Wishes/Sub-referencing#Pilot wikis|intéressés pour devenir un wiki pilote]].
* La [[mw:Special:MyLanguage/Help:Edit check#Paste check|vérification du collage clavier]] sera disponible sur tous les Wikipédias cette semaine. Cette fonctionalité avertit les nouveaux contributeurs qui collent du texte qu'ils n'ont probablement pas écrit de vérifier si laisser celui-ci risque de causer une violation du droit d'auteur. La vérification du collage clavier [[mw:Special:MyLanguage/Edit check/Tags|marque]] toutes les modifications où l'avertissement a été montré pour permettre leur vérification. Les administrateurs locaux peuvent configurer les différents aspects de cette fonctionalité à travers [[{{#special:EditChecks}}]]. Des [[mw:Special:MyLanguage/Edit check/Paste Check#A/B Experiment|études]] sur 22 wikis ont montré que cette vérification permet une réduction de 18% des annulations comparé au groupe de contrôle. Les traducteurs peuvent [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-visualeditor-ve-mw-editcheck&filter=&optional=1&action=translate aider à traduire] cette fonctionalité.
* <span lang="en" dir="ltr" class="mw-content-ltr">The [[mw:Special:MyLanguage/Readers/Reader Experience|Reader Experience team]] will be standardizing the user menu in the top right for all mobile users so that it is closer to the desktop experience. Currently this user menu is only visible to users with Advanced Mobile Controls (AMC) turned on. The only change is that a couple buttons previously in the left-side menu will move to the top right for users who do not have AMC turned on. This change is expected to go out March 9 and seeks to improve the user interface.</span> [https://phabricator.wikimedia.org/T413912]
* À partir de la semaine du 2 mars, les emails envoyés lorsqu'une adresse email a été ajoutée, supprimée ou changée pour un compte changera pour adopter un formattage HTML beaucoup plus agréable et plus clair que le texte brut précédent. [https://phabricator.wikimedia.org/T410807]
* Les notifications sont actuellement limitées à 2 000 entrées historiques par utilisateur et remontent à 2013 lorsque la fonctionnalité a été publiée. Le système va être modifié pour ne stocker que les notifications des 5 dernières années, mais jusqu'à 10 000 d'entre elles. Cela contribuera à la santé à long terme des infrastructures et à empêcher que les notifications plus récentes disparaissent trop tôt. [https://phabricator.wikimedia.org/T383948]
* <span lang="en" dir="ltr" class="mw-content-ltr">The [[m:Special:GlobalWatchlist|Global Watchlist]] which lets you view your watchlists from multiple wikis on a single page continues to see improvements. The latest update improves label usage experience. The [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] now allows activating the [[mw:Special:MyLanguage/Manual:Language#Fallback languages|language fallback system]] for Wikidata items without labels in the viewed language, and showing those labels in the user’s preferred Wikidata language if no <code dir=ltr>uselang=</code> URL parameter is provided.</span> [https://phabricator.wikimedia.org/T373686][https://phabricator.wikimedia.org/T416111]
* L'équipe Wikipédia Android a commencé un test beta de la [[mw:Special:MyLanguage/Readers/Information Retrieval/Phase 1|recherche hybride]] sur Wikipédia en grec. Cette recherche hybride supporte les requêtes sémantique et par mot clés, permettant aux utilisateurs de trouver ce qu'ils cherchent plus facilement.
* Pour des raisons de sécurité, les membres de certains groupes sont [[m:Special:MyLanguage/Mandatory two-factor authentication for users with some extended rights|forcés d'avoir la double authentification]] (A2F) d'activée. Actuellement, l'A2F n'est nécessaire que pour utiliser les droits du groupe, et non pour en faire partie. Vu que ce système admet certaines failles, il sera [[phab:T418580|changé graduellement en mars]]. Les membres de ces groupes ne pourront plus désactiver la dernière méthose d'A2F sur leur compte, et il sera impossible d'ajouter des utilisateurs sans A2F à ces groupes. Il sera toujours possible de rajouter d'autres méthodes d'authentification et d'en enlever, tant qu'une est toujours activée. Dans la seconde moitié de mars, les utilisateurs sans A2F seront retirés de ces groupes. Cela s'applique aux administrateurs CentralNotice, aux vérificateurs d'utilisateurs, aux administrateurs d'interface, aux masqueurs, aux staff de Wikidata et Wikifonctions ainsi qu'aux bureaux IT et Confiance et sécurité de la WMF. Rien ne changera pour les autres utilisateurs. Voir la tâche liée pour le calendrier de déploiement. [https://phabricator.wikimedia.org/T418580]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:27|la tâche soumise|les {{formatnum:27}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:27||s}} la semaine dernière]]. Par exemple, le problème empêchant les utilisateurs de créer une instance dans [https://www.wikibase.cloud/ Wikibase.cloud] a maintenant été résolu. [https://phabricator.wikimedia.org/T416807]
'''Actualités pour la contribution technique'''
* <span lang="en" dir="ltr" class="mw-content-ltr">To help ensure [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|fair use of infrastructure]], over the next month the Wikimedia Foundation will implement global API rate limits across our APIs. In early March, stricter limits will be applied to unidentified requests from outside Toolforge/WMCS and API requests that are made from web browsers. In April, higher limits will be applied to identified traffic. These limits are intentionally set as high as possible to minimise impact on the community. Bots running in Toolforge/WMCS or with the bot user right on any wiki should not be affected for now. However, all developers are advised to follow updated best practices. For more information, see [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|Wikimedia APIs/Rate limits]].</span>
* <span lang="en" dir="ltr" class="mw-content-ltr">The Wikidata Query Service Linked Data Fragment (LDF) endpoint will be decommissioned in February. This endpoint served limited traffic, which was successfully migrated to other data access methods that were better suited to support existing use cases. The hardware used to support the LDF endpoint will be reallocated to support the ongoing backend migration efforts.</span> [https://phabricator.wikimedia.org/T415696]
* Le nouvel analyseur syntaxique Parsoid [[mw:Special:MyLanguage/Parsoid/Parser Unification/Updates|continue d'être déployés sur plus de wikis]], améliorant la pérennité de la platforme et rendant plus facile l'ajout de nouvelles fonctionalités de lecture et de modification. Parsoid est maintenant l'analyseur par défaut sur 488 wikis de la WMF (268 Wikipédias), couvrant plus de 10% de toutes les lectures de pages Wikipédia.
* Le processus et les critères pour [[Special:MyLanguage/Wikimedia Enterprise#Access|demander un accès exceptionnel]] au flux à fort volume de l'API ''Wikimédia Entreprise'' (sans coût pour des utilisations en rapport à notre mission) [[m:Talk:Wikimedia Enterprise#Exceptional access criteria|ont maintenant été publiés]]. Notre but est de donner une documentation plus claire et plus complète aux utilisateurs.
* [https://techblog.wikimedia.org/ Le blog Tech], dédié à la communité technique de Wikimédia [https://techblog.wikimedia.org/2026/02/24/a-tech-blog-diff/ va migrer] vers [[diffblog:|Diff]], le blog pour les nouvelles et événements de la communauté. La migration devrait être terminée en Avril 2026, après quoi les nouveaux posts seront acceptés pour être publiés. Les lecteurs pourront lire les posts - anciens ou nouveaux - sur https://diff.wikimedia.org/.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.46/wmf.18|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/10|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W10"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 2 mars 2026 à 18:51 (CET)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30137798 -->
== <span lang="en" dir="ltr">Tech News: 2026-11</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W11"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/11|Translations]] are available.
'''Weekly highlight'''
* [[m:Special:MyLanguage/Tech/Server switch|All wikis will be read-only]] for a few minutes on Wednesday, 25 March 2026 at [https://zonestamp.toolforge.org/1774450800 15:00 UTC]. This is for the datacenter server switchover backup tests, [[wikitech:Deployments/Yearly calendar|which happen twice a year]]. During the switchover, all Wikimedia website traffic is shifted from one primary data center to the backup data center to test availability and prevent service disruption even in emergencies.
* Last week, all wikis had 2 hours of read-only time, and extended unavailability for user-scripts and gadgets. This was due to a security incident which has since been resolved. Work is ongoing to prevent re-occurrences. For current information please see the [[m:Steward's noticeboard#Statement on Meta about today's user script security incident|post on the Stewards' noticeboard]] ([[m:Special:MyLanguage/Wikimedia Foundation/Product and Technology/Product Safety and Integrity/March 2026 User Script Incident|translations]]).
'''Updates for editors'''
* Users facing multiple blocks on mobile will now see the reasons for each block separately, instead of a generic message. This helps them understand why they are blocked and what steps they can take to resolve the issue. For example, users affected for using common VPNs (such as [[Special:MyLanguage/Apple iCloud Private Relay|iCloud Private Relay]]) will receive clearer guidance on what they need to do to start editing again. [https://phabricator.wikimedia.org/T357118]
* Later this week, [[mw:Special:MyLanguage/VisualEditor/Suggestion Mode|Suggestion Mode]] will become available as a beta feature within the visual editor at all Wikipedias. This feature proactively suggests various types of actions that people can consider taking to improve Wikipedia articles, and learn about related guidelines. The feature is locally configurable, and can also be locally expanded with custom Suggestions. Current settings can be seen at [[Special:EditChecks]] and there are [[mw:Special:MyLanguage/Help:Suggestion mode#For administrators %E2%80%93 local customization|instructions for how administrators can customize]] the links to point to local guidelines. The feature is connected to [[mw:Special:MyLanguage/Help:Edit check|Edit check]] which suggests improvements while someone is writing new content. In the future, the Editing team plans to evaluate the feature's impact with newcomers through a controlled experiment. [https://phabricator.wikimedia.org/T404600]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:23}} community-submitted {{PLURAL:23|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the issue where the cursor became misaligned during the use of CodeMirror’s syntax highlighting, which makes wikitext and code easier to read, has now been fixed. This problem specifically affected users who defined a font rule in a custom stylesheet while creating a new topic with DiscussionTools. [https://phabricator.wikimedia.org/T418793]
'''Updates for technical contributors'''
* API rate limiting update: To help ensure [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|fair use of infrastructure]], global API rate limits will be applied this week to requests without a compliant User-Agent that originate from outside Toolforge/WMCS and to unauthenticated requests made from web browsers. Higher limits will be applied to identified traffic in April. Bots running in Toolforge/WMCS or with the bot user right on any wiki should not be affected for now. However, all developers are advised to follow updated best practices. For more information, see [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|Wikimedia APIs/Rate limits]].
* The new GraphQL API has been released. The API was developed as a flexible alternative to select features of the Wikidata Query Service (WDQS), to improve developer experience and foster adaptability, and efficient data access. Try it out and [[d:Wikidata:Wikibase GraphQL#Feedback and development|give feedback]]. You can also [https://greatquestion.co/wikimediadeutschland/GraphQLAPI/apply sign up for usability tests].
* The [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group|PTAC Unsupported Tools Working Group]] continued improvements to [[commons:Special:MyLanguage/Commons:Video2commons#|Video2Commons]] in February, with fixes addressing authentication errors, large-file handling, task queue visibility, and clearer upload behavior. Work is still ongoing in some areas, including changes related to deprecated server-side uploads. Read [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group#February 2026|this update]] to learn more.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.19|MediaWiki]]
'''In depth'''
* The Article Guidance team invites experienced Wikipedia editors from selected [[mw:Special:MyLanguage/Article guidance/Pilot wikis and collaborators#Collaborators|pilot wikis]] and interested contributors from other Wikipedias to fill out this questionnaire which is available in [https://docs.google.com/forms/d/e/1FAIpQLSfmLeVWnxmsCbPoI_UF2jyRcn73WRGWCVPHzerXb4Cz97X_Ag/viewform English], [https://docs.google.com/forms/d/e/1FAIpQLSd6rzr4XXQw8r4024fE3geTPFe13M_6w7Mitj-YJi0sOlWTAw/viewform?usp=header Arabic], [https://docs.google.com/forms/d/e/1FAIpQLSdok3-RfB18lcugYTUMGkpwmqG_8p760Wv4dCXitOXOszjUDw/viewform?usp=header Bengali], [https://docs.google.com/forms/d/e/1FAIpQLSfjTfYp4jEo0akA4B1e-Nfg3QZPCudUjhJzHzzDi6AHyAaMGA/viewform?usp=header Japanese], [https://docs.google.com/forms/d/e/1FAIpQLScteVoI29Aue4xc72dekk-6RYtvmMgQxzMI900UOawrFrSTWg/viewform?usp=header Portuguese], [https://docs.google.com/forms/d/e/1FAIpQLSetdxnYwL3ub2vqA7awCg5hJZPMIYcDPaiTe12rY9h0GYnVlw/viewform?usp=header Persian], and [https://docs.google.com/forms/d/e/1FAIpQLScNvfJF-Ot-4pzA4qAN771_0QDJ4Li19YcUsaTgSKW8Nc7U_Q/viewform?usp=header Turkish]. Your answers will help the team customize guidance for less experienced editors and help them learn community policies and practices while creating an article. Learn more [[mw:Special:MyLanguage/Article guidance|on the project page]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/11|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W11"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 9 mars 2026 à 19:52 (CET)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30213008 -->
== <span lang="en" dir="ltr">Tech News: 2026-12</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W12"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/12|Translations]] are available.
'''Updates for editors'''
* The [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] beta feature, also known as [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror 6]], has been used for wikitext syntax highlighting since November 2024. It will be promoted out of beta by May 2026 in order to bring improvements and new [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Features|features]] to all editors who use the standard syntax highlighter. If you have any questions or concerns about promoting the feature out of beta, [[mw:Special:MyLanguage/Help talk:Extension:CodeMirror|please share]]. [https://phabricator.wikimedia.org/T259059]
* Some changes to local user groups are performed by stewards on Meta-Wiki and logged there only. Now, interwiki rights changes will be logged both on Meta-Wiki and the wiki of the target user to make it easier to access a full record of user's rights changes on a local wiki. Past log entries for such changes will be backfilled in the coming weeks. [https://phabricator.wikimedia.org/T6055]
* On wikis using [[m:Special:MyLanguage/Flagged Revisions|Flagged Revisions]], the number of pending changes shown on [[{{#Special:PendingChanges}}]] previously counted pages which were no longer pending review, because they have been removed from the system without being reviewed, e.g. due to being deleted, moved to a different namespace, or due to wiki configuration changes. The count will be correct now. On some wikis the number shown will be much smaller than before. There should be no change to the list of pages itself. [https://phabricator.wikimedia.org/T413016]
* Wikifunctions composition language has been rewritten, resulting in a new version of the language. This change aims to increase service stability by reducing the orchestrator's memory consumption. This rewrite also enables substantial latency reduction, code simplification, and better abstractions, which will open the door to later feature additions. Read more about [[f:Special:MyLanguage/Wikifunctions:Status updates/2026-03-11|the changes]].
* Users can now sort search results alphabetically by page title. The update gives an additional option to finding pages more easily and quickly. Previously, results could be sorted by Edit date, Creation date, or Relevance. To use the new option, open 'Advanced Search' on the search results page and select 'Alphabetically' under 'Sorting Order'. [https://phabricator.wikimedia.org/T403775]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:28}} community-submitted {{PLURAL:28|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the bug that prevented UploadWizard on Wikimedia Commons from importing files from Flickr has now been fixed. [https://phabricator.wikimedia.org/T419263]
'''Updates for technical contributors'''
* A new special page, [[{{#special:LintTemplateErrors}}]], has been created to list transcluded pages that are flagged as containing lint errors to help users discover them easily. The list is sorted by the number of transclusions with errors. For example: [[{{#special:LintTemplateErrors}}/night-mode-unaware-background-color]]. [https://phabricator.wikimedia.org/T170874]
* Users of the [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] beta feature have been using [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] instead of [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] for syntax highlighting when editing JavaScript, CSS, JSON, Vue and Lua content pages, for some time now. Along with promoting CodeMirror 6 out of beta, the plan is to replace CodeEditor as the standard editor for these content models by May 2026. [[mw:Special:MyLanguage/Help talk:Extension:CodeMirror|Feedback or concerns are welcome]]. [https://phabricator.wikimedia.org/T419332]
* The [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] JavaScript modules will soon be upgraded to CodeMirror 6. Leading up to the upgrade, loading the <code dir=ltr>ext.CodeMirror</code> or <code dir=ltr>ext.CodeMirror.lib</code> modules from gadgets and user scripts was deprecated in July 2025. The use of the <code dir=ltr>ext.CodeMirror.switch</code> hook was also deprecated in March 2025. Contributors can now make their scripts or gadgets compatible with CodeMirror 6. See the [[mw:Special:MyLanguage/Extension:CodeMirror#Gadgets and user scripts|migration guide]] for more information. [https://phabricator.wikimedia.org/T373720]
* The MediaWiki Interfaces team is expanding coverage of REST API module definitions to include [[mw:Special:MyLanguage/API:REST API/Extensions|extension APIs]]. REST API modules are groups of related endpoints that can be independently managed and versioned. Modules now exist for [https://phabricator.wikimedia.org/T414470 GrowthExperiments] and [https://phabricator.wikimedia.org/T419053 Wikifunctions] APIs. As we migrate extension APIs to this structure, documentation will move out of the main MediaWiki OpenAPI spec and REST Sandbox view, and will instead be accessible via module-specific options in the dropdown on the [https://test.wikipedia.org/wiki/Special:RestSandbox REST Sandbox] (i.e., [[{{#Special:RestSandbox}}]], available on all wiki projects).
* The [[mw:Special:MyLanguage/Extension:Scribunto|Scribunto]] extension provides different pieces of information about the wiki where the module is being used via the [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual|mw.site]] library. Starting last week, the library also provides a [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#mw.site.wikiId|way]] of accessing the [[mw:Special:MyLanguage/Manual:Wiki ID|wiki ID]] that can be used to facilitate cross-wiki module maintenance. [https://phabricator.wikimedia.org/T146616]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.20|MediaWiki]]
'''In depth'''
* The [[m:Special:MyLanguage/Coolest Tool Award|2026 Coolest Tool Award]] celebrating outstanding community tools, is now open for nominations! Nominate your favorite tool using the [https://wikimediafoundation.limesurvey.net/435684?lang=en nomination survey] form by 23 March 2026. For more information on privacy and data handling, please see the [[foundation:Special:MyLanguage/Legal:Coolest_Tool_Award_2026_Survey_Privacy_Statement|survey privacy statement]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/12|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W12"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16 mars 2026 à 20:35 (CET)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30260505 -->
== <span lang="en" dir="ltr">Upcoming deployment of CampaignEvents extension to Wikibooks</span> ==
<div lang="en" dir="ltr">
<section begin="message"/>
Hello everyone,
We are writing to inform you that the [[mw:Help:Extension:CampaignEvents|CampaignEvents extension]] will be deployed to all Wikibooks projects during the week of '''23 March 2026'''.
This follows last year’s broader rollout across Wikimedia projects. We realized that Wikibooks was not included at the time, and we’re now addressing that to ensure consistency across all communities.
The CampaignEvents extension provides tools to support event and campaign organization on-wiki, including features like on-wiki event registration and collaboration lists(global event list).
We welcome any questions, feedback, or concerns you may have. We are also happy to support anyone interested in trying out the tools.
''Apologies if this message is not in your preferred language. If you’re able to help translate it for your community, please feel free to do so.''
<section end="message"/>
</div>
<bdi lang="en" dir="ltr">[[User:Udehb-WMF|Udehb-WMF]] ([[User talk:Udehb-WMF|discussion]]) 19 mars 2026 à 19:22 (CET)</bdi>
<!-- Message envoyé par User:Udehb-WMF@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=User:Udehb-WMF/sandbox/MM_target&oldid=30284073 -->
== <span lang="en" dir="ltr">Tech News: 2026-13</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W13"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/13|Translations]] are available.
'''Weekly highlight'''
* Wikimedia site users can now log in without a password using passkeys. This is a secure method supported by fingerprint, facial recognition, or PIN. With this change, all users who opt for passwordless login will find it easier, faster, and more secure to log in to their accounts using any device. The new passkey login option currently appears as an autofill suggestion in the username field. An additional [[phab:T417120|"Log in with passkey" button]] will soon be available for users who have already registered a passkey. This update will improve security and user experience. The [[c:File:Passwordless_login_screencast.webm|screen recording]] demonstrates the passwordless login process step by step.
* [[m:Special:MyLanguage/Tech/Server switch|All wikis will be read-only]] for a few minutes on Wednesday, 25 March 2026 at [https://zonestamp.toolforge.org/1774450800 15:00 UTC]. This is for the datacenter server switchover backup tests, [[wikitech:Deployments/Yearly calendar|which happen twice a year]]. During the switchover, all Wikimedia website traffic is shifted from one primary data center to the backup data center to test availability and prevent service disruption even in emergencies.
'''Updates for editors'''
* Wikimedia site users can now export their notifications older than 5 years using a [[toolforge:echo-chamber|new Toolforge tool]]. This will ensure that users retain their important notifications and avoid them being lost based on the planned change to delete notifications older than 5 years, as previously announced. [https://phabricator.wikimedia.org/T383948]
* Wikipedia editors in Indonesian, Thai, Turkish, and Simple English now have access to Special:PersonalDashboard. This is an [[mw:Special:MyLanguage/Moderator Tools/Dashboard|early version of an experience]] that introduces newer editors to patrolling workflows, making it easier for them to move from making edits to participating in more advanced moderation work on their project. [https://phabricator.wikimedia.org/T402647]
* The [[Special:Block]] now has two minor interface changes. Administrators can now easily perform indefinite blocks through a dedicated radio button in the expiry section. Also, choosing an indefinite expiry provides a different set of common reasons to select from, which can be changed at: [[MediaWiki:Ipbreason-indef-dropdown]]. [https://phabricator.wikimedia.org/T401823]
* Mobile editors [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#Logged-out|at several wikis]] can now see an improved logged-out edit warning, thanks to the recent updates from the Growth team. These changes released last week are part of ongoing efforts and tests to enhance [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|account creation experience on mobile]] and then increase participation. [https://phabricator.wikimedia.org/T408484]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:36}} community-submitted {{PLURAL:36|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the bug that prevented mobile web users from seeing the block information when affected by multiple blocks has been fixed. They can now see messages of all the blocks currently affecting them when they access Wikipedia.
'''Updates for technical contributors'''
* Images built using Toolforge will soon get the upgraded buildpacks version, bringing support for newer language versions and other upstream improvements and fixes. If you use Toolforge Build Service, review the recent [https://lists.wikimedia.org/hyperkitty/list/cloud-announce@lists.wikimedia.org/thread/EMYTA32EV2V5SQ2JIEOD2CL66YFIZEKV/ cloud-announce email] and update your build configuration as necessary to ensure your tools are compatible. [https://wikitech.wikimedia.org/w/index.php?title=Help:Toolforge/Building_container_images&oldid=2392097#Buildpack_environment_upgrade_process][https://phabricator.wikimedia.org/T380127]
* The [https://api.wikimedia.org/wiki/Main_Page API Portal] documentation wiki will shut down in June 2026. API keys created on the API Portal will continue to work normally. api.wikimedia.org endpoints will be deprecated gradually starting in July 2026. Documentation on the API Portal is moving to [[mw:Wikimedia APIs|mediawiki.org]]. Learn more on the [[wikitech:API Portal/Deprecation|project page]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.21|MediaWiki]]
'''In depth'''
* [[m:Special:MyLanguage/WMDE Technical Wishes|WMDE Technical Wishes]] is considering improvements to [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names|automatically generated reference names in VisualEditor]]. Please check out the [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names#Proposed solutions|proposed solutions]] and participate in the [[m:Talk:WMDE Technical Wishes/References/VisualEditor automatic reference names#Request for comment|request for comment]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/13|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W13"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 23 mars 2026 à 17:51 (CET)
<!-- Message envoyé par User:UOzurumba (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30268305 -->
== Actualités techniques n° 2026-14 ==
<section begin="technews-2026-W14"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/14|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* Le version Beta de [[abstract:|Abstract Wikipedia]], un nouveau projet Wikimédia indépendant du langage, a été lancée la semaine dernière. Ce projet permet aux communautés de construire des articles Wikipédia dans leur langue natale, qui peuvent directement être lus par les autres utilisateurs et utilisatrices dans leur propre langage. Le wiki fonctionne grâce à des instructions de Wikifunctions et au contenu structuré issu de Wikidata. [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-03-26|En savoir plus]].
'''Actualités pour la contribution'''
* L'équipe Croissance mène un test A/B afin d'évaluer l'effet d'un message plus clair et plus convivial encourageant à la création de comptes sur les wikis. Actuellement, lorsqu'un utilisateur mobile non connecté lance la modification, un message d'avertissement s'affiche, pouvant paraître abrupt et décourageant. Il présente également la modification par compte temporaire comme option par défaut, au lieu d'inciter à la création d'un compte. Le test est mené sur dix Wikipédia, dont les versions en arabe, français, espagnol et allemand. [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#2. Improve logged-out warning message (T415160)|En savoir plus]].
* L'équipe des applications Wikimédia sollicite vos commentaires sur [[mw:Special:MyLanguage/Wikimedia Apps/Team/Future of Editing on the Mobile Apps|comment devrait fonctionner l'édition dans les applications mobiles Wikipédia]]. La discussion porte sur l'amélioration de l'accès aux outils d'édition lorsque les utilisateurs appuient sur « Modifier ». Cette initiative s'inscrit dans un effort plus large visant à offrir aux lecteurs intéressés par la contribution une expérience utilisateur plus intuitive.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:45|la tâche soumise|les {{formatnum:45}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:45||s}} la semaine dernière]]. Par exemple, un problème avec la récupération de citations à partir du site d'archive de journaux [https://www.newspapers.com Newspapers.com], qui ne fonctionnait plus en raison d'un blocage des requêtes [[mw:Special:MyLanguage/Citoid|Citoid]], a maintenant été résolu. [https://phabricator.wikimedia.org/T419903]
'''Actualités pour la contribution technique'''
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.46/wmf.22|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/14|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W14"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 30 mars 2026 à 21:25 (CEST)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30329462 -->
== Action Required: Update templates/modules for electoral maps (Migrating from P1846 to P14226) ==
Hello everyone,
This is a notice regarding an ongoing data migration on Wikidata that may affect your election-related templates and Lua modules (such as <code>Module:Itemgroup/list</code>).
'''The Change:'''<br />
Currently, many templates pull electoral maps from Wikidata using the property [[:d:Property:P1846|P1846]], combined with the qualifier [[:d:Property:P180|P180]]: [[:d:Q19571328|Q19571328]].
We are migrating this data (across roughly 4,000 items) to a newly created, dedicated property: '''[[:d:Property:P14226|P14226]]'''.
'''What You Need To Do:'''<br />
To ensure your templates and infoboxes do not break or lose their maps, please update your local code to fetch data from [[:d:Property:P14226|P14226]] instead of the old [[:d:Property:P1846|P1846]] + [[:d:Property:P180|P180]] structure. A [[m:Wikidata/Property Migration: P1846 to P14226/List|list of pages]] was generated using Wikimedia Global Search.
'''Deadline:'''<br />
We are temporarily retaining the old data on [[:d:Property:P1846|P1846]] to allow for a smooth transition. However, to complete the data cleanup on Wikidata, the old [[:d:Property:P1846|P1846]] statements will be removed after '''May 1, 2026'''. Please update your modules and templates before this date to prevent any disruption to your wiki's election articles.
Let us know if you have any questions or need assistance with the query logic. Thank you for your help! [[User:ZI Jony|ZI Jony]] using [[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 3 avril 2026 à 19:11 (CEST)
<!-- Message envoyé par User:ZI Jony@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29941252 -->
== Actualités techniques n° 2026-15 ==
<section begin="technews-2026-W15"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/15|D’autres traductions]] sont disponibles.
'''Actualités pour la contribution'''
* L’[[mw:Special:MyLanguage/Help:Extension:CampaignEvents|extension CampaignEvents]] comprend désormais une nouvelle fonctionnalité de définition d’objectifs de groupe, permettant aux organisateurs de définir et de suivre les objectifs de l’événement, tels que le nombre d’articles créés et de contributeurs participants en temps réel. De même, les participants peuvent travailler vers des cibles communes et voir leur impact collectif au fur et à mesure que l’événement se déroule. Cette fonctionnalité est désormais disponible sur tous les wikis Wikimedia. Pour en savoir plus, consultez [[mw:Special:MyLanguage/Help:Extension:CampaignEvents/Registration/Collaborative contributions#Goal setting|la documentation]].
* [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Concerne un souhait]] La nouvelle fonctionnalité d'[[mw:Special:MyLanguage/Help:Watchlist labels|étiquettes de liste de suivi]] (annoncée dans les [[m:Special:MyLanguage/Tech/News/2026/07|Actualités techniques 2026-07 ]]) est désormais disponible via l'ÉditeurVisuel, l'éditeur de code et l'«étoile de suivi»(ou le lien de suivi, pour les habillages qui n'ont pas d'icône d'étoile). Auparavant, il n'était possible d'attribuer des étiquettes que via [[Special:EditWatchlist|Modifier la liste de suivi]]. Dans ces trois emplacements, il s'agit d'un nouveau champ situé après le champ d'expiration.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:23|la tâche soumise|les {{formatnum:23}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:23||s}} la semaine dernière]]. Par exemple, le problème où les pages de discussion sur mobile avec Parsoid sont inutilisables après les en-têtes de section vides, a maintenant été résolu. [https://phabricator.wikimedia.org/T419171]
'''Actualités pour la contribution technique'''
* La [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|fonctionnalité de sous-référencement]], qui permet aux contributeurs d'ajouter des détails à une référence existante sans la dupliquer, sera progressivement déployée sur [[phab:T414094|davantage de wikis]] plus tard cette année. Les wikis utilisant le gadget [[mw:Special:MyLanguage/Reference Tooltips|Reference Tooltips]] sont encouragés à mettre à jour leur version (généralement sur [[m:MediaWiki:Gadget-ReferenceTooltips.js|MediaWiki:Gadget-ReferenceTooltips.js]] comme indiqué [https://en.wikipedia.org/w/index.php?diff=1344408362 ici]) pour assurer la compatibilité. D'autres gadgets liés aux références pourraient également être affectés. [https://phabricator.wikimedia.org/T416304]
* Toutes les éditions de Wikinews seront fermées et passeront en mode lecture seule le 4 mai 2026. Le contenu restera accessible, mais aucune nouvelle modification ni aucun nouvel article ne pourra être ajouté. Cette fermeture a été approuvée par le Conseil d'administration de la Fondation Wikimedia à la suite de discussions prolongées. [[m:Wikimedia Foundation Board noticeboard#Board of Trustees Approves Closure of Wikinews|En savoir plus]].
* L'[[:mw:Special:MyLanguage/API:Action API|API d'action]] a proposé plusieurs formats pour les résultats demandés. L'un d'entre eux, <bdi lang="zxx" dir="ltr"><code><nowiki>format=php</nowiki></code></bdi>, sera bientôt supprimé. Veuillez vous assurer que vos scripts ou robots utilisent le [[mw:Special:MyLanguage/API:Data formats#Output|format JSON]]. Cette suppression devrait affecter très peu de scripts et de robots. [https://phabricator.wikimedia.org/T118538]
* La page [[Special:NamespaceInfo|Special:NamespaceInfo]] inclut désormais les alias d'espace de noms. Par exemple «WP» pour l'espace de noms ''Projet'' (''Wikipédia'') sur la Wikipédia en allemand. [https://phabricator.wikimedia.org/T381455]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.46/wmf.23|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/15|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W15"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 6 avril 2026 à 18:19 (CEST)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30362761 -->
== <span lang="en" dir="ltr">Tech News: 2026-16</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W16"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/16|Translations]] are available.
'''Weekly highlight'''
* Experienced editors are invited to [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Main_Page test] the [[mw:Special:MyLanguage/Article guidance|Article guidance]] feature, designed to help less-experienced editors create well-structured, policy-compliant Wikipedia articles. Testing instructions are [[mw:Special:MyLanguage/Article guidance/Test feature guide|available]]. Also, after reviewing [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Category:Pages_using_article_guidance the outlines], please provide feedback on the [[mw:Talk:Article guidance|project talk page]]. Based on your input, the feature will be refined and transferred to the pilot Wikipedias to translate and adapt. Check out [[c:File:Article Guidance workflow demo - April 2026.webm|the video]] explaining the feature.
'''Updates for editors'''
* On most wikis, all autoconfirmed users can now use [[Special:ChangeContentModel|Special:ChangeContentModel]] page to [[mw:Special:MyLanguage/Help:ChangeContentModel|create new pages with custom content models]], such as mass message lists, making custom page formats more accessible. Check [[Special:ListGroupRights|Special:ListGroupRights]] for the status of your wiki. [https://phabricator.wikimedia.org/T248294]
* The Growth team has launched an [[mw:Special:MyLanguage/Contributors/Account_Creation_Experiments|account creation experiment]] to evaluate whether adding an account creation button to the mobile web header increases new account registrations and encourages more mobile users to contribute to the wikis. The experiment is currently live on Hindi, Indonesian, Bengali, Thai, and Hebrew Wikipedia, and targets 10% of logged-out mobile web users.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:30}} community-submitted {{PLURAL:30|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where VisualEditor could get stuck loading on Windows devices with animations turned off, has now been fixed. [https://phabricator.wikimedia.org/T382856]
'''Updates for technical contributors'''
* Starting later this week, {{int:group-abusefilter}} who have the [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] beta feature enabled will have [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] instead of [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] as the editor at [[Special:AbuseFilter|Special:AbuseFilter]]. This is part of the broader effort to make the user experience more consistent across all editors. [https://phabricator.wikimedia.org/T399673][https://phabricator.wikimedia.org/T419332]
* Tools and bots that access the [[mw:Special:MyLanguage/Notifications/API|Notifications API]] (<bdi lang="zxx" dir="ltr"><code><nowiki>action=query&meta=notifications</nowiki></code></bdi>) will need to update their OAuth or BotPassword grants to also include access to private notifications. [https://phabricator.wikimedia.org/T421991]
* Due to a library upgrade, listings on category pages may be displayed out of order starting on Monday, 20th April. A migration script will be run to correct this, and will take hours to days depending on the size of the wiki (up to a week for English Wikipedia). [https://phabricator.wikimedia.org/T422544]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.24|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/16|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W16"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 13 avril 2026 à 17:19 (CEST)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30380527 -->
== Actualités techniques n° 2026-17 ==
<section begin="technews-2026-W17"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/17|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* Après deux ans de développement, la version [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]], également connue sous le nom de [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror 6]], sortira de sa phase bêta le mardi 21 avril. Elle offrira une meilleure lisibilité du code et du wikitext, une réduction des fautes de frappe et d'autres [[mw:Special:MyLanguage/Help:Extension:CodeMirror|avantages]] à tous les utilisateurs du surligneur de syntaxe standard. Un grand merci au bénévole [https://phabricator.wikimedia.org/p/Bhsd/ Bhsd] qui a développé de nombreuses nouvelles fonctionnalités, notamment [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Code folding|le repliement de code]], [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Autocompletion|la saisie semi-automatique]] et [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Linting|l'analyse statique du code]]. [https://phabricator.wikimedia.org/T259059]
* Une mise à jour majeure de l'application Wikipédia pour iOS est en cours de déploiement, en restructurant l'interface pour s'harmoniser avec le tout nouveau design visuel "Liquid Glass" d'Apple. [https://apps.apple.com/us/app/wikipedia/id324715238 Télécharger la dernière version] et découvrez les nouveautés.
'''Actualités pour la contribution'''
* [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4 Reading lists|Les listes de lecture]] est une fonctionnalité qui permet aux lecteurs d'enregistrer des articles dans une liste pour les lire ultérieurement. Cette fonctionnalité est actuellement en version bêta sur les Wikipédias en arabe, français, indonésien, vietnamien et chinois, et activée par défaut pour tous les nouveaux comptes sur toutes les Wikipédias.
* Une expérimentation visant à étendre [[mw:Special:MyLanguage/Readers/Reader Growth/Mobile page previews|les aperçus de page au web mobile]] sera lancée la semaine du 20 avril sur les versions arabe, anglaise, française, italienne, polonaise et vietnamienne de Wikipédia. Les aperçus de page sont des fenêtres contextuelles affichant une miniature, un premier paragraphe et un lien bleu permettant d'ouvrir l'article complet, facilitant ainsi la découverte de contenu. Cette fonctionnalité est déjà disponible sur ordinateur et dans les applications. [[m:Special:MyLanguage/List of experiments in Product and Technology#Template|En savoir plus sur cette expérimentation et d'autres]].
* Sur plusieurs wikis, les contributeurs connectés qui n'ont pas [[mw:Special:MyLanguage/Help:Email confirmation|confirmé leur adresse électronique]] peuvent désormais voir une bannière les invitant à le faire. La confirmation de l'adresse électronique permet à un utilisateur de récupérer l'accès à son compte en cas de perte. [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security#Encouraging users to confirm their email addresses|En savoir plus]]. [https://phabricator.wikimedia.org/T421366]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:15|la tâche soumise|les {{formatnum:15}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:15||s}} la semaine dernière]]. Par exemple, un problème qui entraînait des ralentissements lors de la modification de très grandes pages wiki dans l'éditeur wikitext de 2017, des problèmes de chargement, de prévisualisation et de défilement, ainsi que des problèmes de performance lors de la sélection, de la découpe ou du collage de contenu, a maintenant été résolu. [https://phabricator.wikimedia.org/T184857]
'''Actualités pour la contribution technique'''
* Dans le cadre de la promotion de [[mw:Special:MyLanguage/Help:Extension:CodeMirror|CodeMirror]] à partir d'une fonctionnalité bêta, tous les utilisateurs se serviront de [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] au lieu de [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] pour la coloration syntaxique lors de l'édition de pages de contenu JavaScript, CSS, JSON, Vue et Lua. [https://phabricator.wikimedia.org/T419332]
* <span class="mw-translate-fuzzy">Le service <code>mirrors.wikimedia.org</code> pour les utilisateurs de Debian et Ubuntu sera définitivement arrêté le 15 mai. Le matériel du serveur sera remplacé par des solutions plus performantes. Certains utilisateurs devront peut-être migrer vers un autre serveur qui ne devra prendre qu'une minute. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/LJYRIS4WB66HIRCAO4GIDTXCMDVZRBMA/ Vous pouvez en savoir plus].</span> [https://phabricator.wikimedia.org/T416707]
* Les tables <bdi lang="zxx" dir="ltr"><code><nowiki>image</nowiki></code></bdi> et <bdi lang="zxx" dir="ltr"><code><nowiki>oldimage</nowiki></code></bdi> seront supprimées de [[wikitech:Help:Wiki Replicas|wikireplicas]]. Si vos outils ou requêtes accèdent directement à <bdi lang="zxx" dir="ltr"><code><nowiki>image</nowiki></code></bdi> ou <bdi lang="zxx" dir="ltr"><code><nowiki>oldimage</nowiki></code></bdi>, veuillez les mettre à jour pour utiliser les tables <bdi lang="zxx" dir="ltr"><code><nowiki>file</nowiki></code></bdi> et <bdi lang="zxx" dir="ltr"><code><nowiki>filerevision</nowiki></code></bdi> avant le 28 mai. [https://phabricator.wikimedia.org/T28741]
* Suite à la récente mise en place de limites de débit globales pour les API non identifiées, la Fondation Wikimedia poursuit ses efforts pour garantir [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|une utilisation équitable de l'infrastructure]] en appliquant des limites globales au trafic des API identifiées à partir de la dernière semaine d'avril. Ces limites sont volontairement fixées au niveau le plus élevé possible afin de minimiser l'impact sur la communauté. Les bots exécutés dans Toolforge/WMCS ou disposant des droits d'utilisateur de bot sur un wiki ne devraient pas être affectés pour le moment. Toutefois, il est conseillé à tous les développeurs de suivre les bonnes pratiques mises à jour. Pour plus d'informations, consultez la page [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|API Wikimedia/Limites de débit]] et la [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits/FAQ|Foire aux questions]].
* L'[[mw:Special:MyLanguage/Attribution API|API d'attribution]] est désormais disponible en [[mw:Special:MyLanguage/Wikimedia APIs/Stability policy|version bêta]]. Elle récupère les informations nécessaires pour créditer les articles et les fichiers multimédias de Wikimedia, quel que soit leur lieu d'utilisation. La documentation de référence est disponible sur la page dédiée au Sandbox REST, accessible sur tous les wikis Wikimedia (comme [https://en.wikipedia.org/w/index.php?api=attribution.v0-beta&title=Special%3ARestSandbox le sandbox REST de Wikipédia en anglais]). N'hésitez pas à partager vos commentaires sur la [[mw:Talk:Attribution API|page de discussion du projet]].
* Il n'y aura pas de nouvelle version de MediaWiki cette semaine.
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/17|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W17"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20 avril 2026 à 17:00 (CEST)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30432763 -->
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[Utilisateur:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussion utilisateur:MediaWiki message delivery|discussion]]) 26 avril 2026 à 02:57 (CEST)
</bdi>
<!-- Message envoyé par User:Codename Noreste@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 -->
== Actualités techniques n° 2026-18 ==
<section begin="technews-2026-W18"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/18|D’autres traductions]] sont disponibles.
'''Actualités pour la contribution'''
* Un changement dans la manière dont les utilisateurs et utilisatrices sont automatiquement confirmés est en cours pour améliorer la protection contre le vandalisme. Actuellement, il suffit d’avoir un compte depuis quelques jours avec quelques contributions pour être ajouté au groupe [[{{int:grouppage-autoconfirmed/{{CONTENTLANGUAGE}}}}|{{int:group-autoconfirmed}}]]. Cette configuration tend à être exploitée par certains vandales qui créent des comptes et commencent à les utiliser après un certain temps. Pour réduire ce problème, la configuration va changer la semaine prochaine afin que l’âge du compte minimum pour être confirmé automatiquement ne soit calculé qu’à partir de la première modification, au lieu de la date d’inscription. L’âge minimum du compte restera le même, c’est seulement le point de départ pour calculer cet âge qui change. Ce changement ne sera déployé que sur les wikis qui nécessitent au moins une contribution pour satisfaire les conditions de confirmation automatique. [https://phabricator.wikimedia.org/T418484]
* Tous les utilisateurs et utilisatrices de Wikipédia avec un nouveau compte et ceux qui ont activé l’option « activer automatiquement la plupart des fonctionnalités bêta » peuvent désormais utiliser la fonctionnalité bêta de [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4 Reading lists|listes de lecture]] pour enregistrer des articles à lire plus tard. Cela permet d’organiser les lectures qui nous intéressent à un endroit unique pour y accéder facilement.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:30|la tâche soumise|les {{formatnum:30}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:30||s}} la semaine dernière]]. Par exemple, le problème avec les images d’infoboite qui avaient une marge intérieure immense dans Firefox a été corrigé. [https://phabricator.wikimedia.org/T423676]
'''Actualités pour la contribution technique'''
* Pour rappel, la limite globale d’accès à l’API sera appliquée cette semaine pour identifier le trafic de l’API. Le but est d’aider à garantir un [[mw:MediaWiki Product Insights/Responsible Reuse|accès équitable à l’infrastructure]]. Les robots qui s’exécutent dans Toolforge ou WMCS, ou avec le droit utilisateur ''robot'' sur les wikis, ne devraient pas être affectés pour le moment. Cependant, il est conseillé à tous les développeurs et développeuses de se conformer aux nouvelles bonnes pratiques à suivre. Pour plus d’informations, notamment la limite globale d’accès effective, consultez [[mw:Wikimedia APIs/Rate limits|la page sur la limite d’accès des API de Wikimedia]] et les [[mw:Wikimedia APIs/Rate limits/FAQ|questions-réponses]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.46/wmf.26|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/18|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W18"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 27 avril 2026 à 20:06 (CEST)
<!-- Message envoyé par User:UOzurumba (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30458046 -->
== Actualités techniques n° 2026-19 ==
<section begin="technews-2026-W19"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/19|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* L’équipe chargée des fonctionnalités de [[mw:Special:MyLanguage/Article guidance|Guidage des articles]] invite les contributeurs et contributrices expérimentés des [[mw:Special:MyLanguage/Article guidance/Pilot wikis and collaborators|Wikipédia pilotes]] (arabe, bangla, japonais, portugais, persan, turc, anglais simplifié, espagnol et français) à contribuer à la traduction et à l’adaptation des [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Category:Pages_using_article_guidance exemples de trames d’articles]. Ces trames guideront les contributeurs dans la création d’articles clairs, bien structurés et conformes aux règles lors de l’utilisation de [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Special:NewArticle la fonctionnalité] dès son lancement en mai 2026. Des [[mw:Special:MyLanguage/Article guidance#Adapting a sample outline in a Wikipedia|instructions simples]] expliquant comment traduire et adapter ces trames sont disponibles.
'''Actualités pour la contribution'''
* Le [[:m:Special:MyLanguage/Product and Technology Advisory Council|Conseil consultatif sur les produits et les technologies]] a publié [[:m:Special:MyLanguage/Product and Technology Advisory Council/May 2026 draft PTAC recommendation for feedback|une proposition de recommandation]] d’une procédure type que les organisations affiliées à Wikimedia pourraient suivre pour contribuer au domaine technique. Les membres de la communauté sont invités à donner leur avis sur cette recommandation avant le 8 mai [[:m:Talk:Product and Technology Advisory Council/May 2026 draft PTAC recommendation for feedback|sur la page de discussion]].
* Le nombre de préférences de taille de la miniature disponibles dans MediaWiki va être réduit à trois options standardisées : ''petite'' (180 px), ''moyenne'' (250 px) et ''large'' (400 px), dans le cadre du travail en cours pour améliorer les performances et réduire la pression sur les services de miniatures. Par conséquent, les préférences existantes seront automatiquement adaptées à la nouvelle taille la plus proche (par exemple, les petites tailles comme 120 px ou 150 px s’afficheront à 180 px, tandis que les grandes tailles comme 300 px ou 360 px s’afficheront à 400 px). L’interface des préférences sera bientôt mise à jour pour refléter ces changements, et les utilisateurs qui souhaitent s’y opposer ou donner leur avis peuvent le faire. [https://phabricator.wikimedia.org/T424909]
* Dorénavant, même lorsqu’une permission expire automatiquement, les utilisateurs recevront une notification Echo similaire à la notification normale pour les changements de permissions. Quant au [[m:Special:MyLanguage/Global reminder bot|robot global de rappel]], il continue de prévenir les utilisateurs une semaine ''avant'' que leurs droits ne soient sur le point d’expirer, afin qu’ils puissent les faire renouveler.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:32|la tâche soumise|les {{formatnum:32}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:32||s}} la semaine dernière]]. Par exemple, le problème du sélecteur de langue ULS dans [[m:Special:Translate|Special:Translate]] qui faisait défiler verticalement alors qu’il ne devait pas, a été résolu. Auparavant, lorsque les utilisateurs ouvraient le menu déroulant « Traduire en français » et commençaient à saisir le nom d’une langue, la boîte de dialogue défilait verticalement de quelques pixels même lorsqu'il y avait suffisamment d’espace pour afficher tous les résultats. Le menu déroulant ne se déplace plus inutilement lors du filtrage des langues. [https://phabricator.wikimedia.org/T358864]
* La [[m:Special:GlobalWatchlist|liste de suivi globale]], qui vous permet de consulter vos listes de suivi provenant de plusieurs wikis sur une seule page, continue de s’améliorer. Par exemple, les listes de suivi pour les sites avec Wikibase tels que [[:d:|Wikidata]] prennent désormais en charge les éléments [[mw:Special:MyLanguage/Extension:EntitySchema|EntitySchema]] pour un meilleur suivi. Le mode Mises à jour en direct actualise désormais la page spéciale toutes les 60 secondes afin de se conformer aux [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|nouvelles limites globales d’accès à l’API]] pour une meilleure réactivité en temps réel. Par ailleurs, un bug de directionnalité du texte qui affichait les liens comme « changements 3 » au lieu de « 3 changements » dans les listes à directions mixtes a été corrigé. [https://phabricator.wikimedia.org/T415450][https://phabricator.wikimedia.org/T424422][https://phabricator.wikimedia.org/T418091]
'''Actualités pour la contribution technique'''
* La deuxième phase de [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|limitations globales d’accès à l’API]] a été déployée pour réduire l’[[diffblog:2026/03/26/quo-vadis-crawlers-progress-and-whats-next-on-safeguarding-our-infrastructure/|impact des robots IA]] et assurer un accès équitable et durable aux ressources de Wikimedia, en donnant la priorité au trafic humain et conforme à notre mission. Les [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits#Limits|limites]] ne s’appliquent plus par heure mais par minute, produisant une meilleure répartition dans les structures de trafic ainsi qu’une meilleure prévisibilité de la charge de l’API. Les utilisateurs de la communauté ne devraient pas être affectés, et aucune action n’est requise. Les premières indications montrent que certains requérants basés sur l'agent utilisateur ajustent leur comportement, et environ 64 % du trafic API automatisé a été identifié. La surveillance continue, et Wikimedia Enterprise reste disponible pour l’assistance commerciale.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.46/wmf.27|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/19|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W19"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 4 mai 2026 à 22:43 (CEST)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30498077 -->
== Actualités techniques n° 2026-20 ==
<section begin="technews-2026-W20"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/20|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* La Communauté Technique a publié [[m:Special:MyLanguage/Community Wishlist/How to write a good wish|de nouvelles directives]] expliquant comment les souhaits sur la Liste de souhaits de la communauté sont triés et priorisés. La documentation vise à aider les contributeurs à rédiger des propositions plus solides en clarifiant les facteurs qui influencent les décisions de priorisation. Au-delà du nombre de votes, les directives mettent en avant des considérations telles que l'impact potentiel sur la communauté pour déterminer quels souhaits avanceront.
'''Actualités pour la contribution'''
* L'équipe de croissance des lecteurs lance une expérience pour tester une nouvelle [[mw:Special:MyLanguage/Readers/Reader_Growth/Share_Card|fonctionnalité de Partage de Carte]] qui permet aux lecteurs de créer des cartes visuellement attrayantes à partir d'articles Wikipédia ou de sections d'articles sélectionnées et de les partager en ligne, chaque carte renvoyant à l'article original afin d'aider à augmenter le lectorat et la découverte des articles. Le test A/B réservé aux mobiles ne sera disponible qu'à une partie des lecteurs sur les Wikipédia en arabe, chinois, français, vietnamien et anglais afin de mieux comprendre les habitudes de lecture et de partage, et est prévu pour commencer la semaine du 18 mai pour une durée de quatre semaines.
* Les applications Wikipedia pour Android et iOS ont récemment publié en version bêta le [[mw:Special:MyLanguage/Wikimedia_Apps/Team/25th_Birthday_Reading_Challenge|défi de lecture de 25 jours]], dans le cadre des efforts visant à stimuler l'engagement des lecteurs en encourageant les utilisateurs à atteindre des objectifs de lecture. Pour suivre leur série de lectures pendant le défi, les utilisateurs de l'application peuvent ajouter un widget avec Baby Globe à leur écran d'accueil. Le défi commence officiellement le 11 mai.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:17|la tâche soumise|les {{formatnum:17}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:17||s}} la semaine dernière]]. Par exemple, un problème où la préférence globale pour activer la coloration syntaxique dans le wikitexte pouvait s'éteindre de manière inattendue après avoir été activée a maintenant été corrigé. [https://phabricator.wikimedia.org/T425286]
'''Actualités pour la contribution technique'''
* [[File:Octicons-tools.svg|12px|link=|alt=|Sujet technique]] Le module ResourceLoader <bdi lang="zxx" dir="ltr"><code><nowiki>mediawiki.ui.input</nowiki></code></bdi>, obsolète depuis [[m:Special:MyLanguage/Tech/News/2023/39|septembre 2023]], sera supprimé cette semaine. Il existe un [[mw:Special:MyLanguage/Codex/Migrating_from_MediaWiki_UI|guide pour migrer de l’interface MediaWiki UI vers Codex]] pour tous les outils qui l’utilisent. [https://phabricator.wikimedia.org/T420125]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.47/wmf.2|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/20|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W20"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 11 mai 2026 à 21:20 (CEST)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30524429 -->
== Actualités techniques n° 2026-21 ==
<section begin="technews-2026-W21"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/21|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* L'équipe de Wikipédia abstraite a identifié cinq wikis pilotes potentiels pour évaluer leur intérêt à adopter des articles abstraits sur leurs wikis. Les pilotes sont Wikipédia en Malayalam, en Bengali, en Dagbani, en Arabe et en Indonésien. La période de retour d'information sera ouverte jusqu'au 22 mai. Si votre communauté est intéressée à devenir un pilote, [[m:Talk:Abstract Wikipedia|faites-nous savoir sur Meta]].
'''Actualités pour la contribution'''
* Une expérience visant à afficher [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|les listes de lecture]] aux lecteurs non connectés sur le web mobile sera lancée le 18 mai sur les Wikipédias Allemande, Espagnole, Italienne, Portugaise, Polonaise, Néerlandaise, Turque et Ourdou, et durera un mois. Cet effort soutient des objectifs plus larges consistant à aider les lecteurs à enregistrer et organiser des articles pour une lecture ultérieure, tout en encourageant des habitudes qui pourraient mener à de futures contributions sur Wikipédia.
* Pour prendre en charge un bouton de marquage dans la fonctionnalité bêta Liste de lecture, le menu "Outils > Action" a été mis à jour pour afficher des icônes, y compris l'indicateur en forme d'étoile de suivi qui aide les éditeurs à identifier les articles suivis temporairement. Les icônes correspondent désormais également à celles utilisées sur mobile, améliorant la cohérence entre les plateformes. Le changement est actuellement limité au menu des actions et concerne principalement les éditeurs ayant des droits d'utilisateur privilégié. [https://phabricator.wikimedia.org/T426008]
* [[mw:Special:MyLanguage/VisualEditor/Suggestion Mode|Mode de Suggestion]] a été publié en tant qu'[[w:en:A/B test|test A/B]] pour les nouveaux éditeurs sur le site mobile à [[phab:T421189|~15 Wikipédias]]. L'expérience mesurera l'impact que le Mode de Suggestion a sur la proportion de sessions d'édition sur le web mobile par des nouveaux éditeurs qui aboutissent à des modifications constructives (non annulées) des articles. L'expérience évaluera également l'impact de la fonctionnalité sur la rétention des éditeurs et surveillera les changements dans les taux d'annulation et de blocage.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:27|la tâche soumise|les {{formatnum:27}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:27||s}} la semaine dernière]]. Par exemple, un problème dans l'application Android de Wikipédia où les images pourraient parfois ne pas se charger après avoir ouvert une notification de liste de lecture recommandée, a maintenant été corrigé. [https://phabricator.wikimedia.org/T418231]
'''Actualités pour la contribution technique'''
* L'[[mw:Special:MyLanguage/Wikidata Platform|équipe de la Plateforme Wikidata]] a publié sa [[d:Special:MyLanguage/Wikidata:SPARQL query service/WDQS backend update/Backend Replacement|recommandation de remplacement du backend]] et l'[[wikitech:Wikidata Query Service/WDQS Architecture re-design|architecture technique]] qui l'accompagne pour la migration du Wikidata Query Service (WDQS) hors de Blazegraph grap. Les retours sont attendus jusqu'au 25 mai 2026, en particulier sur les éventuelles lacunes et impacts sur les cas d'utilisation avancés. Les membres de la communauté Wikidata et les utilisateurs de WDQS sont également encouragés à aider à identifier les outils et flux de travail à fort impact qui pourraient nécessiter une attention sur [[d:Wikidata:SPARQL query service/WDQS backend update/High-Impact Use Cases|cette page]]. Les retours peuvent être partagés sur la [[d:Wikidata talk:SPARQL query service/WDQS backend update|page de discussion de la migration]] ou lors de la [[d:Special:MyLanguage/Wikidata:Blazegraph Migration Office Hours|prochaine heure de bureau]]. Voir le [[d:Special:MyLanguage/Wikidata:Wikidata Platform team/Newsletter|bulletin de l'équipe WDP]] pour plus de détails.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.47/wmf.3|MediaWiki]]
'''En détails'''
* Sur les Wikipédia en anglais, en français, en japonais et quelques autres, il y a eu un [[diffblog:2025/09/02/better-detecting-bots-and-replacing-our-captcha/|essai de hCaptcha]], un service tiers de détection de robots. L'essai a montré que hCaptcha détecte et dissuade efficacement certaines activités automatisées de mauvaise foi, à la fois par lui-même et en donnant des signaux aux [[w:en:Wikipedia:Village pump (technical)/Archive 225#Introducing SuggestedInvestigations|checkusers et stewards]] pour qu'ils enquêtent. Comme les résultats étaient positifs, hCaptcha sera déployé sur toutes les wikis au cours des prochaines semaines. [[mw:Special:MyLanguage/Product Safety and Integrity/Anti-abuse signals/hCaptcha|Voir la page du projet hCaptcha]] pour des informations techniques sur la mise en œuvre et les protections de la vie privée. [[diffblog:2026/05/04/better-detecting-bots-and-replacing-our-captcha-part-2/|En savoir plus]].
* La dernière mise à jour de la Technologie communautaire est désormais disponible, avec des progrès dans plusieurs initiatives de la Liste de souhaits communautaire, y compris l'extension des listes de lecture de l'application mobile au site web, la prise en charge de nouvelles langues pour "Who Wrote That" et le Tableau de bord personnel, des améliorations du rendu 3D et des graphiques, ainsi que des travaux à venir sur le tri des pages de discussion, la lecture audio et les flux de travail d'édition. La mise à jour partage également les priorités actuelles, les tendances de l'état de la Liste de souhaits et les opportunités de retour d'information de la communauté sur les domaines de concentration futurs et le Plan annuel 2026–2027 de la Wikimedia Foundation. [[m:Special:MyLanguage/Community Wishlist/Updates#May 13, 2026: Latest updates from the Community Tech team|Lisez le bulletin d'information complet pour plus de détails]].
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/21|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W21"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18 mai 2026 à 22:21 (CEST)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30539262 -->
== Actualités techniques n° 2026-22 ==
<section begin="technews-2026-W22"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/22|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* Faisant suite à une [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#LOWM|expérience fructueuse sur la création de comptes]], un message d'avertissement pour les personnes déconnectées sera déployé sur les wikis Wikimédia durant la première semaine de juin. Ce changement n'affectera que les personnes déconnectées sur l'interface web mobile qui commencent à modifier. Cette nouvelle expérience est faite pour encourager la création de comptes, tout en autorisant aux utilisateurs de modifier à l'aide de comptes temporaires. Les résultats de l'expérience ont montré une augmentation de la création de compte d'environ 27 % pour ceux ayant vu le nouveau message. Comme prévu, puisque plus de personnes créent un compte, la création de comptes temporaires a diminué de 16 %. L'expérience n'a pas montré d'autres changements sur la qualité des modifications ou sur les autres indicateurs surveillés. [https://phabricator.wikimedia.org/T424595]
'''Actualités pour la contribution'''
* Pour des raisons de sécurité, les membres de certains groupes d’utilisateurs sont [[m:Special:MyLanguage/Mandatory two-factor authentication for users with some extended rights|forcés d'avoir l'authentification à 2 facteurs]] (A2F) d'activée. Les membres de ces groupes seront dans l'impossibilité de désactiver la dernière méthode d'A2F sur leur compte, et il sera impossible d'ajouter des utilisateurs sans A2F à ces groupes. Ces utilisateurs auront toujours la possibilité d'ajouter ou d'enlever des nouvelles méthodes d'authentification, tant qu'une de ces méthodes est toujours activée. Dans les prochaines semaines, les utilisateurs sans A2F seront retirés de ces groupes. Cela s'applique entre autres aux bureaucrates. Veuillez lire les tâches liées pour les dates de déploiement. [https://phabricator.wikimedia.org/T423119][https://phabricator.wikimedia.org/T423120]
* L'[[m:Special:MyLanguage/WMDE Technical Wishes|équipe des souhaits techniques de Wikimédia Allemagne (WMDE)]] va lancer un [[w:fr:Test A/B|test A/B]] sur [[:phab:T415904|10 wikis]], pour essayer des [[m:WMDE Technical Wishes/References/Reference Previews|améliorations potentielles pour les aperçus de références]]. Cette expérience durera environ 2 semaines à la fin mai ou début juin et affectera 10 % du lectorat sur ordinateur sur les wikis participants.
* Après deux expériences fructueuses, l'équipe Croissance du lectorat déploiera une fonctionnalité de [[mw:Special:MyLanguage/Readers/Reader Growth/Image Browsing|visionnage d'images]] en bêta pour toutes les Wikipédia sur mobile le 25 mai. Cela veut dire que toutes les personnes ayant les fonctionnalités bêtas activées verront cette fonctionnalité. Les autres pourront l’activer dans leurs préférences. Cette fonctionnalité inclura un carrousel de toutes les images d'un article en haut de celui-ci, avec la possibilité pour les contributeurs d’[[mw:Readers/Reader_Growth/Image_Browsing#Phase_2.1_beta_feature|exclure des images du carrousel d'un article ou d'enlever la fonctionnalité pour l'entièreté de l'article]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:30|la tâche soumise|les {{formatnum:30}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:30||s}} la semaine dernière]]. Par exemple, les fichiers STL tridimensionnels étaient affichés incorrectement par l'extension 3D du lecteur multimédia, ce qui est maintenant corrigé. [https://phabricator.wikimedia.org/T416723]
'''Actualités pour la contribution technique'''
* Les classes CSS dépréciées <bdi lang="zxx" dir="ltr"><code><nowiki>tleft</nowiki></code></bdi> et <bdi lang="zxx" dir="ltr"><code><nowiki>tright</nowiki></code></bdi> ont été remplacées par <bdi lang="zxx" dir="ltr"><code><nowiki>floatleft</nowiki></code></bdi> et <bdi lang="zxx" dir="ltr"><code><nowiki>floatright</nowiki></code></bdi> car les premières ne fonctionnent pas correctement sur toutes les plateformes, dont l'interface web mobile et l'application mobile. Les projets se servant de ces classes sont encouragés à vérifier leur usage et à planifier leur migration. Sachez que <bdi lang="zxx" dir="ltr"><code><nowiki>floatleft</nowiki></code></bdi> et <bdi lang="zxx" dir="ltr"><code><nowiki>floatright</nowiki></code></bdi> pourraient aussi être dépréciées dans le futur, même s’il n'y a pas de calendrier défini. [[phab:T426452|En savoir plus]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.47/wmf.4|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/22|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W22"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 25 mai 2026 à 23:52 (CEST)
<!-- Message envoyé par User:Quiddity (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30584502 -->
== Votez maintenant aux élections 2026 de l'U4C ==
<section begin="announcement-content" />
Les votants éligibles sont invités à participer à l'élection 2026 du [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Comité de coordination du Code de conduite universel]]. De plus amples informations – notamment sur la vérification de l'éligibilité, le processus de vote, les candidats et un lien vers le scrutin – sont disponibles sur Meta à la [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|page d'informations sur les élections de 2026]]. Le scrutin se termine le 2 juin 2026 à [https://zonestamp.toolforge.org/1780358400 00 h 00 UTC].
Veuillez voter si votre compte est éligble. Les résultats seront disponibles avant le 14 juin 2026. -- en coopération avec l'U4C.<section end="announcement-content" />
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 27 mai 2026 à 19:14 (CEST)
<!-- Message envoyé par User:Keegan (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== Actualités techniques n° 2026-23 ==
<section begin="technews-2026-W23"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/23|D’autres traductions]] sont disponibles.
'''Actualités pour la contribution'''
* L'équipe [[mw:Special:MyLanguage/Readers/Reader Experience|Reader Experience]] mène une expérience pour montrer la fonctionnalité [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|listes de lecture]], qui est encore en développement, aux lecteurs non connectés sur mobile afin de tester si elle encourage la création de compte à un rythme plus élevé que le bouton watchstar. L'[[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists#Experiment timeline|expérience]] a été lancée le 18 mai sur les wikis en allemand, espagnol, italien, portugais, polonais, néerlandais, turc et ourdou, et elle durera un mois.
* L'équipe Wikimedia Apps a publié la [[mw:Special:MyLanguage/Wikimedia Apps/Team/Explore Feed Refresh/Phase 1|Phase 1]] du flux d'accueil repensé pour l'application Android Beta. Le nouveau flux d'accueil comprend un onglet « Communauté » actualisé et un onglet « Pour vous » personnalisé contenant des recommandations de lecture mises à jour quotidiennement. La refonte fait partie d'un effort plus large visant à améliorer la découverte de contenu et à créer des expériences d'apprentissage plus engageantes dans les applications Wikipédia.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:18|la tâche soumise|les {{formatnum:18}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:18||s}} la semaine dernière]]. Par exemple, un problème où les images pouvaient ne pas se charger pour certaines modifications suggérées sur [[w:Special:Homepage|Special:Homepage]], laissant la vignette bloquée dans un état de chargement, a maintenant été corrigé. [https://phabricator.wikimedia.org/T424048]
'''Actualités pour la contribution technique'''
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.47/wmf.5|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/23|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W23"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 1 juin 2026 à 23:08 (CEST)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30613639 -->
== Actualités techniques n° 2026-24 ==
<section begin="technews-2026-W24"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/24|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* Wikimedia Entreprise a relevé les limites d’utilisation gratuite de ses API. La limite mensuelle de requêtes pour l’API « à la demande » (<i lang="en">On-demand</i>) est passée de {{formatnum:5000}} à {{formatnum:50000}} requêtes, tandis que celle de l’API des instantanés (<i lang="en">Snapshot</i>) est passée de 15 à 30 requêtes par mois. De plus, les instantanés de contenus structurés sont désormais accessibles aux comptes gratuits. Ces changements élargissent l’accès aux données de Wikimedia Entreprise pour les développeurs et développeuses, les chercheurs et chercheuses et les organisations qui utilisent les contenus Wikimédia. [https://enterprise.wikimedia.com/blog/enhanced-free-api]
'''Actualités pour la contribution'''
* La [[mw:Special:MyLanguage/Wikimedia_Apps/Team/Explore Feed Refresh/Phase 1|nouvelle version du Fil d’exploration]], désormais appelé « Fil d’accueil », est en cours de déploiement auprès de 50 % des utilisateurs de l’application Wikipédia pour Android. Le fil d’accueil aide le lectorat à découvrir du contenu pertinent grâce à deux nouveaux onglets : « Communauté » et « Pour vous ». L’onglet « Communauté » propose un flux défilant de contenus sélectionnés et d’actualités provenant de l’ensemble de la communauté et du mouvement Wikimédia, tandis que l’onglet « Pour vous » offre une expérience en plein écran et par glissement qui présente des contenus adaptés aux centres d’intérêt de l’utilisateur ou utilisatrice. Cette refonte s’inscrit dans le cadre d’un travail en cours visant à améliorer la découverte et à enrichir l’expérience d’apprentissage au sein de l’application Wikipédia.
* Le jeu-questionnaire quotidien [[mw:Special:MyLanguage/Wikimedia Apps/Team/iOS/"Which came first?" Game|Qu’est-ce qui est arrivé en premier ?]] est désormais disponible dans la version bêta de l’application Wikipédia pour iOS en anglais, allemand, français, portugais, russe, espagnol, arabe, chinois et turc. Le jeu s’appuie sur des événements historiques tirés de la rubrique « Éphéméride » de Wikipédia et met les lecteurs au défi de deviner lequel des deux événements s’est produit en premier. Le jeu avait déjà été lancé sur Android. Les communautés souhaitant rendre le jeu disponible dans leur langue peuvent [[mw:Special:MyLanguage/Wikimedia_Apps/Team/Games#Game availability by language|consulter les instructions et les conditions requises]].
* [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Les sous-références]], une nouvelle fonctionnalité de MediaWiki permettant aux contributeurs de réutiliser des références avec des détails différents, va commencer à être déployée sur les wikis Wikimédia après une phase pilote réussie. Le déploiement débutera le 8 juin pour la plupart des [[wikitech:Deployments/Train#Wednesday|wikis du groupe 1]] et Wikipédia en français, puis d'autres éditions linguistiques de Wikipédia bénéficieront de cette fonctionnalité au cours des prochains mois. Les communautés sont invitées à se préparer en vérifiant s’il existe des [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-cite&language=en&action_source=search&filter=%21translated&optional=1&action=translate messages non traduits de l’extension Cite] dans leur langue et en passant en revue toute utilisation de l’outil [[mw:Special:MyLanguage/Reference Tooltips|Infobulles des références]], qui pourraient nécessiter des [[:phab:T416304#11668731|mises à jour]] pour prendre en charge la nouvelle fonctionnalité. Les wikis utilisant les [[mw:Special:MyLanguage/Help:Reference Previews|aperçus de référence]] n’ont aucune action à entreprendre. Les communautés peuvent également créer la [[Special:TrackingCategories|catégorie de suivi]] ''cite-tracking-category-ref-details'' en tant que catégorie cachée à l’aide de <code><nowiki>__HIDDENCAT__</nowiki></code> (ou d’un modèle dédié), et la relier à l’élément Wikidata correspondant [[d:Q129764848]]. [https://phabricator.wikimedia.org/T425662]
* L'[[mw:Special:MyLanguage/Readers/Reader Growth/Mobile page previews#Experimentation|expérience d'Aperçus de page]] sur le Web mobile a pris fin. L'équipe a décidé de ne pas déployer cette fonctionnalité après que les résultats ont montré qu'elle n'avait pas d'impact statistiquement significatif sur la fidélisation des lecteurs, l'amélioration de la fidélisation étant le principal indicateur de réussite. Les « Aperçus de page », déjà disponibles sur ordinateur et dans les applications, affichent une vignette, le premier paragraphe et un lien vers l'article complet lorsque les lecteurs cliquent sur un lien bleu. L'expérience a testé cette fonctionnalité sur le Web mobile sur six versions de Wikipédia.
* La [[mw:Special:MyLanguage/Codex/Design/Icons|bibliothèque d'icônes de l'interface utilisateur]] sera [[phab:T399175|mise à jour dans le courant de cette semaine ou la semaine prochaine]]. La plupart des quelque 300 icônes ont été légèrement peaufinées et une trentaine de nouvelles icônes ont été ajoutées. Ces modifications améliorent les icônes afin de les rendre plus cohérentes et plus compréhensibles, et d'offrir un meilleur équilibre visuel lorsqu'elles sont utilisées en groupe.
* L'interface [[mw:Special:MyLanguage/Universal Language Selector|Sélecteur universel de langue]] (ULS) de MediaWiki, qui aide les utilisateurs à sélectionner du contenu dans d'autres langues, a été mise à jour. La nouvelle version améliore la rapidité et l'accessibilité, et les utilisateurs des projets Wikimédia peuvent désormais épingler des langues pour changer de langue plus rapidement. Le déploiement sur les sites Wikimédia se fera progressivement au cours des prochaines semaines. Vous pouvez la tester dès maintenant en tant que fonctionnalité bêta en sélectionnant [[Special:Preferences#mw-prefsection-betafeatures|les fonctionnalités bêta]] dans les préférences de votre profil et partager vos commentaires sur [[mw:Special:MyLanguage/Universal Language Selector/New ULS|la page du projet]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:21|la tâche soumise|les {{formatnum:21}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:21||s}} la semaine dernière]]. Par exemple, un problème du le tableau de bord d'analyse des pages vues sur pageviews.wmcloud.org qui a arrêté de mettre à jour les données graphiques en mai 2026, affectant tous les utilisateurs, a été résolu. [https://phabricator.wikimedia.org/T427171]
'''Actualités pour la contribution technique'''
* La signature de la fonction <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink()</nowiki></code></bdi> a été simplifiée. Les développeurs peuvent désormais passer un objet de configuration à la place d'une liste de paramètres positionnels lors de la création de liens vers des portlets. L'ancienne signature de la fonction reste prise en charge à des fins de compatibilité ascendante. Par exemple, au lieu de : <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink('p-cactions', '#', 'Stub', 'ca-stubtag', 'Add a stub tag to this page');</nowiki></code></bdi>, utilisez <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink('p-cactions', { href: '#', text: 'Stub', id: 'ca-stubtag', tooltip: 'Add a stub tag to this page' });</nowiki></code></bdi>. Les responsables de la maintenance des scripts sont invités à passer en revue les utilisations existantes de <bdi lang="zxx" dir="ltr"><code><nowiki>addPortletLink()</nowiki></code></bdi> et à les mettre à jour si nécessaire. Cette modification sera disponible sur tous les wikis à partir du 11 juin. Merci à Gerges, bénévole de la communauté, d'avoir apporté cette amélioration. [https://phabricator.wikimedia.org/T427945]
* '''Discussion sur la liste de souhaits de la communauté''': les [[m:Special:MyLanguage/Community Wishlist/Updates#May 20, 2026: Community Tech becomes a program|changements introduits]] par les équipes Produit et Technologie visent à augmenter le nombre et la complexité des souhaits exaucés, notamment par la dissolution de l'équipe Community Tech. Ils [[m:Special:MyLanguage/Community Wishlist/Updates|mènent actuellement des discussions]] sur une [[m:Talk:Community Wishlist#Proposed direction for Wishlist|orientation proposée pour la liste de souhaits]] émanant des membres de la communauté. Cela inclut des moyens de structurer le vote annuel, un meilleur suivi des souhaits, la suppression de certains domaines prioritaires et des [[m:Special:MyLanguage/Community Wishlist/Updates|mises à jour concernant le personnel]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.47/wmf.6|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/24|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W24"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 8 juin 2026 à 23:29 (CEST)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30650573 -->
== Actualités techniques n° 2026-25 ==
<section begin="technews-2026-W25"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/25|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* L'[[mw:Special:MyLanguage/Readers/Reader Growth|équipe chargée de la croissance du lectorat]] a lancé une fonctionnalité bêta d'[[mw:Special:MyLanguage/Readers/Reader Growth/Image Browsing|exploration des images]] sur la version mobile de toutes les Wikipédias. Cette fonctionnalité affiche un carrousel d'images en haut des articles contenant au moins trois images. Les contributeurs peuvent configurer cette fonctionnalité à l'aide des commandes suivantes : pour masquer une image spécifique sur une page, utilisez soit <code>class=notpageimage</code> pour l'exclure des aperçus miniatures, soit <code>class=noviewer</code> pour l'exclure de MediaViewer. Le carrousel peut également être désactivé complètement sur une page à l'aide du mot magique <code><nowiki>__NOMEDIAVIEWERCAROUSEL__</nowiki></code>. Pour faire des retours ou signaler des bugs, rendez-vous sur la [[mw:Talk:Readers/Reader Growth/Image Browsing|page de discussion du projet]].
* Les [[mw:Special:MyLanguage/Help:Tables#class="wikitable"|Wikitables]] peuvent désormais être [[mw:Special:MyLanguage/Help:Sortable tables#Forcing the initial sort direction|triées par ordre décroissant]] dès le premier clic en ajoutant <code dir=ltr>data-sort-order="desc"</code> à la cellule d'en-tête. Auparavant, par défaut, cliquer une première fois sur l'en-tête d'une colonne entraînait un tri par ordre croissant. Cette nouveauté offre davantage de contrôle et de flexibilité pour les Wikitables, tandis que le comportement par défaut pour les clics suivants reste inchangé. [https://phabricator.wikimedia.org/T398416]
'''Actualités pour la contribution'''
* La fonctionnalité d'[[mw:Special:MyLanguage/Article guidance|Aide à la rédaction d'articles]] est actuellement en phase de test auprès de certains contributeurs qui créent de nouveaux articles sur les Wikipédias en anglais simplifié, en français et en turc. L'expérience débutera bientôt sur les Wikipédias en arabe et en bengali également. [[w:simple:Special:NewArticle|Cette fonctionnalité]] fournit aux contributeurs des conseils élaborés par la communauté afin de les aider à créer des articles conformes aux normes communautaires. Les contributeurs expérimentés peuvent continuer à créer ou à adapter des modèles pour des types d'articles spécifiques qui sont couramment créés par des contributeurs moins expérimentés. Ces modèles guident les contributeurs moins expérimentés dans la création d'articles de haute qualité. Un guide rapide des balises utilisées dans les modèles est disponible sur [[mw:Special:MyLanguage/Article guidance/Test feature guide#Markups in outlines|cette page]]. [[w:fr:Projet:Aide à la rédaction d'articles#Liste de plans d'aide à la rédaction|Des exemples de modèles]] pouvant être adaptés, ainsi que des instructions sur la manière de les adapter, se trouvent dans [[mw:Special:MyLanguage/Article guidance#Adapting a sample outline in a Wikipedia|cette section]] de la page du projet.
* Les wikis qui souhaitent remplacer le bouton « indéfiniment » dans la page Special:Block pour les comptes temporaires (par exemple, les wikis qui bloquent les utilisateurs temporaires uniquement jusqu'à l'expiration de leur compte) pourront le faire en créant [[MediaWiki:ipb-indefinite-expiry-temporary-account]] avec la durée de blocage souhaitée. [https://phabricator.wikimedia.org/T427125]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:41|la tâche soumise|les {{formatnum:41}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:41||s}} la semaine dernière]].
'''Actualités pour la contribution technique'''
* D'ici la fin du mois de juin, une chaîne « user-agent » valide sera requise pour les téléchargements automatisés de sauvegardes depuis le site dumps.wikimedia.org. Les requêtes automatisées fournissant une chaîne « user-agent » générique ou vide seront bloquées. Cette mesure [[phab:T400119|renforce l'application]] de la [[foundation:Special:MyLanguage/Policy:Wikimedia Foundation User-Agent Policy|politique relative à l'agent utilisateur]] en vigueur depuis longtemps. L'accès aux sauvegardes via Wikimedia Cloud Services restera inchangé.
* La mise en place des [[mw:Wikimedia APIs/Rate limits|limites de débit des API]] à l'échelle mondiale est désormais achevée ; ces limites s'appliquent à toutes les API et sont fixées aux niveaux indiqués dans la documentation pour tous les groupes. Les bots fonctionnant sur Toolforge/WMCS ou disposant du droit d'utilisateur « bot » sur n'importe quel wiki restent exemptés. Tous les bots doivent continuer à respecter les bonnes pratiques décrites dans la documentation afin d'éviter d'être soumis à des limites de débit.
* Le [https://api.wikimedia.org/wiki/Main_Page wiki du portail API] sera en lecture seule à partir de cette semaine (du 15 au 18 juin). La semaine suivante (du 22 au 25 juin), toutes les URL du wiki du portail API redirigeront vers [[mw:Wikimedia APIs|les API Wikimedia sur mediawiki.org]]. Pour en savoir plus, consultez la [[wikitech:API Portal/Deprecation|page du projet]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.47/wmf.7|MediaWiki]]
'''Rencontres et évènements'''
* Le 17 juin à 18 h (UTC), la WMF organisera une réunion sur Discord consacrée à la revue de code. L'[[mw:Special:MyLanguage/Developer Satisfaction Survey/2026|enquête sur la satisfaction des développeurs]] nous a permis de constater que les bénévoles rencontrent des difficultés avec la revue de code, et nous souhaitons discuter de ces expériences afin de trouver des solutions concrètes. Vous pouvez rejoindre la réunion [https://discord.gg/wikipedia?event=1514727511102062664 via le serveur Discord de la communauté Wikimedia].
* La [[m:Special:MyLanguage/Conferencia Wikimedia de América Latina 2026|Conférence Wikimedia d'Amérique latine]] organisera un hackathon régional qui réunira la communauté technique du mouvement Wikimedia, notamment des développeurs, des administrateurs système, des data scientists et des utilisateurs disposant de droits étendus. Les contributeurs techniques intéressés peuvent [https://docs.google.com/forms/d/e/1FAIpQLSf4osJzTHBJjQbYJk7TMVEJjTEQv7IgtsUDfP-o-qTgeRQQxw/viewform postuler à une bourse] pour y participer jusqu'au 21 juin à minuit (heure de la Bolivie, UTC-4).
* Inscrivez-vous aux Wikimania Team Challenges pour participer à cet événement exceptionnel. Les défis par équipe se dérouleront en ligne et en présentiel les 21 et 22 juillet, avant la conférence Wikimania. Tout le monde est le bienvenu, quelles que soient ses compétences ou son inscription à Wikimania. Les équipes travailleront sur 10 défis importants visant à soutenir la communauté Wikimedia. Pour plus de détails, rendez-vous sur [[wmania:Special:MyLanguage/2026:Team challenges|la page des défis par équipe]] et [https://wikimedia.eventyay.com/wm/teamchallenges/ inscrivez-vous ici]. Les inscriptions se terminent le 20 juin à 23 h UTC.
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/25|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W25"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 15 juin 2026 à 18:48 (CEST)
<!-- Message envoyé par User:UOzurumba (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30689604 -->
== Actualités techniques n° 2026-26 ==
<section begin="technews-2026-W26"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/26|D’autres traductions]] sont disponibles.
'''En lumière cette semaine'''
* Les [[mw:Special:MyLanguage/Growth/Feature summary|fonctionnalités de croissance]] sont [[phab:T418115|désormais disponibles sur Wikidata]]. Cette mise à jour permet d'accéder au mentorat ([[mw:Special:MyLanguage/Help:Growth/Mentorship|s'il est configuré]]), au module Impact, au panneau d'aide et à une page d'accueil simplifiée pour les nouveaux arrivants (sans les suggestions de modifications). Les administrateurs de Wikidata continuent de paramétrer ces fonctionnalités via la configuration communautaire.
'''Actualités pour la contribution'''
* La page spéciale [[{{#special:RangeCalculator}}]] a été créée. Elle permet aux utilisateurs de trouver une plage d'adresses IP sans avoir à recourir à des outils externes. Jusqu'à présent, cet outil n'était accessible qu'aux CheckUsers. [https://phabricator.wikimedia.org/T268429]
* Les [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|sous-références]] sont une nouvelle fonctionnalité de MediaWiki qui permet aux contributeurs de réutiliser des références en modifiant certains détails. Elle sera déployée le 23 juin, sur la plupart des versions de Wikipédia de petite et moyenne taille. La [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#deployment|FAQ]] répertorie les mesures à prendre sur votre wiki pour faciliter ce déploiement. Consultez le [[:phab:T414094|plan de déploiement]] pour connaître les prochaines étapes. [https://phabricator.wikimedia.org/T428902]
* À partir de la semaine prochaine, les utilisateurs recevront une notification lorsqu'ils seront bloqués ou débloqués pour l'édition, ou si ce blocage venait à changer. [https://phabricator.wikimedia.org/T100974]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:32|la tâche soumise|les {{formatnum:32}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:32||s}} la semaine dernière]].
'''Actualités pour la contribution technique'''
* À partir de la semaine prochaine, les filtres anti-abus configurés pour « exiger une vérification par CAPTCHA » s'appliqueront également aux utilisateurs disposant du droit <code>skipcaptcha</code>, ce qui inclut la plupart des utilisateurs auto-confirmés. Les bots en sont exemptés. Ce changement ne concerne que les modifications qui déclenchent un filtre anti-abus. Le droit <code>skipcaptcha</code> continuera à exempter les utilisateurs de l'obligation de résoudre des CAPTCHA dans le cadre d'une utilisation normale des wikis. [https://phabricator.wikimedia.org/T402595]
* La documentation de référence relative à l'[[wikitech:Machine_Learning/LiftWing/API|API Lift Wing]] a été déplacée du portail API vers le [https://wikitech.wikimedia.org/w/index.php?api=lift-wing&title=Special%3ARestSandbox bac à sable REST] interactif.
* Le wiki du Portail API est désormais fermé. Pour consulter la documentation relative aux API, rendez-vous sur [[mw:Special:MyLanguage/Wikimedia_APIs|Wikimedia APIs sur mediawiki.org]]. À compter du 22 juin, toutes les URL du wiki du Portail API (https://api.wikimedia.org/wiki/) redirigeront vers la page de mediawiki.org. [https://phabricator.wikimedia.org/T427537]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.47/wmf.8|MediaWiki]]
'''Rencontres et évènements'''
* Participez à une visioconférence le 25 juin à 14 h 30 UTC pour rencontrer les stagiaires actuels de Wikimédia participant au [[mw:Google_Summer_of_Code/2026|Google Summer of Code]] et à [[mw:Outreachy/Round_32|Outreachy]]. Les stagiaires présenteront leurs projets et feront une brève démonstration du travail qu'ils ont réalisé jusqu'à présent. Les participants sont invités à [[mw:event:Google_Summer_of_Code/Summer_2026_June_Internship_open_session|partager leurs idées et leurs contacts au sein de leur communauté]].
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/26|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W26"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 23 juin 2026 à 15:05 (CEST)
<!-- Message envoyé par User:Trizek (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30722494 -->
== RFC about AI-generated content in Wikimedia Commons ==
<bdi lang="en" dir="ltr">Apologies for writing in English, please help translate this message to your language. You are invited to participate in a [[c:Commons:Requests for comment/Policy update for AI content|request for comment on Wikimedia Commons about a policy update for AI content]]. This may affect files that are uploaded to Wikimedia Commons for use on this project. Thank you. [[m:User:Codename Noreste|Codename Noreste]] ([[m:User talk:Codename Noreste|discussion]])</bdi> 23 juin 2026 à 19:11 (CEST)
<!-- Message envoyé par User:Codename Noreste@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== Intégration du lien vers les contacts juridiques et de sécurité dans le pied de page de votre wiki ==
<section begin="Message"/>
'''Contacts juridiques et de sécurité'''
Bonjour à toute la communauté, la Fondation Wikimedia a mis à disposition une [[wmf:Special:MyLanguage/Legal:Wikimedia Foundation Legal and Safety Contact Information|page unique dédiée aux mentions légales et à la sécurité]], à ajouter en pied de page de votre wiki, afin de garantir l'accès à des informations juridiques exactes. Il s'agit d'une exigence réglementaire. Nous avons déjà mis en place des liens vers les wikis en anglais, allemand, italien, espagnol et d'autres langues de Wikipedia, et nous les déploierons bientôt sur votre wiki. Pour en savoir plus, [[m:Special:MyLanguage/Wikimedia_Foundation_Legal_and_Safety_Contacts_FAQ|consultez la page du projet]] et n'hésitez pas à laisser vos commentaires dans ce fil de discussion ou sur la [[m:Special:MyLanguage/Talk:Wikimedia Foundation Legal and Safety Contacts FAQ|page de discussion]].
<section end="Message"/>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 25 juin 2026 à 15:30 (CEST)
<!-- Message envoyé par User:Sannita (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=30731267 -->
== Actualités techniques n° 2026-27 ==
<section begin="technews-2026-W27"/><div class="plainlinks">
Dernières '''[[m:Special:MyLanguage/Tech/News|actualités techniques]]''' de la communauté technique de Wikimedia. N’hésitez pas à informer les autres utilisateurs de ces changements. Certains changements ne vous concernent pas. [[m:Special:MyLanguage/Tech/News/2026/27|D’autres traductions]] sont disponibles.
'''Actualités pour la contribution'''
* Dans le cadre des [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|expériences sur la création de comptes]], l'équipe Growth a testé l'ajout d'une icône de compte utilisateur dans l'en-tête du site mobile pour les utilisateurs non connectés, offrant ainsi un accès direct aux actions « Créer un compte » et « Se connecter ». Cette expérience a permis d'augmenter le nombre de créations de comptes d'environ 20 % sans nuire à la qualité des modifications ni au taux de modifications constructives. Cette fonctionnalité sera désormais déployée sur tous les wikis de la Fondation Wikimédia sur le site mobile au cours de la première semaine de juillet. [https://phabricator.wikimedia.org/T428220]
* À la suite d'une [[phab:T426248|expérience concluante]], les utilisateurs connectés qui n'ont pas [[mw:Special:MyLanguage/Help:Email_confirmation|confirmé leur adresse e-mail]] lors de la création de leur compte voient s'afficher une nouvelle bannière leur demandant de finaliser cette procédure. Cela permet de réduire le risque que les utilisateurs se retrouvent bloqués hors de leur compte et rend les adresses e-mail associées aux comptes globalement plus fiables. Cette mesure s'inscrit dans le cadre du projet [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Sécurité des comptes]]. [https://phabricator.wikimedia.org/T428292]
* Une mise à jour de [[Special:Search|Recherche]] affine le comportement de <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> lorsqu'il est utilisé pour exclure des résultats. Auparavant, l'utilisation de <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> avec la négation pouvait élargir involontairement les résultats de recherche en ajoutant les espaces de noms inclus dans le champ de recherche, ce qui entraînait un comportement déroutant pour les utilisateurs s'attendant à un filtre d'exclusion simple. Avec cette mise à jour, <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> exclura désormais strictement les titres de pages correspondants comme prévu et pourra afficher un avertissement si l'espace de noms concerné n'a pas été explicitement sélectionné. Le comportement de <bdi lang="zxx" dir="ltr"><code><nowiki>prefix:</nowiki></code></bdi> sans négation reste toutefois inchangé. [https://phabricator.wikimedia.org/T427443]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Voir {{PLURAL:33|la tâche soumise|les {{formatnum:33}} tâches soumises}} par la communauté [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|résolue{{PLURAL:33||s}} la semaine dernière]]. Par exemple, le problème qui empêchait les réviseurs utilisant la barre d'outils « Page Curation » d'être automatiquement abonnés aux discussions qu'ils avaient lancées sur les pages de discussion a désormais été résolu. Les réviseurs recevront désormais des notifications lorsqu'une personne répondra à ces discussions. [https://phabricator.wikimedia.org/T329346]
'''Actualités pour la contribution technique'''
* À compter du 29 juin, les téléchargements automatisés depuis le site web « dumps.wikimedia.org » seront soumis à la [[Foundation:Special:MyLanguage/Policy:Wikimedia Foundation User-Agent Policy|politique relative aux user-agents]]. Les requêtes automatisées utilisant un user-agent générique ou vide seront bloquées. L'accès aux sauvegardes via Wikimedia Cloud Services n'est pas affecté. Cette mesure fait suite à l'annonce publiée dans le [[m:Special:MyLanguage/Tech/News/2026/25|numéro 2026/25 de Tech News]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Sujet récurrent]] Détail des mises-à-jour à venir cette semaine : [[mw:MediaWiki 1.47/wmf.9|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Actualités techniques]]''' préparées par les [[m:Special:MyLanguage/Tech/News/Writers|rédacteurs des actualités techniques]] et postées par [[m:Special:MyLanguage/User:MediaWiki message delivery|robot]]. [[m:Special:MyLanguage/Tech/News#contribute|Contribuer]] • [[m:Special:MyLanguage/Tech/News/2026/27|Traduire]] • [[m:Tech|Obtenir de l’aide]] • [[m:Talk:Tech/News|Donner son avis]] • [[m:Global message delivery/Targets/Tech ambassadors|S’abonner ou se désabonner]].''
</div><section end="technews-2026-W27"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 29 juin 2026 à 13:48 (CEST)
<!-- Message envoyé par User:STei (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30744833 -->
1gly97xsixfi6ka66xlfn80zr03zpwx
Dictionnaire de philosophie/J
0
83915
768890
767290
2026-06-29T03:03:09Z
PandaMystique
119061
768890
wikitext
text/x-wiki
{{DicoPhilo|J}}
<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/Friedrich Heinrich Jacobi|Jacobi, Friedrich Heinrich]]
:[[Dictionnaire de philosophie/William James|James, William]]
:[[Dictionnaire de philosophie/Jansénisme|Jansénisme]]
:[[Dictionnaire de philosophie/Karl Jaspers|Jaspers, Karl]]
</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/Je|Je]]
:[[Dictionnaire de philosophie/Jeu|Jeu]]
:[[Dictionnaire de philosophie/Joie|Joie]]
:[[Dictionnaire de philosophie/Hans Jonas|Jonas, Hans]]
</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/Jugement|Jugement]]
:[[Dictionnaire de philosophie/Justice|Justice]]
:[[Dictionnaire de philosophie/Justification|Justification]]
</div>
</div>
{{PhiloRecherche}}
{{autocat}}
9ol4j7t3vnlklr0yndofypbg4yf3ybv
Dictionnaire de philosophie/R
0
83916
768894
767292
2026-06-29T03:44:56Z
PandaMystique
119061
768894
wikitext
text/x-wiki
{{DicoPhilo|R}}
<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/Raison|Raison]]
:[[Dictionnaire de philosophie/Jacques Rancière|Rancière]]
:[[Dictionnaire de philosophie/Rationalisme|Rationalisme]]
:[[Dictionnaire de philosophie/John Rawls|Rawls]]
:[[Dictionnaire de philosophie/Réalisme|Réalisme]]
:[[Dictionnaire de philosophie/Réalité|Réalité]]
:[[Dictionnaire de philosophie/Reconnaissance|Reconnaissance]]
:[[Dictionnaire de philosophie/Réductionnisme|Réductionnisme]]
:[[Dictionnaire de philosophie/Réfutabilité|Réfutabilité]]
:[[Dictionnaire de philosophie/Règle|Règle]]
</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/Thomas Reid|Reid]]
:[[Dictionnaire de philosophie/Réification|Réification]]
:[[Dictionnaire de philosophie/Relation|Relation]]
:[[Dictionnaire de philosophie/Relativisme|Relativisme]]
:[[Dictionnaire de philosophie/Religion|Religion]]
:[[Dictionnaire de philosophie/Réminiscence|Réminiscence]]
:[[Dictionnaire de philosophie/Représentation|Représentation]]
:[[Dictionnaire de philosophie/Responsabilité|Responsabilité]]
:[[Dictionnaire de philosophie/Ressentiment|Ressentiment]]
</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/Rêve|Rêve]]
:[[Dictionnaire de philosophie/Révolution|Révolution]]
:[[Dictionnaire de philosophie/Rhétorique|Rhétorique]]
:[[Dictionnaire de philosophie/Paul Ricœur|Ricœur]]
:[[Dictionnaire de philosophie/Richard Rorty|Rorty]]
:[[Dictionnaire de philosophie/Franz Rosenzweig|Rosenzweig]]
:[[Dictionnaire de philosophie/Jean-Jacques Rousseau|Rousseau]]
:[[Dictionnaire de philosophie/Bertrand Russell|Russell]]
:[[Dictionnaire de philosophie/Gilbert Ryle|Ryle]]
</div>
</div>
{{PhiloRecherche}}
{{autocat}}
2lmfwq86iroaapvu53uzyktdn1t0uub
Dictionnaire de philosophie/K
0
83948
768891
767820
2026-06-29T03:07:16Z
PandaMystique
119061
768891
wikitext
text/x-wiki
{{DicoPhilo|K}}
<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);">
:Kairos
:Kant, Emmanuel
:Kantisme
:Kelsen, Hans
</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);">
:Kierkegaard, Søren
:Kitsch
:Kōan
:Kojève, Alexandre
</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);">
:Koyré, Alexandre
:Kripke, Saul
:[[Dictionnaire de philosophie/Pierre Kropotkine|Kropotkine, Pierre]]
:Kuhn, Thomas
</div>
</div>
{{PhiloRecherche}}
{{autocat}}
sutlgqyk27josmax6vu2mrrkmzqbfok
Fonctionnement d'un ordinateur/Les timers et diviseurs de fréquence
0
83954
768883
768172
2026-06-28T20:55:39Z
EmausBot
70429
Robot : Correction d’une double redirection depuis [[Fonctionnement d'un ordinateur/Les registres à décalage à rétroaction linéaire]] vers [[Fonctionnement d'un ordinateur/Les registres à décalage et les LSFR]]
768883
wikitext
text/x-wiki
#REDIRECTION [[Fonctionnement d'un ordinateur/Les registres à décalage et les LSFR]]
9mya19sph4tg0vghx96wpjh9ul1xy1l
Fonctionnement d'un ordinateur/Les compteurs à rétroaction
0
83956
768882
768128
2026-06-28T20:55:29Z
EmausBot
70429
Robot : Correction d’une double redirection depuis [[Fonctionnement d'un ordinateur/Les registres à décalage à rétroaction linéaire]] vers [[Fonctionnement d'un ordinateur/Les registres à décalage et les LSFR]]
768882
wikitext
text/x-wiki
#REDIRECTION [[Fonctionnement d'un ordinateur/Les registres à décalage et les LSFR]]
9mya19sph4tg0vghx96wpjh9ul1xy1l
101 fiches pratiques pour survivre aux canicules
0
83983
768896
2026-06-29T11:12:49Z
Assassas77
50106
Création du nouveau livre
768896
wikitext
text/x-wiki
{{Page de garde|image=|description=
Paragraphe court d'introduction au livre.
|avancement=Ébauche
|cdu=
* {{CDU item||}}
|versions=
{{Moteur}}
{{Version imprimable}}
{{version PDF}}
}}
Pour lire ce livre, commencez par ...
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
h0d574xp2mt14y0atzqvo0c1k1y1w0p
768898
768896
2026-06-29T11:15:19Z
Assassas77
50106
Page redirigée vers [[101FPCanicules]]
768898
wikitext
text/x-wiki
#REDIRECTION [[101FPCanicules]]
jm5pyrcbeom0r7v1ol9rszcz6ynq7rw
101FPCanicules
0
83984
768897
2026-06-29T11:14:00Z
Assassas77
50106
Création du nouveau livre
768897
wikitext
text/x-wiki
{{Page de garde|image=|description=
Paragraphe court d'introduction au livre.
|avancement=Ébauche
|cdu=
* {{CDU item||}}
|versions=
{{Moteur}}
{{Version imprimable}}
{{version PDF}}
}}
Pour lire ce livre, commencez par ...
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
h0d574xp2mt14y0atzqvo0c1k1y1w0p
768907
768897
2026-06-29T11:20:00Z
Assassas77
50106
768907
wikitext
text/x-wiki
{{Page de garde|image=File:Eberndorf Köcking Sonnenblumenfeld Biohof Tomic 18072014 0792.jpg
|description=
Paragraphe court d'introduction au livre.
|avancement=Ébauche
|cdu=
* {{CDU item||}}
|versions=
{{Moteur}}
{{Version imprimable}}
{{version PDF}}
}}
Pour lire ce livre, commencez par ...
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
0f8l5d5nin0wkxvm7iz60oop4xnezhe
768908
768907
2026-06-29T11:20:23Z
Assassas77
50106
768908
wikitext
text/x-wiki
{{Page de garde|image=Eberndorf Köcking Sonnenblumenfeld Biohof Tomic 18072014 0792.jpg
|description=
Paragraphe court d'introduction au livre.
|avancement=Ébauche
|cdu=
* {{CDU item||}}
|versions=
{{Moteur}}
{{Version imprimable}}
{{version PDF}}
}}
Pour lire ce livre, commencez par ...
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
6kbivmo282cuc2zanp7wy3df5fa72iv
768909
768908
2026-06-29T11:21:46Z
Assassas77
50106
768909
wikitext
text/x-wiki
{{Page de garde|image=Champ de tournesols à Vernier.jpg
|description=
Paragraphe court d'introduction au livre.
|avancement=Ébauche
|cdu=
* {{CDU item||}}
|versions=
{{Moteur}}
{{Version imprimable}}
{{version PDF}}
}}
Pour lire ce livre, commencez par ...
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
odc1lhehcds7f0lkp3t0dg5obvbggyu
768911
768909
2026-06-29T11:23:09Z
Assassas77
50106
768911
wikitext
text/x-wiki
{{Page de garde|image=Champ de tournesols à Vernier.jpg
|description=
101 fiches pratiques pour survivre aux canicules
|avancement=Ébauche
|cdu=
* {{CDU item||}}
|versions=
{{Moteur}}
{{Version imprimable}}
{{version PDF}}
}}
Pour lire ce livre, commencez par ...
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
fvwivxnsd2xp83o2anii7iwlvkxprdp
768912
768911
2026-06-29T11:23:53Z
Assassas77
50106
768912
wikitext
text/x-wiki
{{Page de garde|image=Champ de tournesols à Vernier.jpg
|description=
101 fiches pratiques pour survivre aux canicules
|avancement=Ébauche
|cdu=
* {{CDU item||}}
|versions=
{{Moteur}}
{{Version imprimable}}
{{version PDF}}
}}
Pour lire ce livre, commencez par ...
Ou bien, prenez une fiche au hasard ...
Ou bien consultez les catégories
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
ibr0s0rbu03lcgo7zvscg39kwrson8d
768913
768912
2026-06-29T11:24:51Z
Assassas77
50106
768913
wikitext
text/x-wiki
{{Page de garde|image=Champ de tournesols à Vernier.jpg
|description=
101 fiches pratiques pour survivre aux canicules
|avancement=Ébauche
|cdu=
* {{CDU item||}}
|versions=
{{Moteur}}
{{Version imprimable}}
{{version PDF}}
}}
Pour lire ce livre :
*commencez par ..
*Ou bien, prenez une fiche au hasard ...
*Ou bien consultez les catégories
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
6bgovcoqmt3ro4g39f5az50i7owbfkf
768914
768913
2026-06-29T11:25:07Z
Assassas77
50106
768914
wikitext
text/x-wiki
{{Page de garde|image=Champ de tournesols à Vernier.jpg
|description=
101 fiches pratiques pour survivre aux canicules
|avancement=Ébauche
|cdu=
* {{CDU item||}}
|versions=
{{Moteur}}
{{Version imprimable}}
{{version PDF}}
}}
Pour lire ce livre :
*commencez par ..
*ou bien, prenez une fiche au hasard ...
*ou bien consultez les catégories
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
b1dliroqt3hws2oou9i06icslylkqxy
768936
768914
2026-06-29T11:35:31Z
Assassas77
50106
768936
wikitext
text/x-wiki
{{Page de garde|image=Champ de tournesols à Vernier.jpg
|description=
101 fiches pratiques pour survivre aux canicules
|avancement=Ébauche
|cdu=
* {{CDU item|644|}}
|versions=
{{Moteur}}
{{Version imprimable}}
{{version PDF}}
}}
Pour lire ce livre :
*commencez par ..
*ou bien, prenez une fiche au hasard ...
*ou bien consultez les catégories
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
q5k6mqvioq1ok1cont6j7lvo6yp6qg2
768937
768936
2026-06-29T11:36:33Z
Assassas77
50106
768937
wikitext
text/x-wiki
{{Page de garde|image=Champ de tournesols à Vernier.jpg
|description=
101 fiches pratiques pour survivre aux canicules
|avancement=Ébauche
|cdu=
* {{CDU item|6|64}}
|versions=
{{Moteur}}
{{Version imprimable}}
{{version PDF}}
}}
Pour lire ce livre :
*commencez par ..
*ou bien, prenez une fiche au hasard ...
*ou bien consultez les catégories
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
o7815ss7ufaseprerr8tw9fe31zw83s
768938
768937
2026-06-29T11:37:56Z
Assassas77
50106
768938
wikitext
text/x-wiki
{{Page de garde|image=Champ de tournesols à Vernier.jpg
|description=
101 fiches pratiques pour survivre aux canicules
|avancement=Ébauche
|cdu=
* {{CDU item|6|64}}
|versions=
{{Moteur}}
<!--{{Version imprimable}}
{{version PDF}}-->
}}
Pour lire ce livre :
*commencez par ..
*ou bien, prenez une fiche au hasard ...
*ou bien consultez les catégories
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
5hvt2sfw2rni1ezp96ljqsqbp1osoa3
768939
768938
2026-06-29T11:38:18Z
Assassas77
50106
HotCat : [[Category:101 fiches pratiques pour survivre aux canicules]] ajoutée avec [[Help:Gadget-HotCat|HotCat]]
768939
wikitext
text/x-wiki
{{Page de garde|image=Champ de tournesols à Vernier.jpg
|description=
101 fiches pratiques pour survivre aux canicules
|avancement=Ébauche
|cdu=
* {{CDU item|6|64}}
|versions=
{{Moteur}}
<!--{{Version imprimable}}
{{version PDF}}-->
}}
Pour lire ce livre :
*commencez par ..
*ou bien, prenez une fiche au hasard ...
*ou bien consultez les catégories
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
[[Catégorie:101 fiches pratiques pour survivre aux canicules]]
dng31qn7zoikantsy7vuitqn51ew819
768940
768939
2026-06-29T11:38:36Z
Assassas77
50106
768940
wikitext
text/x-wiki
{{Page de garde|image=Champ de tournesols à Vernier.jpg
|description=
101 fiches pratiques pour survivre aux canicules
|avancement=Ébauche
|cdu=
* {{CDU item|6|64}}
|versions=
{{Moteur}}
<!--{{Version imprimable}}
{{version PDF}}-->
}}
Pour lire ce livre :
*commencez par ..
*ou bien, prenez une fiche au hasard ...
*ou bien consultez les catégories
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]
ouldmowkopobxaj98szlxhnedj0kazj
768947
768940
2026-06-29T11:41:51Z
Assassas77
50106
HotCat : new key for [[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]: "*"
768947
wikitext
text/x-wiki
{{Page de garde|image=Champ de tournesols à Vernier.jpg
|description=
101 fiches pratiques pour survivre aux canicules
|avancement=Ébauche
|cdu=
* {{CDU item|6|64}}
|versions=
{{Moteur}}
<!--{{Version imprimable}}
{{version PDF}}-->
}}
Pour lire ce livre :
*commencez par ..
*ou bien, prenez une fiche au hasard ...
*ou bien consultez les catégories
Courte introduction sur page de garde.
== Sommaire ==
{{/Sommaire}}
== Voir aussi ==
* ...liens vers d'autres livres...
<!-- [[Catégorie:]] -->
<!-- Il suffit de sauvegarder cette page pour générer le squelette du livre -->
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|*]]
k109r9xf725bqr5pg7ktw385a2z9e7o
101FPCanicules/Sommaire
0
83985
768900
2026-06-29T11:16:14Z
Assassas77
50106
Page créée avec « * Préambule »
768900
wikitext
text/x-wiki
* Préambule
tff2cfo5eouu7skmfi5fpgkk10rvxbs
768901
768900
2026-06-29T11:16:43Z
Assassas77
50106
768901
wikitext
text/x-wiki
* [[Préambule]]
jwdgqhchmm3g40j4zmhovt1y59u7igp
768902
768901
2026-06-29T11:17:06Z
Assassas77
50106
768902
wikitext
text/x-wiki
* [[.../Préambule]]
5iuo5n9yfgpagsrhqsoiycmttztzmgq
768903
768902
2026-06-29T11:17:16Z
Assassas77
50106
768903
wikitext
text/x-wiki
* [[../Préambule]]
dohzabj08j6qlj9akd5hq9w6355z1ek
768904
768903
2026-06-29T11:17:28Z
Assassas77
50106
768904
wikitext
text/x-wiki
* [[../Préambule|../Préambule]]
11naq45ndh95geu1av1bjja7t9v61jc
768910
768904
2026-06-29T11:22:26Z
Assassas77
50106
768910
wikitext
text/x-wiki
* [[/Préambule]]
j3ycp8cxyvm1xd16jd840wj6ipc6m8k
768915
768910
2026-06-29T11:25:25Z
Assassas77
50106
768915
wikitext
text/x-wiki
* [[/Préambule|/Préambule]]
2q8ktrot32wmx959lhx9ftrjvxbnzp4
768917
768915
2026-06-29T11:27:27Z
Assassas77
50106
768917
wikitext
text/x-wiki
* [[<noinclude>..</noinclude>/Préambule]]
9lznt465hzzx1o0yhx9dgpbe2fp8rxc
768918
768917
2026-06-29T11:29:11Z
Assassas77
50106
768918
wikitext
text/x-wiki
* [[<noinclude>..</noinclude>/Préambule]]
<small>[[101FPCanicules/Sommaire|Modifier le sommaire]]</small>
k6g0z6jtu4n5rlaaex5okfdl0qza4s6
768920
768918
2026-06-29T11:29:46Z
Assassas77
50106
768920
wikitext
text/x-wiki
<small>[[101FPCanicules/Sommaire|Modifier le sommaire]]</small>
* [[<noinclude>..</noinclude>/Préambule]]
* [[<noinclude>..</noinclude>/Avertissement médical]]
4373t0ob1p0zfivxvy7ezqh2ab86b3c
768921
768920
2026-06-29T11:29:59Z
Assassas77
50106
768921
wikitext
text/x-wiki
<small>[[101FPCanicules/Sommaire|Modifier le sommaire]]</small>
* [[<noinclude>..</noinclude>/Préambule]]
* [[<noinclude>..</noinclude>/Avertissement médical]]
* [[<noinclude>..</noinclude>/Avertissement publicitaire]]
0lx8kdtqz99t3c72gpxauyk7wwdhslr
101FPCanicules/Manifeste
0
83986
768905
2026-06-29T11:18:36Z
Assassas77
50106
Page créée avec « Disclaimer (en cours de réflexion) Aller consulter un médecin en cas de symptômes médicaux important. Solutions recommandées ne sont que des exemples de produits. Trouvez ce qui vous convient dans les commerces de confiance. »
768905
wikitext
text/x-wiki
Disclaimer (en cours de réflexion)
Aller consulter un médecin en cas de symptômes médicaux important.
Solutions recommandées ne sont que des exemples de produits. Trouvez ce qui vous convient dans les commerces de confiance.
0uhitf8tq7ke6rh5tomqyhi3q6bbsev
768943
768905
2026-06-29T11:40:59Z
Assassas77
50106
HotCat : [[Category:101 fiches pratiques pour survivre aux canicules (livre)]] ajoutée avec [[Help:Gadget-HotCat|HotCat]]
768943
wikitext
text/x-wiki
Disclaimer (en cours de réflexion)
Aller consulter un médecin en cas de symptômes médicaux important.
Solutions recommandées ne sont que des exemples de produits. Trouvez ce qui vous convient dans les commerces de confiance.
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]
b6y9sfqt7hop714myjoo8p3b2zj3q64
768945
768943
2026-06-29T11:41:21Z
Assassas77
50106
768945
wikitext
text/x-wiki
Disclaimer (en cours de réflexion)
Le Manisfeste du livre
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]
c1x0a5anghc9vnavn7jd2amh4knv69k
768946
768945
2026-06-29T11:41:28Z
Assassas77
50106
768946
wikitext
text/x-wiki
Disclaimer (en cours de réflexion)
Le Manifeste du livre
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]
dfbpe0e1zqe34os9bn664weel9x6q92
768948
768946
2026-06-29T11:41:59Z
Assassas77
50106
HotCat : new key for [[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]: "Préambule"
768948
wikitext
text/x-wiki
Disclaimer (en cours de réflexion)
Le Manifeste du livre
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|Préambule]]
aq3gm1mcbgwux9i3rup3gvo3piawb5z
101FPCanicules/Avertissement médical
0
83987
768922
2026-06-29T11:30:17Z
Assassas77
50106
Page créée avec « Aller consulter un médecin en cas de symptômes médicaux important. »
768922
wikitext
text/x-wiki
Aller consulter un médecin en cas de symptômes médicaux important.
2b2ig4xwyte9estxyotfmv9a2m5zgzd
768923
768922
2026-06-29T11:30:46Z
Assassas77
50106
768923
wikitext
text/x-wiki
<div style=bgcolor:red;>Aller consulter un médecin en cas de symptômes médicaux important.</div>
mlnpv4kr41xur7503rzyhj7e5c3ej3y
768924
768923
2026-06-29T11:30:58Z
Assassas77
50106
768924
wikitext
text/x-wiki
<div style="background-color:red;">Aller consulter un médecin en cas de symptômes médicaux important.</div>
psj3x4j2pyc4n87hc0c4ktjbywpk4iq
768925
768924
2026-06-29T11:31:07Z
Assassas77
50106
768925
wikitext
text/x-wiki
<div style="background-color:pink;">Aller consulter un médecin en cas de symptômes médicaux important.</div>
2uwrf8sd8058o04yy6vg3k24xzcfg29
768926
768925
2026-06-29T11:31:23Z
Assassas77
50106
768926
wikitext
text/x-wiki
<div style="background-color:pink;">Ce livre ne remplace pas le conseil d'un médecin.
Aller consulter un médecin en cas de symptômes médicaux important.</div>
3xkrhv2wetppez9ypyukhqehe0s3dfk
768927
768926
2026-06-29T11:31:28Z
Assassas77
50106
768927
wikitext
text/x-wiki
<div style="background-color:pink;">Ce livre ne remplace pas le conseil d'un médecin.
Aller consulter un médecin en cas de symptômes médicaux important.</div>
4sf5booc32bga88cci6lr7he712n356
768928
768927
2026-06-29T11:31:48Z
Assassas77
50106
768928
wikitext
text/x-wiki
<div style="background-color:pink;">
* Ce livre ne remplace pas le conseil d'un médecin.
* Aller consulter un médecin en cas de symptômes médicaux important.
</div>
igd9suunrdwmcl10zr72mwq4jv8prpe
768934
768928
2026-06-29T11:34:05Z
Assassas77
50106
768934
wikitext
text/x-wiki
<div style="background-color:pink;">
Ce livre ne remplace pas le conseil d'un médecin.
* Aller consulter un médecin en cas de symptômes médicaux important.
</div>
reggymen1dbgtvni5r78xryux25bmnt
101FPCanicules/Avertissement publicitaire
0
83988
768929
2026-06-29T11:32:22Z
Assassas77
50106
Page créée avec « <div style="background-color:green;"> *Solutions recommandées ne sont que des exemples de produits. *Trouvez ce qui vous convient dans les commerces de confiance. </div> »
768929
wikitext
text/x-wiki
<div style="background-color:green;">
*Solutions recommandées ne sont que des exemples de produits.
*Trouvez ce qui vous convient dans les commerces de confiance.
</div>
2xdeyhbwqu6ybr3jatdeyhe5m8h573w
768930
768929
2026-06-29T11:32:29Z
Assassas77
50106
768930
wikitext
text/x-wiki
<div style="background-color:light-green;">
*Solutions recommandées ne sont que des exemples de produits.
*Trouvez ce qui vous convient dans les commerces de confiance.
</div>
j1ewvgvog3fvkx64i4addz928rkhhbm
768931
768930
2026-06-29T11:33:28Z
Assassas77
50106
768931
wikitext
text/x-wiki
<div style="background-color:SteelBlue;">
*Solutions recommandées ne sont que des exemples de produits.
*Trouvez ce qui vous convient dans les commerces de confiance.
</div>
tflpqh4k5vhbvqwg63grv2nncjmhqt4
768932
768931
2026-06-29T11:33:42Z
Assassas77
50106
768932
wikitext
text/x-wiki
<div style="background-color:SkyBlue;">
*Solutions recommandées ne sont que des exemples de produits.
*Trouvez ce qui vous convient dans les commerces de confiance.
</div>
pigfge7gjlx1gs0not1qzhbcvzul5kj
768933
768932
2026-06-29T11:33:55Z
Assassas77
50106
768933
wikitext
text/x-wiki
<div style="background-color:SkyBlue;">
Solutions recommandées ne sont que des exemples de produits.
*Trouvez ce qui vous convient dans les commerces de confiance.
</div>
p8t5gu2ir70h2vc1tovy4flhpfox7qk
Catégorie:101 fiches pratiques pour survivre aux canicules (livre)
14
83989
768941
2026-06-29T11:39:59Z
Assassas77
50106
Page créée avec « [[Catégorie:Livres par titre]] »
768941
wikitext
text/x-wiki
[[Catégorie:Livres par titre]]
byj94gswnzlmcbwr6da11iec2183tju
768942
768941
2026-06-29T11:40:32Z
Assassas77
50106
HotCat : new key for [[Catégorie:Livres par titre]]: "Fiches pratiques pour survivre aux canicules"
768942
wikitext
text/x-wiki
[[Catégorie:Livres par titre|Fiches pratiques pour survivre aux canicules]]
sg1rbxabcfe1gs0znb4q37ozd2kku18
Catégorie:101FPCanicules climat tempéré
14
83990
768949
2026-06-29T11:43:59Z
Assassas77
50106
Page créée avec « [[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|climat]] »
768949
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|climat]]
5ycku6iaehvqwk392xcv27etyx57q76
Catégorie:101FPCanicules coût élevé
14
83991
768950
2026-06-29T11:44:59Z
Assassas77
50106
Page vide créée
768950
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
768951
768950
2026-06-29T11:45:08Z
Assassas77
50106
HotCat : [[Category:101 fiches pratiques pour survivre aux canicules (livre)]] ajoutée avec [[Help:Gadget-HotCat|HotCat]]
768951
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]
6q9jkvhaie4aexj8jo5l3j62lgepfsw
768952
768951
2026-06-29T11:45:25Z
Assassas77
50106
HotCat : Nouvelle clé pour [[Category:101 fiches pratiques pour survivre aux canicules (livre)]]: "€" avec [[Help:Gadget-HotCat|HotCat]]
768952
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|€]]
re4u9lzm60kzewair7p6n8l1idw6w3y
101FPCanicules effort modéré
0
83992
768953
2026-06-29T11:46:28Z
Assassas77
50106
Page vide créée
768953
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
768954
768953
2026-06-29T11:46:33Z
Assassas77
50106
HotCat : [[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]] ajoutée
768954
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]
6q9jkvhaie4aexj8jo5l3j62lgepfsw
768955
768954
2026-06-29T11:46:39Z
Assassas77
50106
HotCat : new key for [[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]: "E"
768955
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|E]]
q10j6s0hwmdg11wbhi0ollpefi44xiq
768958
768955
2026-06-29T11:47:45Z
Assassas77
50106
768958
wikitext
text/x-wiki
{{supprimer}}
1zt11nqqh8ntz3xvo3rgtjd7rvnansr
768959
768958
2026-06-29T11:47:55Z
Assassas77
50106
768959
wikitext
text/x-wiki
{{Suppression immédiate}}
suorh7asj63hmqoko5uloybxmrf61mi
768961
768959
2026-06-29T11:48:08Z
Assassas77
50106
768961
wikitext
text/x-wiki
{{Suppression Immédiate}}
1qpkmkh5oc0qqk088z7wod2lruitsil
768962
768961
2026-06-29T11:48:26Z
Assassas77
50106
768962
wikitext
text/x-wiki
{{Suppression Immédiate|Je me suis trompé, je voulais créer la catégorie au lieu de créer une page. :/}}
n0o46fkob186stth2jwcqyqhqzmgq14
Catégorie:101FPCanicules effort modéré
14
83993
768956
2026-06-29T11:47:08Z
Assassas77
50106
Page vide créée
768956
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
768957
768956
2026-06-29T11:47:15Z
Assassas77
50106
HotCat : [[Category:101 fiches pratiques pour survivre aux canicules (livre)]] ajoutée avec [[Help:Gadget-HotCat|HotCat]]
768957
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]
6q9jkvhaie4aexj8jo5l3j62lgepfsw
768966
768957
2026-06-29T11:49:59Z
Assassas77
50106
HotCat : Nouvelle clé pour [[Category:101 fiches pratiques pour survivre aux canicules (livre)]]: "E" avec [[Help:Gadget-HotCat|HotCat]]
768966
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|E]]
q10j6s0hwmdg11wbhi0ollpefi44xiq
Catégorie:101FPCanicules pendant une canicule
14
83994
768963
2026-06-29T11:49:16Z
Assassas77
50106
Page vide créée
768963
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
768964
768963
2026-06-29T11:49:23Z
Assassas77
50106
HotCat : [[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]] ajoutée
768964
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]
6q9jkvhaie4aexj8jo5l3j62lgepfsw
768965
768964
2026-06-29T11:49:42Z
Assassas77
50106
HotCat : new key for [[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]: "p"
768965
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|p]]
m55415u6h40i9mv90nye0p1gtulxhod
768967
768965
2026-06-29T11:50:31Z
Assassas77
50106
HotCat : Nouvelle clé pour [[Category:101 fiches pratiques pour survivre aux canicules (livre)]]: "t" avec [[Help:Gadget-HotCat|HotCat]]
768967
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|t]]
nym1usaz2yhbzpbn62at4da4h1u51v3
768968
768967
2026-06-29T11:51:05Z
Assassas77
50106
HotCat : Nouvelle clé pour [[Category:101 fiches pratiques pour survivre aux canicules (livre)]]: "P" avec [[Help:Gadget-HotCat|HotCat]]
768968
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|P]]
ntn5yd41kk65oa0ldqkt2cm8f3xe71g
Catégorie:101FPCanicules lowtech
14
83995
768969
2026-06-29T11:51:33Z
Assassas77
50106
Page vide créée
768969
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
768970
768969
2026-06-29T11:51:41Z
Assassas77
50106
HotCat : [[Category:101 fiches pratiques pour survivre aux canicules (livre)]] ajoutée avec [[Help:Gadget-HotCat|HotCat]]
768970
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]
6q9jkvhaie4aexj8jo5l3j62lgepfsw
768971
768970
2026-06-29T11:54:18Z
Assassas77
50106
HotCat : Nouvelle clé pour [[Category:101 fiches pratiques pour survivre aux canicules (livre)]]: "T" avec [[Help:Gadget-HotCat|HotCat]]
768971
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|T]]
jdac35im6u2ns40yyzn689jy02oy1o6
768972
768971
2026-06-29T11:55:25Z
Assassas77
50106
768972
wikitext
text/x-wiki
Ces fiches pratiques concernent des solutions qui nécessitent pas ou peu d'investissement matériel ou fait appel à de la récup'.
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|T]]
n2w0k247z6s9zy5laf0y6c9b6dji5gg
768973
768972
2026-06-29T11:55:43Z
Assassas77
50106
768973
wikitext
text/x-wiki
Ces fiches pratiques concernent des solutions qui nécessitent pas ou peu d'investissement matériel ou fait appel à de la récup'. Plus les solutions sont low-tech, plus elles sont simples à maintenir.
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|T]]
fyvd2z7ho98dznjh2ulcw78h63sdqak
Catégorie:101FPCanicules chez soi
14
83996
768974
2026-06-29T11:56:28Z
Assassas77
50106
Page vide créée
768974
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
768975
768974
2026-06-29T11:56:41Z
Assassas77
50106
HotCat : [[Category:101 fiches pratiques pour survivre aux canicules (livre)]] ajoutée avec [[Help:Gadget-HotCat|HotCat]]
768975
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]
6q9jkvhaie4aexj8jo5l3j62lgepfsw
768976
768975
2026-06-29T11:56:48Z
Assassas77
50106
HotCat : new key for [[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)]]: "L"
768976
wikitext
text/x-wiki
[[Catégorie:101 fiches pratiques pour survivre aux canicules (livre)|L]]
am75xv58r6cwn811g5ph3pil6mlmx8p
101FPCanicule
0
83997
768980
2026-06-29T11:58:55Z
Assassas77
50106
Page créée avec « REDIRECTION [[101FPCanicules]] »
768980
wikitext
text/x-wiki
REDIRECTION [[101FPCanicules]]
3g7zepq6xon2naasohyrm9w39pvc1m9