Wikilivres
frwikibooks
https://fr.wikibooks.org/wiki/Accueil
MediaWiki 1.46.0-wmf.24
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
Wikijunior:Alphabet/I
102
54009
765053
651739
2026-04-25T17:12:29Z
~2026-25430-78
123613
765053
wikitext
text/x-wiki
<div style="text-align: center; font-size: 400%;">'''I''' comme '''I'''gloo</div>
[[File:Un igloo ma non siamo in alaska ma nei pressi della Pala di Santa - panoramio.jpg|center|thumb|545x545px]]
{{../Bas de page|H|J}}
{{Son|1=Igloo|2=Fr-Paris--igloo.ogg}}
[[az:Vikiuşaq:Əlifba/I]]
[[en:Wikijunior:Alphabet/I]]
[[tr:Vikiçocuk:Alfabe/I]]
[[Catégorie:Alphabet (livre)|I]]
81m9sdg7a5rg28g2u20m4lqrivx9fa0
765058
765053
2026-04-25T17:22:45Z
~2026-25430-78
123613
765058
wikitext
text/x-wiki
<div style="text-align: center; font-size: 400%;">'''I''' comme '''I'''gloo</div>
[[Fichier:Un igloo ma non siamo in alaska ma nei pressi della Pala di Santa - panoramio.jpg|center|thumb|545x545px]]
{{../Bas de page|H|J}}
{{Son|1=Igloo|2=Fr-Paris--igloo.ogg}}
[[az:Vikiuşaq:Əlifba/I]]
[[en:Wikijunior:Alphabet/I]]
[[tr:Vikiçocuk:Alfabe/I]]
[[Catégorie:Alphabet (livre)|I]]
pspm5qic17tntketb1dpqrq4x8o26zq
Wikijunior:Alphabet/K
102
54011
765054
651741
2026-04-25T17:15:55Z
~2026-25430-78
123613
765054
wikitext
text/x-wiki
<div style="text-align: center; font-size: 400%;">'''K''' comme '''K'''angourou</div>
[[File:Kangaroo Australia 01 11 2008 - retouch.JPG|center|thumb|474x474px]]
{{../Bas de page|J|L}}
{{Son|1=Un kangourou|2=Fr-kangourou.ogg}}
[[az:Vikiuşaq:Əlifba/K]]
[[en:Wikijunior:Alphabet/K]]
[[tr:Vikiçocuk:Alfabe/K]]
[[Catégorie:Alphabet (livre)|K]]
sa5x7nc4z30dqb2c8yog3sbw3163q6z
765059
765054
2026-04-25T17:22:57Z
~2026-25430-78
123613
765059
wikitext
text/x-wiki
<div style="text-align: center; font-size: 400%;">'''K''' comme '''K'''angourou</div>
[[Fichier:Kangaroo Australia 01 11 2008 - retouch.JPG|center|thumb|474x474px]]
{{../Bas de page|J|L}}
{{Son|1=Un kangourou|2=Fr-kangourou.ogg}}
[[az:Vikiuşaq:Əlifba/K]]
[[en:Wikijunior:Alphabet/K]]
[[tr:Vikiçocuk:Alfabe/K]]
[[Catégorie:Alphabet (livre)|K]]
bjsouolxq4j8z3n7ppk33g4uw1mtdez
Wikijunior:Alphabet/R
102
54020
765055
743782
2026-04-25T17:18:07Z
~2026-25430-78
123613
765055
wikitext
text/x-wiki
<div style="text-align: center; font-size: 400%;">'''R''' comme '''R'''at</div>
[[Fichier:Brown rat illustration.png|border|center|500x500px]]
{{../Bas de page|Q|S}}
{{Son|1=Route|2=Fr-Route-fr-Paris.ogg}}
[[az:Vikiuşaq:Əlifba/R]]
[[en:Wikijunior:Alphabet/R]]
[[tr:Vikiçocuk:Alfabe/R]]
[[Catégorie:Alphabet (livre)|R]]
mweja7hvf3m9mwphcpssoikalka8hrj
765060
765055
2026-04-25T17:23:08Z
~2026-25430-78
123613
rat
765060
wikitext
text/x-wiki
<div style="text-align: center; font-size: 400%;">'''R''' comme '''R'''at</div>
[[Fichier:Brown rat illustration.png|border|center|500x500px]]
{{../Bas de page|Q|S}}
{{Son|1=Route|2=Fr-Route-fr-Paris.ogg}}
[[az:Vikiuşaq:Əlifba/R]]
[[en:Wikijunior:Alphabet/R]]
[[tr:Vikiçocuk:Alfabe/R]]
[[Catégorie:Alphabet (livre)|R]]
spv0i0852umht2rlbj2rz1cfwn53kgh
765110
765060
2026-04-26T08:04:08Z
JackPotte
5426
[[Discussion utilisateur:~2026-25430-78]]. Annulation de 2 modifications à partir de la version [[Special:Diff/765055|765055]] jusqu'à la version [[Special:Diff/765060|765060]]
765110
wikitext
text/x-wiki
<div style="text-align: center; font-size: 400%;">'''R''' comme '''R'''oute</div>
[[Fichier:Road in Norway.jpg|center|500px]]
{{../Bas de page|Q|S}}
{{Son|1=Route|2=Fr-Route-fr-Paris.ogg}}
[[az:Vikiuşaq:Əlifba/R]]
[[en:Wikijunior:Alphabet/R]]
[[tr:Vikiçocuk:Alfabe/R]]
[[Catégorie:Alphabet (livre)|R]]
8gbiqnn3b0n8o2ypterk00q9f51h9x4
Wikijunior:Alphabet/V
102
54029
765056
651752
2026-04-25T17:21:50Z
~2026-25430-78
123613
765056
wikitext
text/x-wiki
<div style="text-align: center; font-size: 400%;">'''V''' comme '''Vache'''</div>
[[Fichier:Cow-IMG_2050.JPG|center|750x750px]]
{{../Bas de page|U|W}}
{{Son|1=Un volcan|2=Fr-volcan.ogg}}
[[az:Vikiuşaq:Əlifba/V]]
[[en:Wikijunior:Alphabet/V]]
[[tr:Vikiçocuk:Alfabe/V]]
[[Catégorie:Alphabet (livre)|V]]
mzck4ohl2e6vle6r7w72vbo82t94n9g
765057
765056
2026-04-25T17:22:32Z
~2026-25430-78
123613
vache
765057
wikitext
text/x-wiki
<div style="text-align: center; font-size: 400%;">'''V''' comme '''Vache'''</div>
[[Fichier:Cow-IMG_2050.JPG|center|750x750px]]
{{../Bas de page|U|W}}
{{Son|1=Un volcan|2=Fr-volcan.ogg}}
[[az:Vikiuşaq:Əlifba/V]]
[[en:Wikijunior:Alphabet/V]]
[[tr:Vikiçocuk:Alfabe/V]]
[[Catégorie:Alphabet (livre)|V]]
if0uro7tjaundpczynefmpz3ion56lm
765061
765057
2026-04-25T17:26:29Z
~2026-25430-78
123613
765061
wikitext
text/x-wiki
<div style="text-align: center; font-size: 400%;">'''V''' comme '''V'''ache</div>
[[Fichier:Cow-IMG_2050.JPG|center|750x750px]]
{{../Bas de page|U|W}}
{{Son|1=Un volcan|2=Fr-volcan.ogg}}
[[az:Vikiuşaq:Əlifba/V]]
[[en:Wikijunior:Alphabet/V]]
[[tr:Vikiçocuk:Alfabe/V]]
[[Catégorie:Alphabet (livre)|V]]
8jj5d25pa84rso6h80l20t50uxhsn2v
765108
765061
2026-04-26T08:01:31Z
JackPotte
5426
Révocation de 3 modifications de [[Special:Contributions/~2026-25430-78|~2026-25430-78]] ([[User talk:~2026-25430-78|discussion]]) vers la dernière version de [[User:DavidL|DavidL]]
651752
wikitext
text/x-wiki
<div style="text-align: center; font-size: 400%;">'''V''' comme '''V'''olcan</div>
[[Fichier:Augustine Volcano Jan 12 2006.jpg|center|500px]]
{{../Bas de page|U|W}}
{{Son|1=Un volcan|2=Fr-volcan.ogg}}
[[az:Vikiuşaq:Əlifba/V]]
[[en:Wikijunior:Alphabet/V]]
[[tr:Vikiçocuk:Alfabe/V]]
[[Catégorie:Alphabet (livre)|V]]
t3ksndys7pwnvvyhz7ldan8od7p762y
Fonctionnement d'un ordinateur/L'adressage des périphériques
0
65771
765041
764842
2026-04-25T16:43:34Z
Mewtow
31375
/* Les bus unifiés et les bus d'entrée-sortie */
765041
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Les bus unifiés et les bus d'entrée-sortie==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus.
Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
===Le contrôleur DMA sur un bus partagé ou avec un répartiteur===
L'usage d'un bus dédié a des avantages et des désavantages. L'un des désavantages est lié à l'implémentation du ''Direct Memory Access''. Un bus dédié aux IO marche assez mal avec le DMA. Les échanges entre mémoire RAM et IO doivent passer par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU. En clair : impossible d'utiliser le ''Direct Memory Access''.
À l'opposé, un contrôleur DMA est très adapté à un système avec un bus système, un bus partagé entre CPU, RAM et IO. Le controleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour implémenter le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
==L'implémentation d'un bus IO dédié avec un multiplexeur d'IO==
Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
: Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
==L'implémentation matérielle de l'espace d'adressage séparé/unifié==
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
15siw13w0c9rjv7sdfm2t1lpsw3qbcu
765042
765041
2026-04-25T16:44:08Z
Mewtow
31375
/* Le contrôleur DMA sur un bus partagé ou avec un répartiteur */
765042
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Les bus unifiés et les bus d'entrée-sortie==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus.
Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
===L'implémentation du DMA suivant le bus utilisé===
L'usage d'un bus dédié a des avantages et des désavantages. L'un des désavantages est lié à l'implémentation du ''Direct Memory Access''. Un bus dédié aux IO marche assez mal avec le DMA. Les échanges entre mémoire RAM et IO doivent passer par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU. En clair : impossible d'utiliser le ''Direct Memory Access''.
À l'opposé, un contrôleur DMA est très adapté à un système avec un bus système, un bus partagé entre CPU, RAM et IO. Le controleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour implémenter le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
==L'implémentation d'un bus IO dédié avec un multiplexeur d'IO==
Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
: Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
==L'implémentation matérielle de l'espace d'adressage séparé/unifié==
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
3hqamrga29yfpir7kk7om4bc2x55td5
765043
765042
2026-04-25T16:50:50Z
Mewtow
31375
765043
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Les bus unifiés et les bus d'entrée-sortie==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus.
Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
===L'implémentation du DMA suivant le bus utilisé===
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus dédié ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==L'implémentation matérielle de l'espace d'adressage séparé/unifié==
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'adressage des entrées-sorties : les multiplexeurs d'IO==
Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
: Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
au4hte07o2ry4s1qj62qc6hozur2z7a
765044
765043
2026-04-25T16:51:13Z
Mewtow
31375
/* L'implémentation matérielle de l'espace d'adressage séparé/unifié */
765044
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Les bus unifiés et les bus d'entrée-sortie==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus.
Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
===L'implémentation du DMA suivant le bus utilisé===
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus dédié ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
===L'implémentation matérielle de l'espace d'adressage séparé/unifié===
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'adressage des entrées-sorties : les multiplexeurs d'IO==
Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
: Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
2p81q1lrja08lxa0fmvxruf2wjsofl4
765045
765044
2026-04-25T16:51:33Z
Mewtow
31375
/* Les bus unifiés et les bus d'entrée-sortie */
765045
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Les bus unifiés et les bus d'entrée-sortie==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus.
Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus dédié ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==L'adressage des entrées-sorties : les multiplexeurs d'IO==
Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
: Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
mynbkpacw5gszg7ivjzdoz5kihzwr1l
765046
765045
2026-04-25T16:52:13Z
Mewtow
31375
/* Les bus unifiés et les bus d'entrée-sortie */
765046
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Les bus unifiés et les bus d'entrée-sortie==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus dédié ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==L'adressage des entrées-sorties : les multiplexeurs d'IO==
Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
: Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
jpgs91f0fds48egofhz44hp3x7m4fa0
765047
765046
2026-04-25T16:53:18Z
Mewtow
31375
/* Les bus unifiés et les bus d'entrée-sortie */
765047
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Les bus unifiés et les bus d'entrée-sortie==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée.
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus dédié ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==L'adressage des entrées-sorties : les multiplexeurs d'IO==
Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
: Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
t2sed0xn5mk2omraj5ctbgyhgevytfh
765048
765047
2026-04-25T16:59:11Z
Mewtow
31375
/* L'adressage des entrées-sorties : les multiplexeurs d'IO */
765048
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Les bus unifiés et les bus d'entrée-sortie==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée.
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus dédié ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==L'adressage des entrées-sorties : les multiplexeurs d'IO==
Les bus dédiés aux entrées-sorties connectent un processeur à des entrées-sorties et à rien d'autre. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
2vbfrx00pkc0vxecyb1wk5k5ecb1eh7
765049
765048
2026-04-25T16:59:51Z
Mewtow
31375
/* Les bus unifiés et les bus d'entrée-sortie */
765049
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée.
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus dédié ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==L'adressage des entrées-sorties : les multiplexeurs d'IO==
Les bus dédiés aux entrées-sorties connectent un processeur à des entrées-sorties et à rien d'autre. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
sm2kp7e7v6mc1ecqz15rxkgo9ksd1al
765050
765049
2026-04-25T17:01:08Z
Mewtow
31375
/* Le décodage d'adresse et son implémentation */
765050
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus dédié ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==L'adressage des entrées-sorties : les multiplexeurs d'IO==
Les bus dédiés aux entrées-sorties connectent un processeur à des entrées-sorties et à rien d'autre. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
mtm3f3rglcdzaaqefh6v0vqfeujkj4k
765051
765050
2026-04-25T17:02:11Z
Mewtow
31375
/* L'implémentation du DMA suivant le bus utilisé */
765051
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==L'adressage des entrées-sorties : les multiplexeurs d'IO==
Les bus dédiés aux entrées-sorties connectent un processeur à des entrées-sorties et à rien d'autre. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
5tmix2vc73fi4so68ezzml9x93f5hd6
765052
765051
2026-04-25T17:03:06Z
Mewtow
31375
/* L'adressage des entrées-sorties : les multiplexeurs d'IO */
765052
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==L'adressage des entrées-sorties : les multiplexeurs d'IO==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
g4m60jqhaimrlcly9wpgwg11zx3lg3q
765062
765052
2026-04-25T17:31:22Z
Mewtow
31375
/* L'adressage des entrées-sorties : les multiplexeurs d'IO */
765062
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==L'adressage des entrées-sorties : les multiplexeurs d'IO==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
59so4slzkxbqoerqtydpfcvlak9qcse
765063
765062
2026-04-25T17:31:35Z
Mewtow
31375
/* L'adressage des entrées-sorties : les multiplexeurs d'IO */
765063
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==L'adressage sur les bus dédiés==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
4vnfbgqwjyo9qp1exukbr2xqc9ztpwl
765064
765063
2026-04-25T17:32:02Z
Mewtow
31375
/* L'adressage sur les bus dédiés */
765064
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
j0ol8x5op7bse7thivlve4fr18khgt6
765065
765064
2026-04-25T17:37:19Z
Mewtow
31375
/* Le multiplexeur d'entrée-sortie */
765065
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement. Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''.
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
0cy9leroii17x86pu7ei66kk0f1p0my
765066
765065
2026-04-25T17:42:40Z
Mewtow
31375
/* Le multiplexeur d'entrée-sortie */
765066
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux.
Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, obligatoire
|}
Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit.
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
crodi2r2mc16udqcp6zzhi5rhswfwph
765067
765066
2026-04-25T18:40:44Z
Mewtow
31375
765067
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses.
==Rappels : l'espace d'adressage unifié ou séparé==
Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques.
===L'espace d’adressage séparé===
Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde technique s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
aedkp03pynbxh7vltqodzy5a9ru7zx7
765068
765067
2026-04-25T18:46:08Z
Mewtow
31375
765068
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
rwgwffps6my0de0rnue8y1vni1dvbfh
765069
765068
2026-04-25T20:13:07Z
Mewtow
31375
/* L'Intel 8255 : un MUX IO ancien */
765069
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités. Les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le PIO des Rasberry Pi. Il s'agit d'un coprocesseur IO intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un controleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
mo7njw746q870ubay1w0wyhe41b14w9
765070
765069
2026-04-25T20:13:25Z
Mewtow
31375
765070
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités. Les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le PIO des Rasberry Pi. Il s'agit d'un coprocesseur IO intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un controleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
3bex6d9r9edg2ilp1a7gs2fy9zpsm10
765071
765070
2026-04-25T20:30:37Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765071
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités. Les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un controleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intégrent 4 registres, plus un ''program counter''. Il y a deux registres X et Y qui servent à manipuler des données. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le registre ''Out Shift'' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Mais il est aussi possible de faire le transfére
sa destination. Le transfert peut se faire soit bit par bit, soit par blocs de N bits, soit d'un seul coup (32 bits d'un coup). Tous les transferts de 1 à 32 bits en même temps sont possibles. Le registre est décale automatiquement à chaque fois qu'on transfère N bits.
Le registre ''In Shift'' fait l'inverse : il accumule un flux de bit provenant d'une broche, détecte quand il a une donnée complète, et la transfère en bloc vers une mémoire FIFO.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
ksmn32taq1im0odq7xdg4e8iiqxqsv9
765072
765071
2026-04-25T20:33:56Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765072
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités. Les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un controleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intégrent 4 registres, plus un ''program counter''. Il y a deux registres X et Y qui servent à manipuler des données. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le registre ''Out Shift'' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le registre ''In Shift'' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
25h7nxf4kmopvhizlx4lqyty27aphqi
765073
765072
2026-04-25T20:35:21Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765073
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités. Les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un controleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intégrent 4 registres, plus un ''program counter''. Il y a deux registres X et Y qui servent à manipuler des données. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le registre ''Out Shift'' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le registre ''In Shift'' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
k2blhq3cv6tjsidl0e520veq07wr2am
765074
765073
2026-04-25T20:37:39Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765074
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités. Les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un controleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intégrent 4 registres, plus un ''program counter'' et des registres de configuration. Il y a deux registres X et Y qui servent à manipuler des données. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le registre ''Out Shift'' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le registre ''In Shift'' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
okvxzmyq0vvj3xl29oabtvtse6pk76d
765078
765074
2026-04-25T20:40:18Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765078
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités. Les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un controleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intégrent 4 registres, plus un ''program counter'' et des registres de configuration. Il y a deux registres X et Y qui servent à manipuler des données. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le registre ''Out Shift'' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le registre ''In Shift'' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
dboip767tdycm45lo9n7bliyp76u1bo
765079
765078
2026-04-25T20:53:59Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765079
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités. Les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un controleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intégrent 4 registres, plus un ''program counter'' et des registres de configuration. Il y a deux registres X et Y qui servent à manipuler des données. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET WAIT INT sont elles plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs. Les instructions sont encodées sur 16 bits.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
8qnf5aeueq356zo721i1s02e8eb6njy
765080
765079
2026-04-25T21:01:17Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765080
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités. Les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les broches d'entrée, ou le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les broches de sortie, directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs. Les instructions sont encodées sur 16 bits.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
q4i37c0z5cwct957caziqvsa853nmvw
765082
765080
2026-04-25T21:05:37Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765082
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités. Les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs. Les instructions sont encodées sur 16 bits.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
7b2w4w8t5jox67kukpoprwo7laimwhw
765083
765082
2026-04-25T21:23:24Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765083
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités. Les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs. Les instructions sont encodées sur 16 bits.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
mlfa3abbbifhjjmsdb35tms4h79aj4i
765084
765083
2026-04-25T21:26:45Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765084
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs. Les instructions sont encodées sur 16 bits.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
dceyx3lfvtr2tn5g19tvl7x5w61jg9x
765085
765084
2026-04-25T21:32:04Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765085
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits. Chaque coprocesseur I/O communique avec un port rien qu'à lui,. Cependant, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche, soit en utilisant la position d'une broche dans un port.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs. Les instructions sont encodées sur 16 bits.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
b0e9iv8z74qjuw10evr2xtdxejonogd
765086
765085
2026-04-25T21:44:31Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765086
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits. Chaque coprocesseur I/O communique avec un port rien qu'à lui,. Cependant, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche, soit en utilisant la position d'une broche dans un port.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Communiquer avec une entrée-sortie demande juste d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l'appelerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE. Il faut noter que la constante de ''side set'' et le retard forcé se partagent 5 bits. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants, sur 5 bits, sont utilisés pour la fonction de retard forcé.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
lclh53hg8qumdszk7ea1dygbnr7g8do
765087
765086
2026-04-25T21:47:06Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765087
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits. Chaque coprocesseur I/O communique avec un port rien qu'à lui,. Cependant, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche, soit en utilisant la position d'une broche dans un port.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Communiquer avec une entrée-sortie demande juste d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l'appelerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE. Il faut noter que la constante de ''side set'' et le retard forcé se partagent 5 bits. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants, sur 5 bits, sont utilisés pour la fonction de retard forcé.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
7qq5ptyz9nckpscwy0sw84k275k6211
765088
765087
2026-04-25T21:48:45Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765088
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits. Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Communiquer avec une entrée-sortie demande juste d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l'appelerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE. Il faut noter que la constante de ''side set'' et le retard forcé se partagent 5 bits. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants, sur 5 bits, sont utilisés pour la fonction de retard forcé.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
6ge9085us0sfwvmn8cc6lh5q90qsyka
765089
765088
2026-04-25T21:49:02Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765089
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO des Rasberry Pi'''. Il s'agit d'un super-circuit dédié aux entrées-sorties, qui est intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. L'IO MUX alimente 32 broches de sortie et 32 broches d'entrée.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
Les 32 broches d'entrée et de sortie sont configurables, à savoir qu'on peut les regrouper en autant de ports qu'on veut, qui ont la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits. Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Communiquer avec une entrée-sortie demande juste d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l'appelerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE. Il faut noter que la constante de ''side set'' et le retard forcé se partagent 5 bits. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants, sur 5 bits, sont utilisés pour la fonction de retard forcé.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
k18zvo31nl8lvdjofrs8o9s6jak992d
765090
765089
2026-04-25T21:57:30Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765090
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il dispose de 32 broches d'entrée errt de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Communiquer avec une entrée-sortie demande juste d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l'appelerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE. Il faut noter que la constante de ''side set'' et le retard forcé se partagent 5 bits. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants, sur 5 bits, sont utilisés pour la fonction de retard forcé.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
qp3fvifu53tnku5rqzb2ijrw3brre3l
765091
765090
2026-04-25T22:04:37Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765091
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il dispose de 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Communiquer avec une entrée-sortie demande juste d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l'appelerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE. Il faut noter que la constante de ''side set'' et le retard forcé se partagent 5 bits. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants, sur 5 bits, sont utilisés pour la fonction de retard forcé.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
7pqjy8g7xcxekj8l2n1h2k8p6d90f5d
765092
765091
2026-04-25T22:05:20Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765092
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il dispose de 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Communiquer avec une entrée-sortie demande juste d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l'appelerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE. Il faut noter que la constante de ''side set'' et le retard forcé se partagent 5 bits. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants, sur 5 bits, sont utilisés pour la fonction de retard forcé.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Opcode (3 bits) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
nmrlyldmwjjpgr1503pjz64gqq6uzr0
765093
765092
2026-04-25T22:05:43Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765093
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il dispose de 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Communiquer avec une entrée-sortie demande juste d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l'appelerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE. Il faut noter que la constante de ''side set'' et le retard forcé se partagent 5 bits. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants, sur 5 bits, sont utilisés pour la fonction de retard forcé.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
condrd87uggeyni6v3w8799euznpltf
765094
765093
2026-04-25T22:09:18Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765094
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il dispose de 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Leur encodage est décrit dans ce tableau, et vous devriez vous poser une question en le lisant : mais à quoi correspond ce champ "Délai/''side set''" ? Les explications vont suivre.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
Communiquer avec une entrée-sortie demande d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l’appellerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE.
La constante de ''side set'' et le retard forcé se partagent le champ de 5 bits nommé "Délai/''side set''". Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants, sur 5 bits, sont utilisés pour la fonction de retard forcé.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
96ko25hohdg4i3e5i5gy38b96148jox
765095
765094
2026-04-25T22:10:01Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765095
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il dispose de 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Leur encodage est décrit dans ce tableau, et vous devriez vous poser une question en le lisant : mais à quoi correspond ce champ "Délai/''side set''" ? Les explications vont suivre.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
Communiquer avec une entrée-sortie demande d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l’appellerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE.
La constante de ''side set'' et le retard forcé se partagent le champ de 5 bits nommé "Délai/''side set''". Les bits de poids fort sont réservés au ''side set'', les bits de poids fort sont pour le délai forcé. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants sont utilisés pour la fonction de retard forcé.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
ktpy24neyyt8pakca8tyg3hbdqar2mi
765096
765095
2026-04-25T22:15:48Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765096
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
[[File:Raspberry Pi GPIO.svg|thumb|Raspberry Pi GPIO]]
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il est connecté à un port extérieur, illustré ci-contre, qui regroupe 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Il regroupe des mémoires FIFOs, des coprocesseurs IO, une mémoire RAM pour les instructions, un contrôleur d'interruption dédié, et un IO MUX. Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
La mémoire d'instruction est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. Mais le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Cependant, pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Leur encodage est décrit dans ce tableau, et vous devriez vous poser une question en le lisant : mais à quoi correspond ce champ "Délai/''side set''" ? Les explications vont suivre.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
Communiquer avec une entrée-sortie demande d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l’appellerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE.
La constante de ''side set'' et le retard forcé se partagent le champ de 5 bits nommé "Délai/''side set''". Les bits de poids fort sont réservés au ''side set'', les bits de poids fort sont pour le délai forcé. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants sont utilisés pour la fonction de retard forcé.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
kqxz256ue9o5txf6n2u1oa3td5f48np
765097
765096
2026-04-25T22:22:39Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765097
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
[[File:Raspberry Pi GPIO.svg|thumb|Raspberry Pi GPIO]]
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il est connecté à un port extérieur, illustré ci-contre, qui regroupe 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Le PIO regroupe des mémoires FIFOs, un contrôleur d'interruption dédié, et un IO MUX, mais aussi et plus important : des coprocesseurs IO ! Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
Le PIO est fournit avec des programmes permettent de communiquer avec des UART, ou des bus SPI et I2C. D'où le fait que certaines broches soit attribuées de base à ces bus. Rassurez-vous : elles peuvent être réattribuées à volonté. Le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie. Pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les coprocesseurs I/O partagent une mémoire d'instruction. Elle est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Leur encodage est décrit dans ce tableau, et vous devriez vous poser une question en le lisant : mais à quoi correspond ce champ "Délai/''side set''" ? Les explications vont suivre.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
Communiquer avec une entrée-sortie demande d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l’appellerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE.
La constante de ''side set'' et le retard forcé se partagent le champ de 5 bits nommé "Délai/''side set''". Les bits de poids fort sont réservés au ''side set'', les bits de poids fort sont pour le délai forcé. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants sont utilisés pour la fonction de retard forcé.
Les coprocesseurs disposent aussi d'une fonctionnalité de '''''program wrapping'''''. Il permet de répéter en boucle le même programme, sans avoir à utiliser de branchements inconditionnels. Quand on atteint la fin du programme, le processeur redémarre directement au début du programme, il passe directement de la dernière instruction à la première. Il faut pour cela configurer l'adresse de la première instruction et de la dernière instruction, et activer l'option dans le registre de configuration adéquat.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
hyev0maqtxwau5jxn5i8kdv3n1k04l0
765098
765097
2026-04-25T22:23:39Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765098
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
[[File:Raspberry Pi GPIO.svg|thumb|Raspberry Pi GPIO]]
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il est connecté à un port extérieur, illustré ci-contre, qui regroupe 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Le PIO regroupe des mémoires FIFOs, un contrôleur d'interruption dédié, et un IO MUX, mais aussi et plus important : des coprocesseurs IO ! Le PIO est fournit avec des programmes permettant de communiquer avec des UART, ou des bus SPI et I2C. Ils sont exécutés chacun sur un coprocesseur I/O. D'où le fait que certaines broches soit attribuées de base à ces bus. Rassurez-vous : elles peuvent être réattribuées à volonté. Le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie.
Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
Pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les coprocesseurs I/O partagent une mémoire d'instruction. Elle est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est dans un autre registre.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Leur encodage est décrit dans ce tableau, et vous devriez vous poser une question en le lisant : mais à quoi correspond ce champ "Délai/''side set''" ? Les explications vont suivre.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
Communiquer avec une entrée-sortie demande d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l’appellerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE.
La constante de ''side set'' et le retard forcé se partagent le champ de 5 bits nommé "Délai/''side set''". Les bits de poids fort sont réservés au ''side set'', les bits de poids fort sont pour le délai forcé. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants sont utilisés pour la fonction de retard forcé.
Les coprocesseurs disposent aussi d'une fonctionnalité de '''''program wrapping'''''. Il permet de répéter en boucle le même programme, sans avoir à utiliser de branchements inconditionnels. Quand on atteint la fin du programme, le processeur redémarre directement au début du programme, il passe directement de la dernière instruction à la première. Il faut pour cela configurer l'adresse de la première instruction et de la dernière instruction, et activer l'option dans le registre de configuration adéquat.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
e5za2pcd1gkmrqj6d8ygv8xyydp459k
765099
765098
2026-04-25T22:25:40Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765099
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
[[File:Raspberry Pi GPIO.svg|thumb|Raspberry Pi GPIO]]
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il est connecté à un port extérieur, illustré ci-contre, qui regroupe 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits.
Le PIO regroupe des mémoires FIFOs, un contrôleur d'interruption dédié, et un IO MUX, mais aussi et plus important : des coprocesseurs IO ! Le PIO est fournit avec des programmes permettant de communiquer avec des UART, ou des bus SPI et I2C. Ils sont exécutés chacun sur un coprocesseur I/O. D'où le fait que certaines broches soit attribuées de base à ces bus. Rassurez-vous : elles peuvent être réattribuées à volonté. Le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie.
Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
Pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les coprocesseurs I/O partagent une mémoire d'instruction. Elle est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
Les 8 mémoires FIFO regroupent 4 FIFO d'entrée et 4 FIFOs de sortie, mais on peut les reconfigurer pour avoir 8 FIFOs allant dans le même sens.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est placé dans un autre registre et est décrémenté à chaque itération, automatiquement, sans utiliser d'instruction séparée.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Leur encodage est décrit dans ce tableau, et vous devriez vous poser une question en le lisant : mais à quoi correspond ce champ "Délai/''side set''" ? Les explications vont suivre.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
Communiquer avec une entrée-sortie demande d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l’appellerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE.
La constante de ''side set'' et le retard forcé se partagent le champ de 5 bits nommé "Délai/''side set''". Les bits de poids fort sont réservés au ''side set'', les bits de poids fort sont pour le délai forcé. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants sont utilisés pour la fonction de retard forcé.
Les coprocesseurs disposent aussi d'une fonctionnalité de '''''program wrapping'''''. Il permet de répéter en boucle le même programme, sans avoir à utiliser de branchements inconditionnels. Quand on atteint la fin du programme, le processeur redémarre directement au début du programme, il passe directement de la dernière instruction à la première. Il faut pour cela configurer l'adresse de la première instruction et de la dernière instruction, et activer l'option dans le registre de configuration adéquat.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
3knvouse1hf9vrih98lub2a25pytvk5
765100
765099
2026-04-25T22:27:05Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765100
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
[[File:Raspberry Pi GPIO.svg|thumb|Raspberry Pi GPIO]]
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il est connecté à un port extérieur, illustré ci-contre, qui regroupe 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits. La seule contrainte est que les broches d'un même port doivent être consécutives.
Le PIO regroupe des mémoires FIFOs, un contrôleur d'interruption dédié, et un IO MUX, mais aussi et plus important : des coprocesseurs IO ! Le PIO est fournit avec des programmes permettant de communiquer avec des UART, ou des bus SPI et I2C. Ils sont exécutés chacun sur un coprocesseur I/O. D'où le fait que certaines broches soit attribuées de base à ces bus. Rassurez-vous : elles peuvent être réattribuées à volonté. Le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie.
Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
Pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les coprocesseurs I/O partagent une mémoire d'instruction. Elle est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur, et cela permet d'utiliser une mémoire plus petite, mutualisée entre plusieurs programmes et plusieurs coprocesseurs.
Les 8 mémoires FIFO regroupent 4 FIFO d'entrée et 4 FIFOs de sortie, mais on peut les reconfigurer pour avoir 8 FIFOs allant dans le même sens.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est placé dans un autre registre et est décrémenté à chaque itération, automatiquement, sans utiliser d'instruction séparée.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Leur encodage est décrit dans ce tableau, et vous devriez vous poser une question en le lisant : mais à quoi correspond ce champ "Délai/''side set''" ? Les explications vont suivre.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
Communiquer avec une entrée-sortie demande d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l’appellerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE.
La constante de ''side set'' et le retard forcé se partagent le champ de 5 bits nommé "Délai/''side set''". Les bits de poids fort sont réservés au ''side set'', les bits de poids fort sont pour le délai forcé. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants sont utilisés pour la fonction de retard forcé.
Les coprocesseurs disposent aussi d'une fonctionnalité de '''''program wrapping'''''. Il permet de répéter en boucle le même programme, sans avoir à utiliser de branchements inconditionnels. Quand on atteint la fin du programme, le processeur redémarre directement au début du programme, il passe directement de la dernière instruction à la première. Il faut pour cela configurer l'adresse de la première instruction et de la dernière instruction, et activer l'option dans le registre de configuration adéquat.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
ntod99zupqes0qfrvp9lf4kgu2anazz
765101
765100
2026-04-25T22:29:24Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765101
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
[[File:Raspberry Pi GPIO.svg|thumb|Raspberry Pi GPIO]]
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il est connecté à un port extérieur, illustré ci-contre, qui regroupe 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits. La seule contrainte est que les broches d'un même port doivent être consécutives.
Le PIO regroupe des mémoires FIFOs, un contrôleur d'interruption dédié, et un IO MUX, mais aussi et plus important : des coprocesseurs IO ! Le PIO est fournit avec des programmes permettant de communiquer avec des UART, ou des bus SPI et I2C. Ils sont exécutés chacun sur un coprocesseur I/O. D'où le fait que certaines broches soit attribuées de base à ces bus. Rassurez-vous : elles peuvent être réattribuées à volonté. Le fait que les coprocesseur soient programmables permet de gérer n'importe quel bus ou entrée-sortie.
Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseur peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
Pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les coprocesseurs I/O partagent une mémoire d'instruction, capable de mémoriser 32 instructions maximum. C'est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur.
Les 8 mémoires FIFO regroupent 4 FIFO d'entrée et 4 FIFOs de sortie, mais on peut les reconfigurer pour avoir 8 FIFOs allant dans le même sens.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfére la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est placé dans un autre registre et est décrémenté à chaque itération, automatiquement, sans utiliser d'instruction séparée.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnels, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions , 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Leur encodage est décrit dans ce tableau, et vous devriez vous poser une question en le lisant : mais à quoi correspond ce champ "Délai/''side set''" ? Les explications vont suivre.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
Communiquer avec une entrée-sortie demande d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l’appellerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE.
La constante de ''side set'' et le retard forcé se partagent le champ de 5 bits nommé "Délai/''side set''". Les bits de poids fort sont réservés au ''side set'', les bits de poids fort sont pour le délai forcé. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants sont utilisés pour la fonction de retard forcé.
Les coprocesseurs disposent aussi d'une fonctionnalité de '''''program wrapping'''''. Il permet de répéter en boucle le même programme, sans avoir à utiliser de branchements inconditionnels. Quand on atteint la fin du programme, le processeur redémarre directement au début du programme, il passe directement de la dernière instruction à la première. Il faut pour cela configurer l'adresse de la première instruction et de la dernière instruction, et activer l'option dans le registre de configuration adéquat.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
49x124k2s1k2s5f5u2rc1839tft5nqr
765102
765101
2026-04-25T22:32:24Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765102
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
[[File:Raspberry Pi GPIO.svg|thumb|Raspberry Pi GPIO]]
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il est connecté à un port extérieur, illustré ci-contre, qui regroupe 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits. La seule contrainte est que les broches d'un même port doivent être consécutives.
Le PIO regroupe des mémoires FIFOs, un contrôleur d'interruption dédié, et un IO MUX, mais aussi et plus important : des coprocesseurs IO ! Le PIO est fourni avec des programmes permettant de communiquer avec des UART, ou des bus SPI et I2C. Ils sont exécutés chacun sur un coprocesseur I/O. D'où le fait que certaines broches soit attribuées de base à ces bus. Rassurez-vous : elles peuvent être réattribuées à volonté. Le fait que les coprocesseurs soient programmables permet de gérer n'importe quel bus ou entrée-sortie.
Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseurs peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
Pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les coprocesseurs I/O partagent une mémoire d'instruction, capable de mémoriser 32 instructions maximum. C'est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur.
Les 8 mémoires FIFO regroupent 4 FIFO d'entrée et 4 FIFOs de sortie, mais on peut les reconfigurer pour avoir 8 FIFOs allant dans le même sens.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples, qui exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfère la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est placé dans un autre registre et est décrémenté à chaque itération, automatiquement, sans utiliser d'instruction séparée.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnel, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions, 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Leur encodage est décrit dans ce tableau, et vous devriez vous poser une question en le lisant : mais à quoi correspond ce champ "Délai/''side set''" ? Les explications vont suivre.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
Communiquer avec une entrée-sortie demande d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. Le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l’appellerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE.
La constante de ''side set'' et le retard forcé se partagent le champ de 5 bits "Délai/''side set''". Les bits de poids fort sont réservés au ''side set'', les bits de poids fort sont pour le délai forcé. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants sont utilisés pour la fonction de retard forcé.
Les coprocesseurs disposent aussi d'une fonctionnalité de '''''program wrapping'''''. Il permet de répéter en boucle le même programme, sans avoir à utiliser de branchements inconditionnels. Quand on atteint la fin du programme, le processeur redémarre directement au début du programme, il passe directement de la dernière instruction à la première. Il faut pour cela configurer l'adresse de la première instruction et de la dernière instruction, et activer l'option dans le registre de configuration adéquat.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
814p36d50bolj6apuy85ulvilko3zt9
765103
765102
2026-04-25T22:35:02Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765103
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
[[File:Raspberry Pi GPIO.svg|thumb|Raspberry Pi GPIO]]
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il est connecté à un port extérieur, illustré ci-contre, qui regroupe 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits. La seule contrainte est que les broches d'un même port doivent être consécutives.
Le PIO regroupe un IO MUX avec gestion des interruptions, des mémoires FIFOs, mais aussi et surtout : des coprocesseurs IO ! Le PIO est fourni avec des programmes permettant de communiquer avec des UART, ou des bus SPI et I2C. Ils sont exécutés chacun sur un coprocesseur I/O. D'où le fait que certaines broches soit attribuées de base à ces bus. Rassurez-vous : elles peuvent être réattribuées à volonté. Le fait que les coprocesseurs soient programmables permet de gérer n'importe quel bus ou entrée-sortie.
Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseurs peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
Pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les coprocesseurs I/O partagent une mémoire d'instruction, capable de mémoriser 32 instructions maximum. C'est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur.
Les 8 mémoires FIFO regroupent 4 FIFO d'entrée et 4 FIFOs de sortie, mais on peut les reconfigurer pour avoir 8 FIFOs allant dans le même sens.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples et exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfère la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est placé dans un autre registre et est décrémenté à chaque itération, automatiquement, sans utiliser d'instruction séparée.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnel, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions, 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Pour résumer, les coprocesseurs I/O de ce type sont spécialisés dans la manipulation de bit, et ne gèrent que des décalages et des opérations de masquage. Pas d'opérations arithmétiques, un minimum de branchements, peu de registres. Par contre, ils ont des fonctionnalités de ''timing'' et de délais très poussées, comme on s’apprête à le voir en détail. Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Leur encodage est décrit dans ce tableau, et vous devriez vous poser une question en le lisant : mais à quoi correspond ce champ "Délai/''side set''" ? Les explications vont suivre.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
Communiquer avec une entrée-sortie demande d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. Le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l’appellerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE.
La constante de ''side set'' et le retard forcé se partagent le champ de 5 bits "Délai/''side set''". Les bits de poids fort sont réservés au ''side set'', les bits de poids fort sont pour le délai forcé. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants sont utilisés pour la fonction de retard forcé.
Les coprocesseurs disposent aussi d'une fonctionnalité de '''''program wrapping'''''. Il permet de répéter en boucle le même programme, sans avoir à utiliser de branchements inconditionnels. Quand on atteint la fin du programme, le processeur redémarre directement au début du programme, il passe directement de la dernière instruction à la première. Il faut pour cela configurer l'adresse de la première instruction et de la dernière instruction, et activer l'option dans le registre de configuration adéquat.
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
10g0y2rpekv3bgapbtzbxuw8yfeqqgn
765104
765103
2026-04-25T22:36:00Z
Mewtow
31375
/* Le PIO des Rasberry Pi */
765104
wikitext
text/x-wiki
Dans le chapitre précédent, nous avons vu comment que contrôleur de périphérique dispose de registres d’interfaçage, dans lequel le processeur écrit des commandes ou lit l'état du périphérique. Les registres interfaçage disposent pour cela d'une adresse, similaire à l'adresse mémoire. Mais nous n'avons pas vu comment le processeur utilise ces adresses. Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire.
==Rappels : l'espace d'adressage unifié ou séparé==
Voyons d'abord comment les adresses des registres d’interfaçage sont gérées par le processeur. Pour faire simple, il y a deux solutions. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde.
===L'espace d’adressage séparé===
La première solution sépare les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. Mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage.
[[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]]
Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire.
===Les entrées-sorties mappées en mémoire===
La seconde solution s'appelle l'espace d'adressage unifié, ou encore les '''entrées-sorties mappées en mémoire'''. Elle mélange adresse mémoire et adresses d'entrée-sorties, dans un seul espace d'adressage, un seul ensemble d'adresse. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire.
[[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]]
L'avantage de cette méthode est qu'il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Le processeur est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans les adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés.
==Le décodage d'adresse et son implémentation==
Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus : les bus systèmes, les bus mémoire séparés des bus d'entrées-sorties séparés, et les systèmes à base de répartiteurs.
La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties.
[[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]]
La seconde utilise des bus séparés pour la mémoire et les entrées-sorties. Elle utilise un bus mémoire et un ou plusieurs '''bus d'entrée-sortie''', aussi appelés '''bus I/O''' (I/O pour ''input Output'', ce qui veut dire Entrée-sortie)
[[File:Bus entre processeur et contrôleur de périphérique.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses.
[[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]]
Intuitivement, le bus système va de concert avec des entrées-sorties mappées en mémoire, alors qu'utiliser un bus séparé pour les entrées-sorties implique des espaces d'adressage séparés. Et dans les grandes lignes, c'est pas trop faux. Un bus système peut implémenter les deux solutions d'adressage, et c'est la même chose avec un répartiteur. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur.
{|class="wikitable"
|-
!
! Espace d'adressage unifié (entrées-sorties mappées en mémoire)
! Espace d'adressage séparé
|-
! Bus système
| rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé
|-
! Bus séparé avec répartiteur
|-
! Bus séparé pour les IO
| Non, sauf exceptions
| Oui, presque obligatoire
|}
===Les entrées-sorties mappées en mémoire avec un bus système===
Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle.
Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique.
La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses.
[[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]]
Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants.
[[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]]
Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits.
{|class="wikitable"
|-
! Intervalles d'adresses
! Description
! Taille
|-
| $0000–$07FF
| Mémoire RAM
| 2 kibioctets
|-
| $0800–$0FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1000–$17FF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $1800–$1FFF
| Mémoire RAM (miroir)
| 2 kibioctets
|-
| $2000 - $3FFF
| Registres d’interfaçage de la carte graphique, une copie tous les 8 octets
| 8 kibioctets
|-
| $4000–$401F
| Divers
|-
| $4020–$FFFF
| Inoccupé, utilisé par la cartouche de jeu
|}
===L'espace d'adressage séparé avec un bus système===
Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire.
Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur.
Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés.
[[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]]
Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données.
[[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]]
===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales===
Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité.
La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives.
Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes.
[[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]]
==Les bus d'entrée-sortie : multiplexage, adressage et coprocesseurs I/O==
Les bus I/O connectent un processeur à des entrées-sorties et à rien d'autre. Ils ont l'avantage d'être plus simples que le bus mémoire. Cependant, il y a rarement un bus d'entrées-sortie pour chaque entrée-sortie présente dans l'ordinateur. A la place, il y a un seul bus d'entrée-sortie qui est partagé entre plusieurs entrées-sorties, généralement entre plusieurs contrôleurs de périphériques. Pour gérer plusieurs contrôleurs de périphériques, il y a plusieurs solutions.
La première utilise des adresses réservées. Le processeur a un espace d'adressage réservé pour les entrées-sorties, dans lequel chaque registre d’interfaçage a sa propre adresse réservée. Les contrôleurs de périphériques surveillent le bus et analysent chaque transaction dessus, pour voir si une transaction leur est destinée. Pour cela, ils surveillent les adresses sur le bus d'adresse et réagissent quand une adresse envoyée est associée à un de leurs registres d’interfaçage. Le bus d'adresse est généralement plus petit que celui du bus mémoire.
[[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]]
Mais d'autres solutions alternatives utilisent un mélange entre bus d'I/O dédié et bus à répartiteur.
===Le multiplexeur d'entrée-sortie===
Les anciens ordinateurs des années 80-90 utilisaient une solution alternative, qui est un mélange entre bus d'I/O dédié et bus à répartiteur. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA.
Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IO MUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point.
[[File:IO MUX.png|centre|vignette|upright=2|IO MUX]]
Les ports IO étaient banalisés, à savoir qu'on pouvait brancher n'importe quoi dessus. Il était possible de brancher un capteur de température, un moteur à commander, un port série, un port parallèle, un écran, un clavier, une souris, peu importe. D'ordinaire, un port IO peut fonctionner soit en tant qu'entrée, soit en tant que sortie. Il est même possible de changer de sens en cours de fonctionnement, pour passer d'une entrée à une sortie ou inversement.
Les ports banalisés de ce type sont parfois appelés des '''GPIO''', abréviation de ''General Purpose Input/Output''. On ne les trouver pas que sur les IO MUX, le terme est utilisé pour tout port, regroupant plusieurs broches d'entrée-sortie, qui peuvent être utilisés à volonté. De telles broches sont généralement reliées directement ou indirectement au processeur, qui décide quoi envoyer sur des broches et comment interpréter ce qui est reçu dessus (le logicel sur le processeur, du moins).
===L'Intel 8255 : un MUX IO ancien===
[[File:8255.svg|vignette|8255]]
Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C.
Précisons que le 8255 était plus complexe que ce qui vient d'être décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas.
Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU.
Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture.
Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle.
Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré.
[[File:MOS6526.svg|vignette|MOS 6526.]]
Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés.
Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure.
===Le PIO des Rasberry Pi===
Les multiplexeurs d'entrée-sortie peuvent être améliorés en leur rajoutant des fonctionnalités de manipulation bit à bit, ainsi que des décalages. Les décalages sont très utiles pour communiquer avec certaines entrées-sorties aux bus très petits. Par exemple, imaginez un IO MUX qui gère 8 ports de 32 bits. Pour connecter dessus une entrée-sortie 16 bits, on doit transmettre les données en deux fois, 16 bits à la fois. Il est possible de configurer l'IO MUX de manière à ce qu'il applique un masque sur les données, par exemple pour en mettre certains bit à 0 ou à 1.
Les IO MUX les plus élaborés deviennent des '''coprocesseurs d'entrées-sorties''', aussi appelés coprocesseurs I/O. J'avais dit dans le chapitre précédent que les coprocesseurs I/O étaient des contrôleurs DMA améliorés, mais c'était en réalité une simplification. Il existe un second type de coprocesseurs I/O, qui est dérivé des IO MUX. L'idée est de combiner un IO MUX et un mini-processeur dédié, au jeu d'instruction spécialisé dans les manipulations bit à bit. Le tout peut être complété par des mémoires FIFOs pour simplifier l’interfaçage avec le processeur et les entrées-sorties.
[[File:Raspberry Pi GPIO.svg|thumb|Raspberry Pi GPIO]]
L'exemple que nous allons voir est le '''PIO''' intégré dans les microcontrôleurs RP 2040 et consorts, utilisés dans les produits de la gamme Rasberry Pi et leurs dérivés. Il est connecté à un port extérieur, illustré ci-contre, qui regroupe 32 broches d'entrée et de 32 broches de sortie. Notez que je n'ai pas parlé de ports, pour une raison simple : le nombre de port est configurable ! Les 32 broches d'entrée et de sortie peuvent être regroupées dans 1 à 4 ports, qui ont chacun la taille qu'on veut. Par exemple, on peut regrouper les 32 broches de sortie en 4 ports de 8 bits, ou en 32 ports série (1 bit), ou en un port de 12 bits, un port de 16 bits et un port de 4 bits. La seule contrainte est que les broches d'un même port doivent être consécutives.
Le PIO regroupe un IO MUX avec gestion des interruptions, des mémoires FIFOs, mais aussi et surtout : des coprocesseurs IO ! Le PIO est fourni avec des programmes permettant de communiquer avec des UART, ou des bus SPI et I2C. Ils sont exécutés chacun sur un coprocesseur I/O. D'où le fait que certaines broches soit attribuées de base à ces bus. Rassurez-vous : elles peuvent être réattribuées à volonté. Le fait que les coprocesseurs soient programmables permet de gérer n'importe quel bus ou entrée-sortie.
Chaque coprocesseur I/O communique avec un port rien qu'à lui. La configuration d'un port, à savoir quelles broches il utilise, est le fait d'un registre de configuration pour chaque coprocesseur I/O. La configuration se faisant par coprocesseur, deux coprocesseurs peuvent partager une même broche ! Un coprocesseur, il peut adresser les broches de deux manières : soit en utilisant le numéro de broche général compris entre 0 et 31, soit en utilisant la position d'une broche dans son port dédié.
Pour se connecter à n'importe quelle entrée-sortie, le coprocesseur doit se cadencer à la même fréquence que celle de l'entrée-sortie. Pour cela, les registres de configuration permettent de configurer la fréquence du coprocesseur. Il est possible de multiplier la fréquence de base de ce coprocesseur par un coefficient, encodé sur 24 bits, en virgule fixe, avec une partie entière de 16 bits et une partie fractionnaire de 8 bits.
Les coprocesseurs I/O partagent une mémoire d'instruction, capable de mémoriser 32 instructions maximum. C'est une mémoire multiport, avec un port d'écriture et quatre ports de lecture. Le port d'écriture sert juste à charger les programmes à exécuter dedans. Les 4 ports de lecture permettent aux 4 coprocesseurs d'exécuter une instruction par cycle. Notons que les 4 coprocesseurs peuvent exécuter des programmes différents. C'est plus pratique que d'utiliser une mémoire d'instruction par coprocesseur.
Les 8 mémoires FIFO regroupent 4 FIFO d'entrée et 4 FIFOs de sortie, mais on peut les reconfigurer pour avoir 8 FIFOs allant dans le même sens.
[[File:PIO du Rasberry Pi - RP2040.png|centre|vignette|upright=2.5|PIO du Rasberry Pi - RP2040.]]
Les coprocesseurs IO sont très simples et exécutent des programmes très courts. Ils supportent 9 instructions, appelées JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, et SET. Ils intègrent un ''program counter'', un registre d'état et des registres de configuration, mais aussi des registres pour les données. Il y a deux registres X et Y qui servent à manipuler des données, ainsi qu'un registre NULL qui contient toujours zéro. Les deux autres registres sont les registres ''In Shift'' et ''Out Shift'', dont le nom trahit deux choses : ce sont des registres à décalages, ils servent à échanger des données avec l'extérieur. Pour être précis, ils servent d'intermédiaire entre les broches/ports et les mémoires FIFO. Voyons comment.
Le '''registre ''Out Shift''''' est altéré par deux instructions. L'instruction PULL lit un nombre de 32 bits dans la mémoire FIFO, et le copie dans le registre ''Out Shift''. L'instruction OUT est assez complexe. Pour simplifier, elle transfère la donnée dans le registre ''Out Shift'' vers une broche, bit par bit. Pour cela, le registre ''Out Shift'' décalé à chaque cycle d'horloge, automatiquement. Il s'agit du principe de base, mais qui est cependant altéré par les fonctionnalités suivantes :
* Il est possible de faire le transfert non pas bit par bit, mais par groupes de N bits, N étant compris entre 1 et 32 (inclus).
* Le contenu du registre est envoyé non pas sur une broche, mais ailleurs, d'autres destinations étant possibles. Par exemple, les deux registres X et Y peuvent servir de source ou de destination.
* Il est possible de configurer le coprocesseur pour faire N transferts de 32 bits à la suite, sans avoir à utiliser de boucles. Le nombre d'itérations est placé dans un autre registre et est décrémenté à chaque itération, automatiquement, sans utiliser d'instruction séparée.
* On peut configurer le décalage pour qu'il se fasse de droite à gauche ou de gauche à droite.
Le '''registre ''In Shift''''' fait l'inverse du registre ''Out Shift''. Il est manipulé par deux instructions nommés IN et PUSH. L’instruction IN récupère un flux de bits sur une broche, l'accumule dans le registre ''In Shift'', jusqu'à avoir récupéré une donnée de 32 bits complète. L'instruction PUSH copie le contenu du registre ''In Shift'' dans une mémoire FIFO. Le registre ''In Shift'' est mis à zéro après une instruction PUSH. Les possibilités lisétes plus haut sont aussi valides pour l'instruction IN.
Pour faire les décalages, le coprocesseur intègre deux registres qui mémorisent par combien il faut décaler. Il y en a un poiur le registre ''In Shift'' et un autre pour le registre ''Out Shift''.
Nous venons de voir quatre instructions sur les 9 possibles : IN, OUT, PUSH, PULL. L'instruction JMP est un branchement conditionnel, rien de spécial de ce point de vue. Les instructions MOV, SET, WAIT et INT sont bien plus intéressantes.
L''''instruction SET''' écrit une constante immédiate de 5 bits, dans une destination. La destination peut être le registre X ou Y, ou des broches de sortie. Quand on écrit la constante dans les registres X ou Y, la constante est écrite dans les 5 bits de poids faible, les autres bits sont mis à 0. Il n'est pas possible d'écrire dans les registres ''In Shift'' et ''Out Shift''.
L''''instruction MOV''' porte assez mal son nom, car elle ne fait pas que copier un registre dans un autre, c'est ici une instruction beaucoup plus complexe et performante. Elle peut copier une donnée d'une source vers une destination, mais aussi appliquer une opération bit à bit sur la donnée. L'opération en question est soit une opération NOT (inversion des bits), ou inverser l'ordre des bits (les bits de poids fort deviennent ceux de poids faible et inversement).
La source d'un MOV est n'importe quel registre de données : X, Y, ''In Shift'', ''Out Shift'', mais ausi le registre NULL (pour le zéro). Il est aussi possible de lire directement les 32 broches d'entrée d'un seul coup, ou encore de lire le registre d'état du coprocesseur. Pour les sorties, il est possible d'écrire dans les registres de données, sauf le registre NULL. Il est aussi possible d'écrire dans les 32 broches de sortie directement, sans passer par le registre ''Out Shift''. Plus surprenant, il est possible d'écrire dans le ''Program Counter'', afin de faire un branchement inconditionnel ! Et encore plus surprenant, il est possible d'écrire dans le registre d'instruction, ce qui permet d'exécuter une donnée comme une instruction !
Le coprocesseur dispose de 8 sorties d'interruption, numérotées de 0 à 7. Sur les 8, 4 sont reliées au contrôleur d’interruptions, 4 sont internes au coprocesseur. L''''instruction INT''' peut lever une interruption, en mettant une sortie d'interruption à 1. L'instruction INT précise quelle sortie mettre à 1, elle encode trois bits pour cela. Elle peut aussi mettre à 0 cette sortie d'interruption. Il y a aussi une option pour décider si la sortie d'interruption est immédiatement remise à zéro, ou si le processeur doit la remettre à 0 lui-même (demande d'''ACK'').
L''''instruction WAIT''' met en pause le processeur tant qu'une condition bien spécifique n'est pas remplie. La condition en question est l'envoi d'un 0 ou d'un 1 sur une broche bien précise. La broche en question soit une des 32 broches d'entrée, soit une entrée d'interruption. Pour le dire autrement, le processeur peut être réveillé par une interruption, ou par un signal bien précis sur une broche bien précise.
Pour résumer, les coprocesseurs I/O de ce type sont spécialisés dans la manipulation de bit, et ne gèrent que des décalages et des opérations de masquage. Pas d'opérations arithmétiques, un minimum de branchements, peu de registres. Par contre, ils ont des fonctionnalités de ''timing'' et de délais très poussées, comme on s’apprête à le voir en détail. Les instructions sont toutes encodées sur 16 bits et elles s'exécutent toutes en un seul cycle d'horloge. Leur encodage est décrit dans ce tableau, et vous devriez vous poser une question en le lisant : mais à quoi correspond ce champ "Délai/''side set''" ? Les explications vont suivre.
{|class="wikitable"
|+ Jeu d'instruction des coprocesseurs du PIO
|-
! Instruction !! 3 bits (Opcode ) !! 5 bits !! 3 bits !! 5 bits
|-
! JMP
| 000 || Délai/''side set'' || Condition || Adresse de destination
|-
! WAIT
| 001 || Délai/''side set'' || Source || Numéro d'interruption ou de broche
|-
! IN
| 010 || Délai/''side set'' || Source || ''Bit count''
|-
! OUT
| 011 || Délai/''side set'' || Destination || ''Bit count''
|-
! PUSH
| rowspan="2" | 100 || Délai/''side set'' || 0, deux bits de configuration || 00000
|-
! PULL
| Délai/''side set'' || 1, deux bits de configuration || 00000
|-
! MOV
| 101 || Délai/''side set'' || Destination || Opération (2 bits), Source (3 bits)
|-
! IRQ
| 110 || Délai/''side set'' || 0, ''clear'', ''wait''|| Numéro d'interruption
|-
! SET
| 111 || Délai/''side set'' || Destination || Constante immédiate
|}
Communiquer avec une entrée-sortie demande d'envoyer des données au bon moment, et de les recevoir au bon moment. Le ''timing'' est donc crucial. Pour cela, chaque instruction peut forcer le processeur à attendre N cycles d'horloge avant l'instruction suivante. Le nombre N est encodé dans l'instruction elle-même, sur quelques bits, entre 0 et 5. Cette possibilité est très utile pour ''timer'' les envois de données à une entrée-sortie, chose très importante. Nous l’appellerons la '''fonctionnalité de retard forcé'''.
Les instructions ont aussi une '''fonctionnalité de ''Side-set''''', qui permet d'écrire entre 0 et 5 bits sur certaines broches, sans utiliser d'instruction OUT/MOV/SET. Toutes les instructions peuvent utiliser un ''side set'', y compris OUT, SET et MOV. La constante à écrire sur les broches est encodée dans l'instruction, c'est une constante immédiate. Les broches sont configurées au démarrage du programme, en écrivant le registre PINCTRL_SIDESET_BASE.
La constante de ''side set'' et le retard forcé se partagent le champ de 5 bits "Délai/''side set''". Les bits de poids fort sont réservés au ''side set'', les bits de poids fort sont pour le délai forcé. Le nombre de bits attribués au ''side set'' dépend de la configuration du registre PINCTRL_SIDESET_COUNT. Les bits restants sont utilisés pour la fonction de retard forcé.
Les coprocesseurs disposent aussi d'une fonctionnalité de '''''program wrapping'''''. Il permet de répéter en boucle le même programme, sans avoir à utiliser de branchements inconditionnels. Quand on atteint la fin du programme, le processeur redémarre directement au début du programme, il passe directement de la dernière instruction à la première. Il faut pour cela configurer l'adresse de la première instruction et de la dernière instruction, et activer l'option dans le registre de configuration adéquat. Cela permet de simplifier la gestion des ''timings'' (un branchement prend un cycle d'horloge, et peut donc décaler temporellement des instructions), sans compter qu'on économise des instructions. Je rappelle pour ce dernier point que la mémoire d'instruction ne peut mémoriser que 32 instructions max, à partager entre plusieurs programmes...
==L'implémentation du DMA suivant le bus utilisé==
Un bus système est l'idéal pour implémenter le DMA. Le contrôleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA.
[[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]]
L'usage d'un répartiteur ne pose pas de problèmes particuliers pour le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO.
[[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]]
L'usage d'un bus I/O ne permet pas l'implémentation du ''Direct Memory Access''. Les communications entre I/O et RAM passeront forcément par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les méthodes de synchronisation entre processeur et périphériques
| prevText=Les méthodes de synchronisation entre processeur et périphériques
| next=Les périphériques et les cartes d'extension
| nextText=Les périphériques et les cartes d'extension
}}{{AutoCat}}
</noinclude>
e3nf1vg7ligg6rm5k2mwvj6quo4zwg6
Fonctionnement d'un ordinateur/Le parallélisme mémoire
0
65888
765040
764854
2026-04-25T14:38:55Z
Mewtow
31375
765040
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Pour donner un exemple, il est possible de pipeliner les accès mémoire. Il est possible de pipeliner l'accès au cache et/ou l'accès à la mémoire, et nous verrons comment faire dans ce chapitre. Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, qu'ils aient ou non un pipeline dynamique. Par contre, pipeliner la mémoire est une technique ancienne, aujourd'hui peu utilisée. Elle était utilisée sur des très vieux ordinateurs, qui avaient un pipeline mais pas de mémoire cache. Mais de nos jours, les mémoires SDRAM et DDR ne sont pas adaptées pour ça, il est très difficile de les pipeliner correctement.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Par exemple, un processeur ''in-order'' avec des lectures non-bloquantes peut en profiter. Il peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. À l'opposé, les processeurs sans lectures non-bloquantes profitent pas du parallélisme mémoire. À la rigueur, ils peuvent en profiter s'ils intègrent des techniques de préchargement. Pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand-chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès au cache, ce qui demande juste de rajouter des registres au bon endroits et quelques circuits de contrôle. Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique. Et l'implémentation peut se faire de plusieurs manières différentes. Il faut dire que découper une mémoire cache en plusieurs étapes peut se faire de plusieurs manière. Commençons par la plus simple.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
===Les MSHR simples===
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
===Les MSHR adressés implicitement===
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
===Les MSHR adressés explicitement===
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
===Les MSHRs inversés===
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
===Les MSHR intégrés au cache===
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciens, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. Reste à combiner ces banques pour former un pseudo-pipeline.
===Utiliser plusieurs banques sans entrelacement===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. Il s'agit de ce qui s'appelle un arrangement horizontal, et nous avions vu celui-ci dans le chapiutre sur les mémoires SDRAM.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec cet arrangement, les bits de poids fort de l'adresse sont utilisées pour sélectionner la banque adéquate, et le reste de l'adresse est envoyé sur le bus d'adresse. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
! Adresse de banque !! Adresse dans la banque
|-
| Quelques bits de poids fort || Reste de l'adresse
|}
L'entrelacement change cette répartition, afin d'accélérer les accès mémoire. L'entrelacement classique vise à améliorer les accès à des adresses mémoires consécutives, mais des formes plus évoluées d'entrelacement visent à optimiser des accès mémoire arbitraires. Voyons-les dans l'ordre, du plus simple au plus complexe.
===L'entrelacement classique===
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques consécutives. Précisons que cette attribution des adresses n'implique absolument pas la mémoire virtuelle ou n'importe quel mécanisme dans le processeur. La répartition décide que telle adresse mémoire va dans telle banque, à telle adresse dans la banque. Elle est donc le fait du contrôleur mémoire, donc en dehors du processeur (les contrôleurs mémoires n’étaient pas encore intégrés dans le processeur à l'époque).
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafales se termine. Pas besoin d'attendre que la mémoire ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]]
L'animation suivante illustre bien le processus, avec quatres banques.
[[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas.
L'entrelacement classique pourrait être utilisé pour accélérer les transferts entre mémoire RAM et cache, qui se font en blocs d'adresses consécutives. Mais de nos jours, il n'est pas utilisé dans cette optique. Il faut dire qu'il est redondant avec le mode rafale des mémoires DRAM. Les deux font globalement la même chose et on voit mal comment utiliser les deux en même temps. Le mode rafale étant plus simple à implémenter, et plus léger niveau utilisation du bus de commande mémoire, il est préféré à l'entrelacement.
Par contre, l'entrelacement a eu son heure de gloire sur d'anciens processeurs qui n'avaient pas de mémoire cache, alors qu'ils disposaient d'un pipeline. L'exemple typique est celui des nombreux ''processeurs vectoriels'', que nous n'avons pas encore abordé à ce stade du cours. De tels processeurs avaient un pipeline, une unité de calcul fortement pipelinée, et parfois même de l'exécution dans le désordre et du renommage de registres !
===L'entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en enjambée (en ''stride''), où l'on accède en série à des adresses sont séparées par N mots mémoires.
[[File:Accès par enjambées.png|centre|vignette|upright=2|Accès par enjambées.]]
De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Un cas classique est celui du parcours d'une matrice colonne par colonne. Les matrices de nombres sont mémorisées ligne par ligne, ce qui fait que parcourir une colonne demande de passer d'une ligne à la suivante et de faire des grands sauts en mémoire RAM, mais tous espacés par la même distance.
Avec l'entrelacement simple, les accès en enjambée sont moins performants que les accès à des adresses consécutives, mais cela ne fonctionne pas trop mal. Le pire cas est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Mais en dehors de ce cas, on voit une amélioration par rapport à la situation sans entrelacement.
Pour obtenir des performances maximales pour les accès en enjambées, il faut répartir les mots mémoires dans la mémoire autrement. L'organisation idéale est la suivante.
: Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, on décale tout d'une adresse, à savoir qu'on commence à remplir les banques à partir de la seconde, non de la première. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Le troisième bloc d'adresse subit le même traitement, sauf qu'on commence à remplir à partir de la seconde banque. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N ;
* décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Malgré ce défaut, la technique a été utilisée sur quelques ordinateurs, avec l'exemple notable du superordinateur ''Burroughs Scientific Processor''. Pour éviter cela, il y a plusieurs solutions. Par exemple, on peut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Mais en pratique, elles n'ont pas vraiment été implémentées dans une vraie machine, et sont restées à l'état de recherche, aussi je les passe sous silence.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière "pseudo-aléatoire". L'idée exacte est de faire passer l'adresse dans une '''fonction de hachage''', plus ou moins complexe. Pour rappel, une fonction de hachage prend une entrée de grande taille et fournit en sortie un résultat de petite taille. Idéalement, elles doivent donner des résultats aussi différents que possible pour des entrées similaires, histoire de simuler une sorte de pseudo-aléatoire. Ici, une adresse est transformée en un numéro de banque.
Une fonction de hachage simple ne fait que permuter des bits de l'adresse pour obtenir son résultat. Elle ne fait qu'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. Des fonctions de hachage plus complexes font des XOR bit à bit entre certains bits de l'adresse.
==Les contrôleurs SDRAM/DDR avec "exécution dans le désordre"==
Après avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM, et leurs contrôleurs mémoire en font tout autant. C'est une différence majeure avec les mémoires asynchrones FPM/EDO, qui n'acceptaient qu'un seul accès mémoire à la fois. Leur contrôleur mémoire n'acceptait qu'un seul accès mémoire à la fois, c'était un contrôleur mémoire bloquant. Les contrôleurs mémoires des SDRAM sont eux non-bloquants et peuvent encaisser une dizaine d'accès mémoire à la fois.
Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif.
===Rappel sur les SDRAM : tampon de ligne et commandes===
Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les accès mémoire sont traduits par un séquenceur mémoire en une série de commandes mémoires, qui sont séparées par des délais mémoire de quelques cycles d'horloge. Les délais sont très précis, et sont à respecter à la lettre. Une lecture ou une écriture se fait en maximum trois commandes : une commande PRECHARGE qui ferme la ligne précédemment utilisée, une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne et éventuellement la donnée à écrire.
: Pour être plus précis, la commande PRECHARGE précharge les lignes de bits du plan mémoire à une tension particulière, ce qui les vide de leur contenu. Mais c'est un détail sans importance pour ce qui va suivre.
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans. Si un accès mémoire accède à une ligne déjà activée, on dit que c'est un '''succès de page'''. Si ce n'est pas le cas, on doit fermer la ligne courante, rouvrir la ligne voulue, et préciser la colonne. C'est alors un '''défaut de page'''.
{|class="wikitable"
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13
|-
! Bus de commande/adresse
| bgcolor="#FFA0FF" | PRECHARGE || bgcolor="#FFA0FF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || bgcolor="#A0FFFF" | READ (2) || bgcolor="#A0FFFF" | READ (3) || || || bgcolor="#A0FFFF" | READ (4) || bgcolor="#A0FFFF" | READ (5) || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | Donnée READ 1 || ||bgcolor="#A0FFFF" | Donnée READ 2
| bgcolor="#A0FFFF" | Donnée READ 3 || || || bgcolor="#A0FFFF" | Donnée READ 4 || bgcolor="#A0FFFF" | Donnée READ 5
|}
Les SDRAM sont parfois capables de démarrer une commande avant que la précédente soit terminée. Mais le respect des délais mémoire est très limitant, ce qui fait qu'on ne peut pas parler de réel pipeline, comme c'est le cas sur les processeurs. Parlons plutôt de '''commandes anticipées'''.
{|class="wikitable"
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13
|-
! Bus de commande/adresse
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Un dernier point est que les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
===La mise en attente des accès mémoire===
Un contrôleur de SDRAM peut accepter plusieurs accès mémoire en même temps. Mais cela ne signifie pas que le contrôleur sera prêt à les traiter immédiatement. Pour éviter tout problème de disponibilité, le contrôleur met en attente les accès mémoire que le processeur lui envoie, pour les exécuter dès que possible. Les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée, notamment pour renvoyer les lectures dans l'ordre demandé. Il y a aussi une mémoire FIFO pour les données à écrire et une FIFO pour les données lues. Cette dernière sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
===Les lectures anticipées : une forme d'OOO mémoire===
La mise en attente des accès mémoire est une optimisation intéressante, mais pas mirifique. Elle permet surtout de ne pas bloquer le processeur si le contrôleur mémoire a du travail sur la planche. Cependant, elle peut être optimisée quand on se rend compte d'une chose : le processeur ne voit que les lectures, pas les écritures. Pour les écritures, il les envoie au contrôleur mémoire et ce dernier fait le travail demandé, le processeur n'est pas prévenu quand une écriture se termine. Mais pour les lectures, c'est différent, car il reçoit la donnée lue. En conséquence, il est possible d'optimiser les écritures sans que le processeur ne voie quoique ce soit.
Une optimisation possible est alors de changer l'ordre des accès mémoire, histoire de retarder les écritures ou au contraire de les faire en avance. La raison est que les mémoires SDRAM n'aiment pas quand on alterne lectures et écritures. Les délais mémoire, les fameux ''timings'' mémoire, sont clairs : faire une suite de lecture ou une suite d'écriture est plus performant que d'alterner entre lectures et écritures. L'idée est alors de changer l'ordre des écritures de manière à les faire en bloc, idem pour les lectures.
L’optimisation est possible, mais à condition que le processeur n'y voie que du feu. Or, vous l'avez deviné, il y a des cas où ces réorganisations ne sont pas possibles, et vous avez sans doute trouvé que la situation était familière. L'optimisation en question est une forme d'exécution dans le désordre des accès mémoire, réalisée par le contrôleur mémoire lui-même ! Et qui dit exécution dans le désordre dit : problèmes liés aux dépendances de données. Changer l'ordre des écritures n'est pas toujours possible, notamment en raison des dépendances RAW, WAR et WAW.
Pour que le processeur n'y voie que du feu, il faut respecter plusieurs critères. Premièrement, les lectures doivent être renvoyées au processeur dans l'ordre. Et quand je dis dans l'ordre, cela veut dire : dans l'ordre d'envoi des lectures au contrôleur mémoire. Les écritures aussi doivent se faire dans l'ordre, histoire qu'une série d'écriture donne le bon résultat final. Le troisième critère est qu'une lecture doit donner le résultat de la dernière écriture ''à la même adresse''. Pour le dire autrement, il faut juste détecter les dépendances RAW.
Concrètement, si on a une série de lectures et d'écritures alternées, on peut regrouper les lectures et les écritures dans deux paquets séparés, à condition qu'aucune lecture ne lise une adresse écrite par une écriture. Mais si une lecture est dépendante d'une écriture, alors la lecture doit attendre que l'écriture se termine, idem pour les lectures suivantes.
Une implémentation basique remplace la mémoire FIFO vue au-dessus, par deux mémoires FIFOs : une pour les lectures, une pour les écritures. Lorsqu'un accès mémoire arrive au séquenceur, il regarde si c'est une lecture ou une écriture et place l'accès mémoire dans la file adéquate. Le fait que ce soit des FIFOs garantit que les lectures se font dans l'ordre, idem pour les écritures. En sortie des deux FIFOs, le séquenceur mémoire détecte les dépendances RAW. Précisément, quand une lecture sort de la mémoire FIFO, il consulte la file d'attente des écritures pour voir si la lecture est dépendante d'une écriture en attente. La lecture attend si c'est le cas, et les écritures sont exécutées à la place.
Séparer lectures et écriture est une source d'optimisation. Il est par exemple possible d'utiliser le réacheminement lecture sur écriture (''Store to load forwarding''). Il s'agit d'un équivalent de l’optimisation du même nom, utilisée dans le cadre de la désambiguïsation mémoire. Imaginez qu'une lecture accède à une donnée pas encore écrite, en attente dans le contrôleur mémoire. C'est une dépendance RAW assez claire. Dans ce cas, le contrôleur mémoire peut renvoyer la donnée directement depuis ses mémoires FIFOs, sans faire d'accès mémoire en lecture.
Le contrôleur mémoire a tendance à privilégier les lectures, car celles-ci sont cruciales pour l'exécution dans le désordre. Plus elles se font tôt, plus vite le processeur recevra les données et pourra démarrer les instructions dépendantes de cette donnée. Le séquenceur a donc tendance à piocher en priorité dans la file de lecture, plutôt que dans la file d'écriture. À vrai dire, dans le cas idéal, les écritures ne sont faites que quand la file d'écriture est pleine ou quasi pleine...
Prenons l'exemple des coprocesseurs IO 81341 et 81342, qui étaient en réalité des ''chipsets'' intégrant un contrôleur SDRAM. Le ''chipset'' avait 5 ports : un pour les processeurs, un pour le pont sud (''southbridge'') et trois pour des canaux DMA. Pour le port processeur, il n'y avait pas de réordonnancement et ce port utilisait une seule mémoire FIFO. Les autres ports utilisaient l'optimisation qu'on vient de voir, et avaient vraisemblablement des files séparées pour les lectures et écritures. Le séquenceur mémoire vérifiait les dépendances mémoire de type RAW et autres.
[[File:Double file d'attente pour les lectures et écritures.png|centre|vignette|upright=2.5|Double file d'attente pour les lectures et écritures]]
===Le ré-ordonnancement des commandes mémoires===
L'optimisation précédente est peu poussée, comparé aux formes d'exécution dans le désordre que les processeurs utilisent. Et on peut se demander si une exécution dans le désordre plus poussé est possible. La réponse est oui : un contrôleur mémoire peut faire des réorganisations bien plus poussées. Par contre, il faut faire une précision très importante : le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation.
Maintenant que ces précisions sont faites, posons cette question : dans quelles situations est-il pertinent de faire des accès mémoire dans le désordre ?
La réponse est : quand plusieurs accès à une même ligne ne sont pas consécutifs, qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire à une même ligne sont exécutés l'un à la suite de l'autre, ce qui est beaucoup plus rapide. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* PRECHARGE + ACT ;
* Une écriture ligne B ;
* PRECHARGE + ACT ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE quand on passe d'une ligne à l'autre, et il faut ajouter les commandes ACT avec. Pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. Le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A
* PRECHARGE + ACT ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Et encore une fois, il faut éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, les dépendances RAW posent problème !
L'implémentation est assez simple : la ou les mémoires FIFOs précédentes sont remplacées par des mémoires similaires aux fenêtres d'instruction. Le contrôleur mémoire vérifie à chaque cycle les accès en attente, et vérifie à quelle ligne ils accèdent. Il priorise alors les accès qui tombent dans la ligne ouverte : ceux-là sont exécutés avant les autres. S'il n'y en a pas, il prend l'accès mémoire le plus ancien (ordre FIFO). Il teste aussi les dépendances mémoires RAW avant d'envoyer des commandes à la mémoire DDR/SDRAM. une telle solution est appelée l''''algorithme ''FR-FCFS''''' (''First Ready-First Come First Serve'').
===Les optimisations liées à la présence de plusieurs banques===
Les optimisations précédentes sont décuplées par la présence de plusieurs banques dans la mémoire SDRAM. Il est en effet possible de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. La seule contrainte est que la SDRAM est limitée à 4 banques actives en même temps.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11
|-
! Banque Numéro 1
| || || || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || ||
|-
! Banque Numéro 2
| || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || ||
|-
! Banque Numéro 3
| || || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire ||
|}
Les optimisations précédentes peuvent s'appliquer par banque. Il est par exemple possible d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème, car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs. Il y a cependant un risque que les lectures se fassent dans le désordre si on n'y prend pas garde.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
Il est aussi possible d'utiliser une file séparée pour les lectures et les écritures, pour chaque banque. Les performances sont alors améliorées comparé à deux files globales pour toute la SDRAM. En idem avec la réorganisation des accès mémoire, pour regrouper les accès à une même ligne.
Un problème avec ces optimisations est qu'il est rare que des accès mémoire se fassent dans des banques séparées. Les accès mémoire tendent à se faire avec une bonne localité spatiale, ce qui fait qu'ils tombent dans une même banque. Heureusement, les contrôleurs SDRAM/DDR modernes incorporent des optimisations pour corriger ce problème. Les optimisations en question sont une forme d'entrelacement adaptée aux mémoires SDRAM. L'entrelacement naïf ne marche pas à cause de la présence du tampon de ligne. Cependant, il peut y avoir un entrelacement entre banques SDRAM. Voyons ce que ça veut dire.
L''''entrelacement de banques''' répartit deux lignes consécutives dans deux banques différentes. Pour comprendre l'idée, prenons un exemple. Imaginons une mémoire avec deux banques et 4 lignes. Imaginons qu'on parcoure/balaye la mémoire RAM en partant des adresses basses. Sans entrelacement de ligne, les accès se feront comme suit, de gauche à droite :
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="4" | Banque numéro 1 !! colspan="4" | Banque numéro 2
|-
| Ligne 1 || Ligne 2 || Ligne 3 || Ligne 4 || Ligne 1 || Ligne 2 || Ligne 3 || Ligne 4
|}
Avec l'entrelacement de banques, les accès se feront comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2
|-
| Ligne 1 || Ligne 1 || Ligne 2 || Ligne 2 || Ligne 3 || Ligne 3 || Ligne 4 || Ligne 4
|}
L'avantage est que passer d'une ligne à la suivante est plus rapide. Pas besoin de fermer la ligne pour passer à la suivante, on ouvre directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Sans entrelacement, les adresses mémoire sont découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Avec l'entrelacement de banques, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
Il est aussi possible de faire la même chose, mais avec les rangées ou en utilisant du ''dual channel'', mais je vais passer cela sous silence. Toujours est-il que les méthodes d'entrelacement sont nombreuses et chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire, dans un '''circuit d'entrelacement'''. Ce dernier intervertit certains bits de l'adresse lors des accès mémoires.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
r1eb9o6hzhwazykfej29izajdhhjvmn
Formation musicale/Harmonie
0
75583
765105
758791
2026-04-25T22:40:17Z
Regimminius
7153
/* Demi-cadence */ Faute de frappe
765105
wikitext
text/x-wiki
{{Bases de solfège}}
<span style="font-size:25px;">6. Harmonie</span>
L'harmonie désigne les notes jouées en même temps, soit plusieurs instruments jouant chacun une note, soit un instrument jouant un accord (instrument dit polyphonique).
== Première approche ==
L'exemple le plus simple d'harmonie est sans doute la chanson en canon : c'est un chant polyphonique, c'est-à-dire à plusieurs voix, chaque voix chantant la même chose en décalé. Prenons par exemple ''Vent frais, vent du matin'' (la version originale est ''{{lang|en|Hey, Ho Nobody at Home}}'' de Thomas Ravenscroft, 1609) :
[[Fichier:Vent frais vent du matin.svg|class=transparent|center|Partition de ''Vent frais, vent du matin'' (''{{lang|en|Hey, Ho Nobody at Home}}'' de Thomas Ravenscroft, 1609).]]
[[Fichier:Vent frais vent du matin.midi|vignette|''Vent frais, vent du matin'' (''{{lang|en|Hey, Ho Nobody at Home}}'' de Thomas Ravenscroft, 1609).]]
nous voyons que les voix se superposent de manière « harmonieuse ». Les notes de chaque voix se correspondent point par point (avec un retard), c'est donc un type d'harmonie polyphonique appelé « contrepoint ».
Considérons la première note de la mesure 6 pour chaque voix. Nous avons la superposition des notes ''ré''-''fa''-''la'' (du grave vers l'aigu) ; la superposition de notes jouées ou chantées ensembles s'appelle un accord. Cet accord ''ré''-''fa''-''la'' porte le nom « d'accord parfait de ''ré'' mineur » :
* « ''ré'' » car la note fondamentale est un ''ré'' ;
* « parfait » car il est l'association d'une tierce, ''ré''-''fa'', et d'une quinte juste, ''ré''-''la'' ;
* « mineur » car le premier intervalle, ''ré''-''fa'', est une tierce mineure.
Considérons maintenant un chant accompagné au piano. La piano peut jouer plusieurs notes en même temps, il peut jouer des accords.
[[Fichier:Au clair de le lune chant et piano.svg|class=transparent|center|Deux premières mesure d’Au clair de la lune.]]
[[Fichier:Au clair de le lune chant et piano.midi|vignette|Deux premières mesure d’Au clair de la lune.]]
L'accord, les notes à jouer simultanément, sont écrites « en colonne ». Lorsqu'on les énonce, on les lit de bas en haut mais le pianiste les joue en pressant les touches du clavier en même temps, de manière « plaquée ».
Le premier accord est composé des notes ''do''-''mi''-''sol'' ; il est appelé « accord parfait de ''do'' majeur » car la note fondamentale est ''do'', qu'il est l'association d'une tierce et d'une quinte juste et que le premier intervalle, ''do''-''mi'', est une tierce majeure.
== Consonance et dissonance ==
Les notions de consonance et de dissonance sont culturelles et changent selon l'époque. Nous pouvons néanmoins noter que :
* l'accord de seconde, et son renversement la septième, créent des battements, les notes « frottent », c'est un intervalle harmonique dissonant ; mais dans le cas de la septième, comme les notes sont éloignées, le frottement est moins perceptible ;
* les accords de tierce, quarte et quinte sonnent agréablement à l'oreille, ils sont consonants.
Dans la musique savante européenne, au début du Moyen-Âge, seuls les accords de quarte et de quinte étaient considérés comme consonants, d'où leur qualification de « juste ». La tierce, et son renversement la sixte, étaient perçues comme dissonantes.
L'harmonie joue avec les consonances et les dissonances. Dans un premier temps, les harmonies dissonantes sont utilisées pour créer des tensions qui sont ensuite résolues, on utilise des successions « consonant-dissonant-consonant ». À force d'entendre des intervalles considérés comme dissonants, l'oreille s'habitue et certains finissent par être considérés comme consonants ; c'est ce qui est arrivé à la tierce et à la sixte à la fin du Moyen Âge avec le contrepoint.
Il faut ici aborder la notion d'harmonique des notes.
[[File:Harmoniques de do.svg|thumb|Les six premières harmoniques de ''do''.]]
Lorsque l'on joue une note, on entend d'autres notes plus aigües et plus faibles ; la note jouée est appelée la « fondamentale » et les notes plus aigües et plus faibles sont les « harmoniques ». C'est cette accumulation d'harmoniques qui donne la couleur au son, son timbre, qui fait qu'un piano ne sonne pas comme un violon. Par exemple, si l'on joue un ''do''<sup>1</sup><ref>Pour la notation des octaves, voir ''[[../Représentation_musicale#Désignation_des_octaves|Représentation musicale > Désignation des octaves]]''.</ref> (fondamentale), on entend le ''do''<sup>2</sup> (une octave plus aigu), puis un ''sol''<sup>2</sup>, puis encore un ''do''<sup>3</sup> plus aigu, puis un ''mi''<sup>3</sup>, puis encore un ''sol''<sup>3</sup>, puis un ''si''♭<sup>3</sup>…
Ainsi, puisque lorsque l'on joue un ''do'' on entend aussi un ''sol'' très léger, alors jouer un ''do'' et un ''sol'' simultanément n'est pas choquant. De même pour ''do'' et ''mi''. De là vient la notion de consonance.
Le statut du ''si''♭ est plus ambigu. Il fait partie des harmoniques qui sonnent naturellement, mais il forme une seconde descendante avec le ''do'', intervalle dissonant. Par ailleurs, on remarque que le ''si''♭ ne fait pas partie de la gamme de ''do'' majeur, contrairement au ''sol'' et au ''mi''.
Pour le jeu sur les dissonances, on peut écouter par exemple la ''Toccata'' en ''ré'' mineur, op. 11 de Sergueï Prokofiev (1912).
: {{lien web |url=https://www.youtube.com/watch?v=AVpnr8dI_50 |titre=Yuja Wang Prokofiev Toccata |site=YouTube |date=2019-02-26 |consulté le=2021-12-19}}
== Contrepoint ==
Dans le chant grégorien, la notion d'accord n'existe pas. L'harmonie provient de la superposition de plusieurs mélodies, notamment dans ce que l'on appelle le « contrepoint ».
Le terme provient du latin ''« punctum contra punctum »'', littéralement « point par point », et désigne le fait que les notes de chaque voix se correspondent.
L'exemple le plus connu de contrepoint est le canon, comme ''Frère Jacques'' ou bien ''Vent frais, vent du matin'' présenté ci-dessus : chaque note d'un couplet correspond à une note du couplet précédent.
Certains morceaux sont bâtis sur une écriture « en miroir » : l'ordre des notes est inversé entre les deux voix, ou bien les intervalles sont inversés (« mouvement contraire » : une tierce montante sur une voix correspond à une tierce descendante sur l'autre).
On peut également citer le « mouvement oblique » (une des voix, le bourdon, chante toujours la même note) et le mouvement parallèle (les deux voix chantent le même air mais transposé, l'une est plus aiguë que l'autre).
Nous reproduisons ci-dessous le début du second ''Allegro'' de la sonate en trio en ''ré'' mineur de Haendel.
[[Fichier:Haendel Sonate en trio re mineur debut canon.svg | vignette | center | upright=2 | Début du second ''Allergo'' de la sonate en trio en ''ré'' mineur de Haendel.]]
[[Fichier:Haendel Sonate en trio re mineur debut.midi | vignette | Début du second ''Allegro'' de la sonate en trio en ''ré'' mineur de Haendel.]]
Nous avons mis en évidence la construction en canon avec des encadrés de couleur : sur les quatre premières mesures, nous voyons trois thèmes repris alternativement par une voix et par l'autre. Ce type de procédé est très courant dans la musique baroque.
Les procédés du contrepoint s'appliquent également à la danse :
* unisson : les danseurs et danseuses font les mêmes gestes en même temps ;
* répétition : le fait de répéter une série de gestes, une « phrase dansante » ;
* canon : les gestes sont faits avec un décalage régulier d'un danseur ou d'une danseuse à l'autre ;
* cascade : forme de canon dans laquelle le décalage est très petit ;
* contraste : deux danseur·euses, ou deux groupes, ont des gestuelles très différentes ;
* accumulation : la gestuelle se complexifie par l'ajout d'éléments au fur et à mesure ; ou bien le nombre de danseur·euses augmente ;
* dialogue : les gestes de danseur·euses ou de groupes se répondent ;
* contre-point : la gestuelle d'un ou une danseuse se superpose à la gestuelle d'un groupe ;
* lâcher-rattraper : les danseurs et danseuses alternent danse à l'unisson et gestuelles indépendantes.
: {{lien web
| url=https://www.youtube.com/watch?v=wgblAOzedFc
| titre=Les procédés de composition en danse
| auteur= Doisneau Sport TV
| site=YouTube
| date=2020-03-16 | consulté le=2021-01-21
}}
{{...}}
== Ostinato ==
L'ostinato, mot italien signifiant « obstiné », c'est le fait de jouer en boucle un passage. L'ostinato peut ainsi former une structure autour de laquelle peut se développer le morceau. Lorsque l'ostinato est joué par l'instrument de basse (basson, violoncelle, viole de gambe basse, flûte à bec basse, main gauche du piano…), on parle de basse obstinée. Les grilles d'accord en jazz sont des ostinatos (ou ostinati) joués par la section rythmique.
Exemples :
* {{lien web |url=https://www.youtube.com/watch?v=QZpGe5rNJkI&t=41s |titre=Epic Patty Cake Song (I'll Think Of You) |auteur=
Kurt Hugo Schneider |site=YouTube |date=2014-08-12 |consulté le=2026-01-24}} : un ostinato de percussions corporelles ;
* {{lien web |url=https://www.youtube.com/watch?v=Kv-37-nXC48 |titre=Pow Wow ''Le lion est mort ce soir'' Les Victoires de la Musique 1993 |auteur=Solomon Linda |date=2015-02-02 |consulté le=2026-01-24}} : dans ce chant ''a capella'' (sans accompagnement d'instrument), les voix de basse forment une basse obstinée, sur les syllabes « oëap » durant le couplet et « awimbowé » sur le refrain ;
* {{lien web |url=https://www.youtube.com/watch?v=JvNQLJ1_HQ0 |titre=Pachelbel Canon in D Major - the original and best version. |auteur=Voices of Music |site=YouTube |date=2008-09-02 |consulté le=2026-01-24}} : le ''Canon de Pachelbel de ''ré'' mineur'' (''Canon per tre Violini e Basso'', Johann Pachelbel, vers 1680) est construit sur une basse obstinée de huit mesures.
== Les accords en général ==
Initialement, on a des chants polyphoniques, des voix qui chantent chacune une mélodie, les mélodies se mêlant. On remarque que certaines superpositions de notes sonnent de manière plus ou moins agréables, consonantes ou dissonantes. On en vient alors à associer ces notes, c'est-à-dire à considérer dès le départ la superposition de ces notes et non pas la rencontre de ces notes au gré des mélodies. Ces groupes de notes superposées forment les accords. En Europe, cette notion apparaît vers le {{pc|xiv}}<sup>e</sup> siècle avec notamment la ''[[wikipedia:fr:Messe de Notre Dame|Messe de Notre Dame]]'' de Guillaume de Machaut (vers 1360-1365). La notion « d'accord parfait » est consacrée par [[wikipedia:fr:Jean-Philippe Rameau|Jean-Philippe Rameau]] dans son ''Traité de l'harmonie réduite à ses principes naturels'', publié en 1722.
=== Qu'est-ce qu'un accord ? ===
Un accord est un ensemble d'au minimum trois notes jouées en même temps. « Jouées » signifie qu'il faut qu'à un moment donné, elles sonnent en même temps, mais le début ou la fin des notes peut être à des instants différents.
Considérons que l'on joue les notes ''do'', ''mi'' et ''sol'' en même temps. Cet accord s'appelle « accord de ''do'' majeur ». En musique classique, on lui adjoint l'adjectif « parfait » : « accord parfait de ''do'' majeur ».
Nous représentons ci-dessous trois manière de faire l'accord : avec trois instruments jouant chacun une note :
[[Fichier:Do majeur trois portees.svg|class=transparent|center|Accord de ''do'' majeur avec trois instruments différents.]]
Avec un seul instrument jouant simultanément les trois notes :
[[Fichier:Chord C.svg|class=transparent|center|Accord de ''do'' majeur joué par un seul instrument.]]
L'accord tel qu'il est joué habituellement par une guitare d'accompagnement :
[[Fichier:Do majeur guitare.svg|class=transparent|center|Accord de ''do'' majeur à la guitare.]]
Pour ce dernier, nous représentons le diagramme indiquant la position des doigts sur le manche au dessus de la portée et la tablature en dessous. Ici, c'est au total six notes qui sont jouées : ''mi'' grave, ''do'' médium, ''mi'' médium, ''sol'' médium, ''do'' aigu, ''mi'' aigu. Mais il s'agit bien des trois notes ''do'', ''mi'' et ''sol'' jouées à des octaves différentes. Nous remarquons également que la note de basse (la note la plus grave), ''mi'', est différente de la note fondamentale (celle qui donne le nom à l'accord), ''do'' ; l'accord est dit « renversé » (voir plus loin).
=== Comment joue-t-on un accord ? ===
Les notes ne sont pas forcément jouées en même temps ; elles peuvent être « égrainées », jouée successivement, ce que l'on appelle un arpège. La partition ci-dessous montre six manières différentes de jouer un accord de ''la'' mineur à la guitare, plaqué puis arpégé.
[[Fichier:La mineur differentes executions.svg|class=transparent|center|Différentes exécution de l'accord de do majeur à la guitare.]]
[[Fichier:La mineur differentes executions midi.midi|vignette|Différentes exécution de l'accord de la mineur à la guitare.]]
Vous pouvez écouter l'exécution de cette partition avec le lecteur ci-contre.
Seuls les instruments polyphoniques peuvent jouer les accords plaqués : instruments à clavier (clavecin, orgue, piano, accordéon), les instruments à plusieurs cordes pincées (harpe, guitare ; violon, alto, violoncelle et contrebasse joués en pizzicati). Les instruments à corde frottés de la famille du violon peuvent jouer des notes par deux à l'archet mais pas plus du fait de la forme bombée du chevalet ; cependant, un mouvement rapide permet de jouer les quatre cordes de manière très rapprochée. Les instruments à percussion de type xylophone ou le tympanon permettent de jouer jusqu'à quatre notes simultanément en tenant deux baguettes (mailloches, maillets) par main.
Tous les instruments peuvent jouer des arpèges même si, dans le cas des instruments monodiques, les notes ne continuent pas à sonner lorsque l'on passe à la note suivante.
L'arpège peut être joué par l'instrument de basse (basson, violoncelle, contrebasse, guitare basse, pédalier de l'orgue…), notamment dans le cas d'une basse continue ou d'une ''{{lang|en|walking bass}}'' (« basse marchante » : la basse joue des noires, donnant ainsi l'impression qu'elle marche).
En jazz, et spécifiquement au piano, on a recours au ''{{lang|en|voicing}}'' : on choisit la manière dont on organise les notes pour donner une couleur spécifique, ou bien pour créer une mélodie en enchaînant les accords. Il est fréquent de ne pas jouer toutes les notes : si on n'en garde que deux, ce sont la tierce et la septième, car ce sont celles qui caractérisent l'accord (selon que la tierce est mineure ou majeure, que la septième est majeure ou mineure), et la fondamentale est en général jouée par la contrebasse ou guitare basse.
{{clear}}
=== Classes d'accord ===
[[Fichier:Intervalles harmoniques accords classes.svg|vignette|upright=1.5|Intervalles harmoniques dans les accords classés de trois, quatre et cinq notes.]]
Un accord composé d'empilement de tierces est appelé « accord classé ». En musique tonale, c'est-à-dire la musique fondée sur les gammes majeures ou mineures (cas majoritaire en musique classique), on distingue trois classes d'accords :
* les accords de trois notes, ou triades, ou accords de quinte ;
* les accords de quatre notes, ou accords de septième ;
* les accords de cinq notes, ou accords de neuvième.
En empilant des tierces, si l'on part de la note fondamentale, on a donc de intervalles de tierce, quinte, septième et neuvième.
En musique tonale, les accords avec d'autres intervalles (hors renversement, voir ci-après), typiquement seconde, quarte ou sixte, sont considérés comme des transitions entre deux accords classés. Ils sont appelés, selon leur utilisation, « accords à retard » (en anglais : ''{{lang|en|suspended chord}}'', accord suspendu) ou « appoggiature » (note « appuyée », étrangère à l'harmonie). Voir aussi plus loin la notion de note étrangère.
=== Renversements d'accords ===
[[File:Accord do majeur renversements.svg|thumb|Accord parfait de do majeur et ses renversements.]]
[[Fichier:Progression dominante renverse parfait do majeur.svg|vignette|upright=0.6|Progression accord de dominante renversé → accord parfait en ''do'' majeur.]]
Un accord classé est donc un empilement de tierces. Si l'on change l'ordre des notes, on a toujours le même accord mais il est fait avec d'autres intervalles harmoniques. Par exemple, l'accord parfait de ''do'' majeur dans son état fondamental, c'est-à-dire non renversé, s'écrit ''do'' - ''mi'' - ''sol''. Sa note fondamentale, ''do'', est aussi se note de basse.
Si maintenant on prend le ''do'' de l'octave supérieure, l'accord devient ''mi - sol - do'' ; c'est l'empilement d'une tierce ''(mi - sol)'' et d'une quarte ''(sol - do)'', soit la superposition d'une tierce ''(mi - sol)'' et d'une sixième ''(mi - do)''. C'est le premier renversement de l'accord parfait de ''do'' majeur ; la fondamentale est toujours ''do'' mais la basse est ''mi''. Le second renversement est ''sol - do - mi''.
L'utilisation de renversement peut faciliter l'exécution de la progression d'accord. Par exemple, en tonalité ''do'' majeur, si l'on veut passer de l'accord de dominante ''sol - si - ré'' à l'accord parfait ''do - mi - sol'', alors on peut utiliser le second renversement de l'accord de dominante : ''ré - sol - si'' → ''do - mi - sol''. Ainsi, la basse descend juste d'un ton ''(ré → do)'' et sur un piano, la main reste globalement dans la même position.
Le renversement d'un accord permet également de respecter certaines règles de l'harmonie classique, notamment éviter que des voix se suivent strictement (« mouvement parallèle »), ce qui aurait un effet de platitude.
De manière générale, la notion de renversement permet deux choses :
* d'enrichir l'œuvre : pour créer une harmonie donnée (c'est-à-dire des sons sonnant bien ensemble), nous avons plus de souplesse, nous pouvons organiser ces notes comme nous le voulons selon les voix ;
* de simplifier l'analyse : quelle que soit la manière dont sont organisées les notes, cela nous ramène à un même accord.
{{citation bloc|Or il, y a plusieurs manières de jouer un accord, selon que l'on aborde par la première note qui le constitue, ''do mi sol'', la deuxième, ''mi sol do'', ou la troisième note, ''sol do mi''. Ce sont les renversements, [que Rameau] va classer en différentes combinaisons d'une seule matrice. Faisant cela, Rameau divise le nombre d'accords [de septième] par quatre. Il simplifie, il structure […].|{{ouvrage|prénom1=André |nom1=Manoukian |titre=Sur les routes de la musique |éditeur=Harper Collins |année=2021 |passage=54 |isbn=979-1-03391201-9}} }}
{{clear}}
[[File:Plusieurs realisation 1er renversement doM.svg|thumb|Plusieurs réalisation du premier renversement de l'accord de ''do'' majeur.]]
Notez que
# Les notes peuvent être répétées plusieurs fois, à différentes octaves.
# Dans la notion de renversement, seule importe en fait la note de basse. Ainsi, les accords ''mi-sol-do'', ''mi-do-sol'', ''mi-do-mi-sol'', ''mi-sol-mi-do''… sont tous une déclinaison du premier renversement de ''do-mi-sol'' et ils seront abrégés de la même manière (''mi''<sup>6</sup> en musique classique ou C/E en musique populaire et jazz, voir plus bas).
{{clear}}
== Notation des accords de trois notes ==
Les accords de trois notes sont appelés « accords de quinte » en classique, et « triades » en jazz.
[[Fichier:Progression dominante renverse parfait do majeur chiffrage.svg|vignette|upright=0.7|Chiffrage du second renversement d'un accord de ''sol'' majeur et d'un accord de ''do'' majeur : notation en musique populaire et jazz (haut) et notation de basse chiffrée (bas).]]
Les accords sont construits de manière systématique. Nous pouvons donc les représenter de manière simplifiée. Cette notation simplifiée des accords est appelée « chiffrage ».
Reprenons la progression d'accords ci-dessus : « second renversement de l'accord de dominante - accord sur la tonique à l'état fondamental » dans la tonalité de ''do'' majeur. On utilise en général trois notations différentes :
* en musique populaire, jazz, rock… un accord est désigné par sa note fondamentale ; ici donc, les accords sont notés « ''sol'' - ''do'' » ou, en notation anglo-saxonne, « G - C » ;<br /> comme le premier accord est renversé, on indique la note de basse après une barre, la progression d'accords est donc chiffrée '''« ''sol''/''ré'' - ''do'' »''' ou '''« G/D - C »''' ;<br /> il s'agit ici d'accords composés d'une tierce majeure et d'une quinte juste ; si les accords sont constitués d'intervalles différents, nous ajoutons un symbole après la note : « m » ou « – » si la tierce est mineure, « dim » ou « ° » si la quinte est diminuée ;
* en musique classique, on utilise la notation de « basse chiffrée » (utilisée notamment pour noter la basse continue en musique baroque) : on indique la note de basse sur la portée et on lui adjoint l'intervalle de la fondamentale à la note la plus haute (donc ici respectivement 6 et 5, puisque ''sol''-''si'' est une sixte et ''do''-''sol'' est une quinte), étant sous-entendu que l'on a des empilements de tierce en dessous ; mais dans le cas du premier accord, le premier intervalle n'est pas une tierce, mais une quarte ''(ré''-''sol)'', on note donc '''« ''ré'' <sup>6</sup><sub>4</sub> - ''do'' <sup>5</sup> »'''<ref>quand on ne dispose pas de la notation en supérieur (exposant) et inférieur (indice), on utilise parfois une notation sous forme de fraction : ''sol'' 6/4 et ''do'' 5/.</ref> ;
* lorsque l'on fait l'analyse d'un morceau, on s'attache à identifier la note fondamentale de l'accord (qui est différente de la basse dans le cas d'un renversement) ; on indique alors le degré de la fondamentale : '''« {{Times New Roman|V<sup>6</sup><sub>4</sub> - I<sup>5</sup>}} »'''.
La notation de basse chiffrée permet de construire l'accord à la volée :
* on joue la note indiquée (basse) ;
* s'il n'y a pas de 2 ni de 4, on lui ajoute la tierce ;
* on ajoute les intervalles indiqués par le chiffrage.
La notation de musique jazz oblige à connaître la composition des différents accords, mais une fois que ceux-ci sont acquis, il n'y a pas besoin de reconstruire l'accord.
La notation de basse chiffrée avec les chiffres romains n'est pas utilisée pour jouer, mais uniquement pour analyser ; Sur les partitions avec basse chiffrée, il y a simplement les chiffrages indiqués au-dessus de la partie de basse. Le chiffrage avec le degré en chiffres romains présente l'avantage d'être indépendant de la tonalité et donc de se concentrer sur la fonction de l'accord au sein de la tonalité. Par exemple, ci-dessous, nous pouvons parler de la progression d'accords « {{Times New Roman|V - I}} » de manière générale, cette notation étant valable quelle que soit la tonalité.
[[File:Progression dominante renverse parfait do majeur chiffrage basse continue.svg|thumb|Chiffrage en notation basse chiffrée de la progression d'accords « second renversement de l'accord de dominante - accord sur la tonique à l'état fondamental » en do majeur.]]
{{note|En notation de base continue avec fondamentale en chiffres romains, la fondamentale est toujours indiquée ''sous'' la portée de la partie de basse. Les intervalles sont indiqués au-dessus de la portée de la partie de basse ; lorsque l'on fait une analyse, on peut ayssi les indiquer à côté du degré en chiffres romains, donc sous la portée de la basse.}}
{{note|En notation rock, le 5 en exposant indique un accord incomplet avec uniquement la fondamentale et la quinte, un accord sans tierce appelé « accord de puissance » ou ''{{lang|en|power chord}}''. Par exemple, C<sup>5</sup> est l'accord ''do-sol''.}}
{{clear}}
[[Fichier:Accords parfait do majeur basse chiffree fondamental et renverse.svg|vignette|upright=2.5|Chiffrage de l'accord parfait de ''do'' majeur en basse chiffrée, à l'état fondamental et ses renversements.]]
Concernant les accords parfaits en notation de basse chiffrée :
* un accord parfait à l'état fondamental est chiffré « <sup>5</sup> » ; on l'appelle « accord de quinte » ;
* le premier renversement est chiffré « <sup>6</sup> » (la tierce est implicite) ; on l'appelle « accord de sixte » ;
* le second renversement est noté « <sup>6</sup><sub>4</sub> » ; on l'appelle « accord de sixte et de quarte » (ou bien « de quarte et de sixte »).
Par exemple, pour l'accord parfait de ''do'' majeur :
* l'état fondamental ''do''-''mi''-''sol'' est noté ''do''<sup>5</sup> ;
* le premier renversement ''mi''-''sol''-''do'' est noté ''mi''<sup>6</sup> ;
* le second renversement ''sol''-''do''-''mi'' est noté ''sol''<sup>6</sup><sub>4</sub>.
Il y a une exception : l'accord construit sur la sensible (7{{e}} degré) contient une quinte diminuée et non une quinte juste. Le chiffrage est donc différent :
* l'état fondamental ''si''-''ré''-''fa'' est noté ''si''<sup><s>5</s></sup> (cinq barré), « accord de quinte diminuée » ;
* le premier renversement ''ré''-''fa''-''si'' est noté ''ré''<sup>+6</sup><sub>3</sub>, « accord de sixte sensible et tierce » ;
* le second renversement ''fa''-''si''-''ré'' est noté ''fa''<sup>6</sup><sub>+4</sub>, « accord de sixte et quarte sensible ».
Par ailleurs, on ne considère pas qu'il est fondé sur la sensible, mais sur la dominante. Si certains indiquent le degré {{Times New Roman|VII}}, d'autres indiquent le degré {{Times New Roman|V}} en mettant des guillemets, « {{Times New Roman|“V”}} ». Donc selon l'état, le chiffrage est {{Times New Roman|“V”<sup><s>5</s></sup>}}, {{Times New Roman|“V”<sup>+6</sup><sub>3</sub>}} ou {{Times New Roman|“V”<sup>6</sup><sub>+4</sub>}}.
En notation jazz, on ajoute « dim », « <sup>o</sup> » ou bien « <sup>♭5</sup> » au chiffrage, ici : B dim, B<sup>o</sup> ou B<sup>♭5</sup> pour l'état fondamental. Pour les renversements : B dim/D et B dim/F ; ou bien B<sup>o</sup>/D et B<sup>o</sup>/F ; ou bien B<sup>♭5</sup>/D et B<sup>♭5</sup>/F.
{{clear}}
[[Fichier:Accords basse chiffree basse do fondamental et renverses.svg|vignette|upright=2|Basse chiffrée : accords de quinte, de sixte et de sixte et de quarte ayant pour basse ''do''.]]
Et concernant les accords ayant pour basse ''do'' en tonalité de ''do'' majeur :
* l'accord ''do''<sup>5</sup> est un accord à l'état fondamental, c'est donc l'accord ''do''-''mi''-''sol'' (sa fondamentale est ''do'') ;
* l'accord ''do''<sup>6</sup> est le premier renversement d'un accord, c'est donc l'accord ''do''-''mi''-''la'' (sa fondamentale est ''la'') ;
* l'accord ''do''<sup>6</sup><sub>4</sub> est le second renversement d'un accord, c'est donc l'accord ''do''-''fa''-''la'' (sa fondamentale est ''fa'').
{{clear}}
== Notes étrangères ==
La musique européenne s'appuie essentiellement sur des accords parfaits, c'est-à-dire fondés sur une tierce majeure ou mineure, et une quinte juste. Il arrive fréquemment qu'un accord ne soit pas un accord parfait. Les notes qui font partie de l'accord parfait sont appelées « notes naturelles » et la note qui n'en fait pas partie est appelée « note étrangère ».
Il existe plusieurs types de notes étrangères :
* anticipation : la note étrangère est une note naturelle de l'accord suivant ;
* appogiature : note d'ornementation qui se résout par mouvement conjoint, c'est-à-dire qu'elle est suivie par une note située juste au-dessus ou en dessous (seconde ascendante ou descendante) qui est, elle, une note naturelle ;
* broderie : on part d'une note naturelle, on monte ou on descend d'une seconde, puis on revient sur la note naturelle ;
* double broderie : on part d'une note naturelle, on joue la note du dessus puis la note du dessous avant de revenir à la note naturelle ; ou bien on joue la note du dessous puis la note du dessus ;
* échappée : note étrangère n'appartenant à aucune des autres catégories ;
* note de passage : mouvement conjoint allant d'une note naturelle d'un accord à une note naturelle de l'accord suivant ;
* pédale : la note de basse reste la même pendant plusieurs accords successifs ;
* retard : la note étrangère est une note naturelle de l'accord précédent.
Les notes étrangères ne sont pas chiffrées.
[[File:Notes etrangeres accords.svg|center|Différents types de notes étrangères.]]
{{note|Les anglophones distinguent deux types de retard : la ''{{lang|en|suspension}}'' est résolue vers le haut (le mouvement est ascendant), le ''{{lang|en|retardation}}'' est résolu vers le bas (le mouvement est descendant).}}
== Principaux accords ==
Les trois principaux accords sont :
* l'accord parfait majeur : il est construit sur les degrés {{Times New Roman|I}} (tonique), {{Times New Roman|IV}} (médiante) et {{Times New Roman|V}} (dominante) d'une gamme majeure ; il est noté {{Times New Roman|I}}<sup>5</sup>, {{Times New Roman|IV}}<sup>5</sup>, {{Times New Roman|V}}<sup>5</sup> ;
* l'accord parfait mineur : il est construit sur les degrés {{Times New Roman|I}} (tonique) et {{Times New Roman|IV}} (sous-tonique) d'une gamme mineure harmonique ; il est également noté {{Times New Roman|I}}<sup>5</sup> et {{Times New Roman|IV}}<sup>5</sup>, les anglo-saxons le notent {{Times New Roman|i}}<sup>5</sup> et {{Times New Roman|iv}}<sup>5</sup> (la minuscule indiquant le caractère mineur) ;
* l'accord de septième de dominante : il est construit sur le degré {{Times New Roman|V}} (dominante) d'une gamme majeure ou mineure harmonique ; il est noté {{Times New Roman|V}}<sup>7</sup><sub>+</sub>.
On peut trouver ces trois accords sur d'autres degrés, et il existe d'autre types d'accords. Nous verrons cela plus loin.
{| class="wikitable"
|+ Constitution des principaux accords — Dénomination classique
|-
! scope="col" | Accord
! scope="col" | 1<sup>er</sup> intervalle
! scope="col" | 2<sup>e</sup> intervalle
! scope="col" | 3<sup>e</sup> intervalle
|-
! scope="row" | Accord parfait majeur
| tierce majeure (3M) || quinte juste (5J) || —
|-
! scope="row" | Accord parfait mineur
| tierce mineure (3m) || quinte juste (5J) || —
|-
! scope="row" | Accord de septième de dominante
| tierce majeure (3M) || quinte juste (5J) || septième mineure (7m)
|}
{| class="wikitable"
|+ Constitution des principaux accords — Dénomination jazz
|-
! scope="col" | Accord
! scope="col" | 1<sup>er</sup> intervalle
! scope="col" | 2<sup>e</sup> intervalle
! scope="col" | 3<sup>e</sup> intervalle
|-
! scope="row" | Triade majeure
| tierce majeure (3M) || quinte juste (5J) || —
|-
! scope="row" | Triade mineure
| tierce mineure (3m) || quinte juste (5J) || —
|-
! scope="row" | Accord de septième
| tierce majeure (3M) || quinte juste (5J) || septième mineure (7m)
|}
{| border="0"
|-
| [[Fichier:Accord do majeur arpege puis plaque.midi | Accord parfait de ''do'' majeur (C).]] || [[Fichier:Accord do mineur arpege puis plaque.midi | Accord parfait de ''do'' mineur (Cm).]] || [[Fichier:Accord do septieme arpege puis plaque.midi | Accord de septième de dominante de ''fa'' majeur (C<sup>7</sup>).]]
|-
| Accord parfait<br /> de ''do'' majeur (C). || Accord parfait<br /> de ''do'' mineur (Cm). || Accord de septième de dominante<br /> de ''fa'' majeur (C<sup>7</sup>).
|}
'''Rappel :'''
* la tierce mineure est composée d'un ton et demi (1 t ½) ;
* la tierce majeur est composée de deux tons (2 t) ;
* la quinte juste a la même altération que la fondamentale, sauf lorsque la fondamentale est ''si'' (la quinte juste est alors ''fa''♯) ;
* la septième mineure est le renversement de la seconde majeure (1 t).
[[File:Renversements accords pft fa maj basse chiffree.svg|thumb|Renversements de l'accord parfait de ''fa'' majeur, et la notation de basse chiffrée.]]
[[File:Renversements accord sept de dom fa maj basse chiffree.svg|thumb|Renversements de l'accord de septième de dominante de ''fa'' majeur, et la notation de basse chiffrée.]]
{| class="wikitable"
|+ Notation des principaux accords en musique classique
|-
! scope="col" | Accord
! scope="col" | État<br /> fondamental
! scope="col" | Premier<br /> renversement
! scope="col" | Deuxième<br /> renversement
! scope="col" | Troisième<br /> renversement
|-
! scope="row" | Accord parfait
| {{Times New Roman|I<sup>5</sup>}}<br/> acc. de quinte || {{Times New Roman|I<sup>6</sup>}}<br :> acc. de sixte || {{Times New Roman|I<sup>6</sup><sub>4</sub>}}<br /> acc. de quarte et de sixte || —
|-
! scope="row" | Accord de septième<br /> de dominante
| {{Times New Roman|V<sup>7</sup><sub>+</sub>}}<br /> acc.de septième de dominante || {{Times New Roman|V<sup>6</sup><sub><s>5</s></sub>}}<br />acc. de sixte et quinte diminuée || {{Times New Roman|V<sup>+6</sup>}}<br />acc. de sixte sensible || {{Times New Roman|V<sup>+4</sup>}}<br />acc. de quarte sensible<br />acc. de triton
|}
{| class="wikitable"
|+ Notation des principaux accords en jazz
|-
! scope="col" | Accord
! scope="col" | Chiffrage
! scope="col" | Renversements
|-
! scope="row" | Triade majeure
| X
| rowspan="3" | Les renversements se notent en mettant la basse après une barre de fraction, par exemple pour la triade de ''do'' majeur :
* état fondamental : C ;
* premier renversement : C/E ;
* second renversement : C/G.
|-
! scope="row" | Triade mineure
| Xm, X–
|-
! scope="row" | Septième
| X<sup>7</sup>
|}
{{clear}}
Dans le cas d'un accord de septième de dominante, le nom de l'accord change selon que l'on est en musique classique ou en jazz : en musique classique, on donne le nom de la tonalité alors qu'en jazz, on donne le nom de la fondamentale. Ainsi, l'accord appelé « septième de dominante de ''do'' majeur » en musique classique, est appelé « ''sol'' sept » (G<sup>7</sup>) en jazz : la dominante (degré {{Times New Roman|V}}, dominante) de la tonalité de ''do'' majeur est la note ''sol''.
Comment appelle-t-on en musique classique l'accord appelé « ''do'' sept » (C<sup>7</sup>) en jazz ? Les tonalités dont le ''do'' est la dominante sont les tonalités de ''fa'' majeur (''si''♭ à la clef) et de ''fa'' mineur harmonique (''si''♭, ''mi''♭, ''la''♭ et ''ré''♭ à la clef et ''mi''♮ accidentel). Il s'agit donc de l'accord de septième de dominante des tonalités de ''fa'' majeur et ''fa'' mineur harmonique.
{| class="wikitable"
|+ Accords fréquents pour quelques la tonalités majeures
! scope="col" | Tonalité
! scope="col" | Armure
! scope="col" | Accord parfait<br />{{Times New Roman|I<sup>5</sup>}}
! scope="col" | Accord de septième<br />de dominante<br />{{Times New Roman|V<sup>7</sup><sub>+</sub>}}
|-
|''Do'' majeur || || C<br />''do-mi-sol'' || G7<br />''sol-si-ré-fa''
|-
|''Sol'' majeur || ''fa''♯ || G<br />''sol-si-ré'' || D7<br />''ré-fa''♯''-la-do''
|-
|''Ré'' majeur || ''fa''♯, ''do''♯ || D<br />''ré-fa''♯''-la'' || A7<br />''la-do''♯''-mi-sol''
|-
|''La'' majeur || ''fa''♯, ''do''♯, ''sol''♯ || A<br />''la-do''♯''-mi'' || E7<br />''mi-sol''♯''-si-ré''
|-
| ''Fa'' majeur || ''si''♭ || F<br />''fa-la-do'' || C7<br />''do-mi-sol-si''♭
|-
| ''Si''♭ majeur || ''si''♭, ''mi''♭ || B♭<br />''si''♭''-ré-fa'' || F7<br />''fa-la-do-mi''♭
|-
| ''Mi''♭ majeur || ''si''♭, ''mi''♭, ''la''♭ || E♭<br />''mi''♭''-sol-si''♭ || B♭7<br />''si''♭''-ré-fa-la''♭
|}
{| class="wikitable"
|+ Accords fréquents pour quelques la tonalités mineures harmoniques
! scope="col" | Tonalité
! scope="col" | Armure
! scope="col" | Accord parfait<br />{{Times New Roman|i<sup>5</sup>}}
! scope="col" | Accord de septième<br />de dominante<br />{{Times New Roman|V<sup>7</sup><sub>+</sub>}}
|-
|''La'' mineur<br />harmonique || || Am, A–<br />''la-do-mi'' || E7<br />''mi-sol''♯''-si-ré''
|-
|''Mi'' mineur<br />harmonique || ''fa''♯ || Em, E–<br />''mi-sol-si'' || B7<br />''si-ré''♯''-fa''♯''-la''
|-
|''Si'' mineur<br />harmonique || ''fa''♯, ''do''♯ || Bm, B–<br />''si-ré-fa''♯ || F♯7<br />''fa''♯''la''♯''-do''♯''-mi''
|-
|''Fa''♯ mineur<br />harmonique || ''fa''♯, ''do''♯, ''sol''♯ || F♯m, F♯–<br />''fa''♯''-la-do''♯ || C♯7<br />''do''♯''-mi''♯''-sol''♯''-si''
|-
| ''Ré'' mineur<br />harmonique || ''si''♭ || Dm, D–<br />''ré-fa-la'' || A7<br />''la-do''♯''-mi-sol''
|-
| ''Sol'' mineur<br />harmonique || ''si''♭, ''mi''♭ || Gm, G–<br />''sol-si''♭''-ré'' || D7<br />''ré-fa''♯''-la-do''
|-
| ''Do'' mineur<br />harmonique || ''si''♭, ''mi''♭, ''la''♭ || Cm, C–<br />''do-mi''♭''-sol'' || G7<br />''sol-si''♮''-ré-fa''
|}
{{clear}}
== Accords sur les degrés d'une gamme ==
=== Harmonisation d'une gamme ===
[[Fichier:Accord trois notes gamme do majeur chiffre.svg|vignette|upright=1.2|Accords de trois note sur la gamme de ''do'' majeur, chiffrés.]]
On peut ainsi construire une triade par degré d'une gamme.
Pour une gamme majeure, les accords {{Times New Roman|I<sup>5</sup>}}, {{Times New Roman|IV<sup>5</sup>}} et {{Times New Roman|V<sup>5</sup>}} ont une tierce majeure. Les accords {{Times New Roman|II<sup>5</sup>}}, {{Times New Roman|III<sup>5</sup>}}, {{Times New Roman|VI<sup>5</sup>}} et {{Times New Roman|(VII) “V”<sup><s>5</s></sup>}} ont une tierce mineure ; ils sont parfois notés avec des chiffres romains minuscules par les anglo-saxons : {{Times New Roman|ii<sup>5</sup>}}, {{Times New Roman|iii<sup>5</sup>}}, {{Times New Roman|vi<sup>5</sup>}} et {{Times New Roman|(vii) “V”<sup><s>5</s></sup>}}.
Les accords ont tous une quinte juste à l'exception de l'accord {{Times New Roman|(vii) “V”<sup><s>5</s></sup>}} qui a une quinte diminuée, raison pour laquelle le « 5 » est barré. C'est un accord dit « de quinte diminuée ». En jazz, l'accord diminué est noté « dim », « ° », « m<sup>♭5</sup> » ou « <sup>–♭5</sup> ».
Nous avons donc trois types d'accords (dans la notation jazz) : X (triade majeure), Xm (triade mineure) et X° (triade diminuée), la lettre X remplaçant le nom de la note fondamentale.
{{clear}}
[[Fichier:Accord trois notes gamme la mineur chiffre.svg|vignette|upright=1.2|Accords de trois notes sur une gamme de ''la'' mineur harmonique, chiffrés.]]
Pour une gamme mineure harmonique, les accords {{Times New Roman|III<sup>+5</sup>}}, {{Times New Roman|V<sup>♯</sup>}} et {{Times New Roman|VI<sup>5</sup>}} ont une tierce majeure. Les accords {{Times New Roman|I<sup>5</sup>}}, {{Times New Roman|II<sup><s>5</s></sup>}}, {{Times New Roman|IV<sup>5</sup>}} et {{Times New Roman|(VII) “V”<sup><s>5</s></sup>}} ont une tierce mineure ; ils sont parfois notés avec des chiffres romains minuscules par les anglo-saxons : {{Times New Roman|i<sup>5</sup>}}, {{Times New Roman|ii<sup><s>5</s></sup>}}, {{Times New Roman|iv<sup>5</sup>}} et {{Times New Roman|(vii) “V”<sup><s>5</s></sup>}}.
Les accords {{Times New Roman|ii<sup><s>5</s></sup>}} et {{Times New Roman|(vii) “V”<sup><s>5</s></sup>}} ont une quinte diminuée ; ce sont des accords dits « de quinte diminuée ». L'accord {{Times New Roman|III<sup>+5</sup>}} a une quinte augmentée ; le signe « plus » indique que la note de cinquième, le ''sol'' dièse, est la sensible. En jazz, l'accord est noté « aug » ou « <sup>+</sup> ». Les autres accords ont une quinte juste.
Aux trois accords générés par une gamme majeure (X, Xm et X°), nous voyons ici apparaître un quatrième type d'accord : la triade augmentée X<sup>+</sup>.
Nous remarquons que des gammes ont des accords communs. Par exemple, l'accord {{Times New Roman|ii<sup>5</sup>}} de ''do'' majeur est identique à l'accord {{Times New Roman|iv<sup>5</sup>}} de ''la'' mineur (il s'agit de l'accord Dm).
Quel que soit le mode, les accords construits sur la sensible (accord de quinte diminuée) sont rarement utilisés. S'ils le sont, c'est en tant qu'accord de septième de dominante sans fondamentale (voir ci-après). C'est la raison pour laquelle le chiffrage indique le degré {{Times New Roman|V}} entre guillemets, et non pas le degré {{Times New Roman|VII}} (mais pour des raisons de clarté, nous l'indiquons entre parenthèses au début).
En mode mineur, l'accord de quinte augmentée {{Times New Roman|iii<sup>+5</sup>}} est très peu utilisé (voir plus loin ''[[#Progression_d'accords|Progression d'accords]]''). C'est un accord considéré comme dissonant.
On voit que :
* un accord parfait majeur peut appartenir à cinq gammes différentes ;<br /> par exemple l'accord parfait de ''do'' majeur est l'accord construit sur le {{Times New Roman|I}}<sup>er</sup> degré de la gamme de ''do'' majeur, sur le {{Times New Roman|IV}}<sup>e</sup> degré de ''sol'' majeur, sur le {{Times New Roman|V}}<sup>e</sup> degré de ''fa'' majeur, sur le {{Times New Roman|V}}<sup>e</sup> degré de ''fa'' mineur et sur le {{Times New Roman|VI}}<sup>e</sup> degré de ''mi'' mineur ;
* un accord parfait mineur peut appartenir à cinq gammes différentes ;<br />par exemple l'accord parfait de ''la'' mineur est l'accord construit sur le {{Times New Roman|I}}<sup>er</sup> de la gamme de ''la'' mineur, sur le {{Times New Roman|IV}}<sup>e</sup> degré de ''mi'' mineur, sur le {{Times New Roman|II}}<sup>e</sup> degré de ''sol'' majeur, sur le {{Times New Roman|III}}<sup>e</sup> degré de ''fa'' majeur et sur le {{Times New Roman|VI}}<sup>e</sup> degré de ''do'' majeur ;
* un accord de quinte diminuée peut appartenir à trois gammes différentes ;<br />par exemple, l'accord de quinte diminuée de ''si'' est l'accord construit sur le {{Times New Roman|VII}}<sup>e</sup> degré de ''do'' majeur, sur le {{Times New Roman|II}}<sup>e</sup> degré de ''la'' mineur et sur le {{Times New Roman|VII}}<sup>e</sup> degré de ''do'' mineur ;
* un accord de quinte augmentée (à l'état fondamental) ne peut appartenir qu'à une seule gamme ;<br /> par exemple, l'accord de quinte augmentée de ''do'' est l'accord construit sur le {{Times New Roman|III}}<sup>e</sup> degré de ''la'' mineur.
{| class="wikitable"
|+ Notation jazz des triades
|-
| rowspan="2" colspan="2" |
! scope="col" colspan="2" | Tierce
|-
! scope="col" | 3m
! scope="col" | 3M
|-
! rowspan="3" | Quinte
! scope="row" | 5d
| Xᵒ, X<sub>m</sub><sup>(♭5)</sup> ||
|-
! scope="row" | 5J
| Xm, X– || X
|-
! scope="row" | 5A
| || X+, X<sup>(♯5)</sup>
|}
=== Harmonisation par des accords de septième ===
[[Fichier:Harmonisation gamme do majeur par septiemes chiffre.svg|vignette|upright=2|Harmonisation de la gamme de do majeur par des accords de septième.]]
Les accords de septième contiennent une dissonance et créent ainsi une tension. Ils sont très utilisés en jazz. Nous avons représenté ci-contre l'harmonisation de la gamme de ''do'' majeur.
La constitution des accords est la suivantes :
* tierce majeure (3M)
** quinte juste (5J)
*** septième mineure (7m) : sur le degré V, c'est l'accord de septième de dominante V<sup>7</sup><sub>+</sub>, noté X<sup>7</sup> (X pour G),
*** septième majeure (7M) : sur les degrés I et IV, appelés « accords de septième majeure » et notés aussi X<sup>maj7</sup> ou X<sup>Δ</sup> (X pour C ou F) ;
* tierce mineure (3m)
** quinte juste (5J)
*** septième mineure : sur les degrés ii, iii et vi, appelés « accords mineur septième » et notés Xm<sup>7</sup> ou X–<sup>7</sup> (X pour D, E ou A),
** quinte diminuée (5d)
*** septième mineure (7m) : sur le degré vii, appelé « accord demi-diminué » (puisque seule la quinte est diminuée) et noté X<sup>∅</sup> ou Xm<sup>7(♭5)</sup> ou X–<sup>7(♭5)</sup> (X pour B) ;<br /> en musique classique, on considère que c'est un accord de neuvième de dominante sans fondamentale.
Nous avons donc quatre types d'accords : X<sup>7</sup>, X<sup>maj7</sup>, Xm<sup>7</sup> et X<sup>∅</sup>
En jazz, on ajoute souvent la quarte à l'accord de sous-dominante IV (sur le ''fa'' dans une gamme de ''do'' majeur) ; il s'agit ici d'une quarte augmentée (''fa''-''si'') et l'accord est surnommé « accord lydien » mais cette dénomination est erronée (il s'agit d'une mauvaise interprétation de textes antiques). C'est un accord de onzième sans neuvième (la onzième étant l'octave de la quarte), il est noté X<sup>maj7(♯11)</sup> ou X<sup>Δ(♯11)</sup> (ici, F<sup>maj7(♯11)</sup>, ''fa''-''la''-''do''-''mi''-''si'' ou ''fa''-''la''-''si''-''do''-''mi'').
{| class="wikitable"
|+ Chiffrage jazz des accords de septième
|-
! scope="col" rowspan="2" | Tierce
! scope="col" rowspan="2" | Quinte
! scope="col" colspan="2" | Septième
|-
! scope="col" | 7m
! scope="col" | 7M
|-
| rowspan="2" | 3m
| 5d || X<sup>∅</sup>, X<sub>m</sub><sup>7(♭5)</sup>, X–<sup>7(♭5)</sup> ||
|-
| rowspan="2" | 5J
| X<sub>m</sub><sup>7</sup>, X–<sup>7</sup> ||
|-
| rowspan="2" | 3M
| X<sup>7</sup> || X<sup>maj7</sup>, X<sup>Δ</sup>
|-
| 5A || || X<sub>+</sub><sup>maj7</sup>, X<sub>+</sub><sup>Δ</sup>
|}
=== Modulation et emprunt ===
Un morceau peut comporter des changements de tonalité; appelés « modulation ». Il y a parfois un court passage dans une tonalité différente, typiquement sur une ou deux mesures, avant de retourner dans la tonalité d'origine : on parle d'emprunt. Lorsqu'il y a une modulation ou un emprunt, les degrés changent. Un même accord peut donc avoir une fonction dans une partie du morceau et une autre fonction ailleurs. L'utilisation d'accord différents, et en particulier d'accord utilisant des altérations accidentelles, indique clairement une modulation.
Nous avons vu précédemment que les modulations courantes sont :
* les modulations dans les tons voisins ;
* les modulations homonymes ;
* les marches harmoniques.
Une modulation entre une tonalité majeure et mineure change la couleur du passage,
* la modulation la plus « douce » est entre les tonalités relatives (par exemple''do'' majeur et ''la'' mineur) car ces tonalités utilisent quasiment les mêmes notes ;
* la modulation la plus « voyante » est la modulation homonyme (par exemple entre ''do'' majeur et ''do'' mineur).
Une modulation commence souvent sur l'accord de dominante de la nouvelle tonalité.
Pour analyser un œuvre, ou pour improviser sur une partie, il est important de reconnaître les modulations. La description de la successind es tonalités s'appelle le « parcours tonal ».
=== Exercices élémentaires ===
L'apprentissage des accords passe par quelques exercices élémentaires.
'''1. Lire un accord'''
Il s'agit de lecture de notes : des notes composant les accords sont écrites « empilées » sur une portée, il faut les lire en énonçant les notes de bas en haut.
'''2. Reconnaître la « couleur » d'un accord'''
On écoute une triade et il faut dire si c'est une triade majeure ou mineure. Puis, on complexifie l'exercice en ajoutant la septième.
'''3. Chiffrage un accord'''
Trouver le nom d'un accord à partir des notes qui le composent.
'''4. Réalisation d'un accord'''
Trouver les notes qui composent un accord à partir de son nom.
'''5. Dictée d'accords'''
On écoute une succession d'accords et il faut soit écrire les notes sur une portée, soit écrire les noms de accords.
[[File:Exercice constitution accord basse chiffree.svg|thumb|Exercice : constitution d'accord à partir de la basse chiffrée.]]
'''Exercices de basse chiffrée'''
''Réalisation d'un accord''
Sur la figure suivante, écrire les notes des accords correspondant à la basse chiffrée. Déterminer le degré de la fondamentale pour chaque accord en considérant que nous sommes dans la tonalité de ''sol'' majeur.
{{boîte déroulante/début|titre=Solution}}
[[File:Exercice constitution accord basse chiffree solution.svg|vignette|Solution.]]
# La note de basse est un ''do''. Le chiffrage ne contient pas de 2 ni de 4. Nous ajoutons donc la tierce, ''mi'', puis nous appliquons le chiffrage 5 et ajoutons la quinte, ''sol''.<br />Le chiffrage « <sup>5</sup> » indique que c'est un accord dans son état fondamental (l'écart entre deux notes consécutives ne dépasse pas la tierce), la fondamentale est donc la basse, ''do'', qui est le degré IV de la tonalité.
# La note de basse est un ''si''. Le chiffrage ne contient pas de 2 ni de 4. Nous ajoutons donc la tierce, ''ré'', puis nous appliquons le chiffrage 6 et ajoutons la sixte, ''sol''.<br />Le chiffrage « <sup>6</sup> » indique que c'est un accord dans son premier renversement. En le remettant dans son état fondamental, nous obtenons ''sol-si-ré'', la fondamentale est donc la tonique, le degré I.
# La note de basse est un ''la''. Nous ajoutons la tierce (chiffre 3), ''do'', et la sixte (6), ''fa''♯. Nous vérifions que le ''fa''♯ est la sensible (signe +)<br />Nous voyons un « blanc » entre les notes ''do'' et ''fa''♯. En descendant le ''fa''♯ à l'octave inférieure, nous obtenons un empilement de tierces ''fa''♯-''la-do'', le fondamentale est donc ''fa''♯, le degré VII. Nous pouvons le voir comme le deuxième renversement de l'accord de septième de dominante, sans fondamentale.
# La note de basse est un ''fa''♯. Le chiffrage ne contient pas de 2 ni de 4. Nous ajoutons donc la tierce, ''la'', puis nous appliquons le chiffrage 5 et ajoutons la quinte, ''do'' ; nous vérifions qu'il s'agit bien d'une quinte diminuée (le 5 est barré). Nous appliquons le chiffre 6 et ajoutons la sixte, ''ré''.<br />Nous voyons que les notes ''do'' et ''ré'' sont conjointes (intervalle de seconde). En descendant le ''ré'' à l'octave inférieure, nous obtenons un empilement de tierces ''ré-fa''♯-''la-do'', le fondamentale est donc ''ré'', le degré V. Nous constatons que l'accord chiffré est le premier renversement de l'accord de septième de dominante.
{{boîte déroulante/fin}}
{{clear}}
''Chiffrage d'accords''
[[Fichier:Exercice chiffrage accord basse chiffree.svg|vignette|Accords à chiffrer.]]
Chiffrer les accords ci-contre.
{{boîte déroulante/début|titre=Solution}}
[[File:Exercice chiffrage accord basse chiffree solution.svg|vignette|Solution.]]
# On relève les intervalles en partant de la basse : tierce majeure (3M) et quinte juste (5J). Le chiffrage complet est donc ''fa''<sup>5</sup><sub>3</sub>. On simplifie en enlevant le 3, le chiffrage est donc ''fa''<sup>5</sup>.<br /> On peut aussi reconnaître que c'est l'accord parfait sur la tonique de la tonalité de ''fa'' majeur dans son état fondamental, le chiffrage d'un accord parfait étant <sup>5</sup>.
# On relève les intervalles en partant de la basse : quarte juste (4J), sixte majeure (6M). Le chiffrage complet est donc ''fa''<sup>6</sup><sub>4</sub>.<br /> On peut aussi reconnaître que c'est le second renversement de l'accord ''mi-sol-si'', sur la tonique de la tonalité de ''mi'' mineur, le chiffrage du second renversement d'un accord parfait étant <sup>6</sup><sub>4</sub>.
# Les intervalles en partant de la basse sont : tierce mineure (3m), quinte diminuée (5d), sixte mineure (6m). Le chiffrage complet est donc ''mi''<sup>6</sup><small><s>5</s></small><sub>3</sub>. On simplifie en enlevant le 3, le chiffrage est donc ''mi''<sup>6</sup><sub><s>5</s></sub>.<br /> On reconnaît le premier renversement de l'accord ''do-mi-sol-si''♭, accord de septième de dominante de la tonalité de ''fa'' majeur.
# Les intervalles en partant de la basse sont : tierce mineure (3m), quinte juste (5J), septième mineure (7m). Le chiffrage complet est donc ''ré''<sup>7</sup><small>5</small><sub>3</sub> ; c'est typique d'un accord de septième de dominante, son chiffrage est donc ''ré''<sup>7</sup><sub>+</sub>.<br /> On reconnaît l'accord de septième de dominante de la tonalité de ''sol'' mineur dans son état fondamental.
{{boîte déroulante/fin}}
{{clear}}
[[File:Exercice constitution accord notation jazz.svg|thumb|Exercice : constitution d'un accord d'après son chiffrage en notation jazz.]]
'''Exercices de notation jazz'''
''Réalisation d'un accord''
Sur la figure suivante, écrire les notes des accords correspondant aux chiffrages.
{{boîte déroulante/début|titre=Solution}}
[[File:Exercice constitution accord notation jazz solution.svg|thumb|Solution.]]
# Il s'agit de la triade majeure de ''do'' dans son état fondamental. Les intervalles en partant de la fondamentale sont la tierce majeure (3M) et la quinte juste (5J). Les notes sont donc ''do-mi-sol''.
# Il s'agit de la triade majeure de ''sol''. Les intervalles en partant de la fondamentale sont la tierce majeure (3M) et la quinte juste (5J). Les notes sont donc ''sol-si-ré''. On renverse l'accord afin que la basse soit le ''si'', l'accord est donc ''si-ré-sol''.
# Il s'agit de l'accord demi-diminué de ''fa''♯. Les intervalles sont la tierce mineure (3m), la quinte diminuée (5d) et la septième mineure (7m). Les notes sont donc ''fa''♯-''la-do-mi''. Nous renversons l'accord afin que la basse soit le ''la'', l'accord est donc ''a-do-mi-fa''♯.
# Il s'agit de l'accord de septième de ''ré''. Les intervalles sont donc la tierce majeure (3M), la quinte juste (5J) et la septième mineure (7m). Les notes sont ''ré-fa''♯''-la-do''. Nous renversons l'accord afin que la basse soit le ''fa''♯, l'accord est donc ''fa''♯''-la-do-ré''.
{{boîte déroulante/fin}}
{{clear}}
''Chiffrage d'accords''
[[File:Exercice chiffrage accord notation jazz.svg|thumb|Accords à chiffrer.]]
Chiffrer les accords ci-contre.
{{boîte déroulante/début|titre=Solution}}
[[File:Exercice chiffrage accord notation jazz solution.svg|thumb|Solution.]]
# Les notes sont toutes sur des interlignes consécutifs, c'est donc un empilement de tierces ; l'accord est dans son état fondamental. Les intervalles sont une tierce majeure (''fa-la'' : 3M) et une quinte juste (''fa-do'' : 5J), c'est donc la triade majeure de ''fa''. Le chiffrage est F.
# Il y a un blanc dans l'empilement des notes, c'est donc un accord renversé. En permutant les notes pour n'avoir que des tierces, on trouve l'accord ''mi-sol-si''. Les intervalles sont une tierce mineure (''mi-sol'' : 3m) et une quinte juste (''mi-si'' : 5J), c'est donc la triade mineure de ''mi'' avec un ''si'' à la basse. Le chiffrage est Em/B ou E–/B.
# Il y deux notes conjointes, c'est donc un renversement. L'état fondamental de cet accord est ''do-mi-sol-si''♭. Les intervalles sont une tierce majeure (''do-mi'' : 3M), une quinte juste (''do-sol'' : 5J) et une septième mineure (''do-si''♭ : 7m). C'est donc l'accord de ''do'' septième avec un ''mi'' à la basse, chiffré C<sup>7</sup>/E.
# Les notes sont toutes sur des interlignes consécutifs, l'accord est dans son état fondamental. Les intervalles sont la tierce mineure (''ré-fa'' : 3m), une quinte juste (''ré-la'' : 5J) et une septième mineure (''ré-do'' : 7m). C'est donc l'accord de ''ré'' mineur septième, chiffré Dm<sup>7</sup> ou D–<sup>7</sup>.
{{boîte déroulante/fin}}
{{clear}}
== Harmonie fonctionnelle ==
Le choix des accords et de leur succession — la progression des accords — est un élément important d'un morceau, de sa composition. Le compositeur ou la compositrice a bien sûr une liberté totale, mais pour faire des choix, il faut comprendre les conséquences de ces choix, et donc ici, les effets produits par les accords et leur progression.
Une des manières d'aborder le sujet est l'harmonie fonctionnelle.
=== Les trois fonctions des accords ===
En harmonie tonale, on considère que les accords ont une fonction. Il existe trois fonctions :
* la fonction de tonique, {{Times New Roman|I}} ;
* la fonction de sous-dominante, {{Times New Roman|IV}} ;
* la fonction de dominante, {{Times New Roman|V}}.
L'accord de tonique, {{Times New Roman|I}}, est l'accord « stable » de la tonalité par excellence. Il conclut en général les morceaux, et ouvre souvent les morceaux ; il revient fréquemment au cours du morceau.
L'accord de dominante, {{Times New Roman|V}}, est un accord qui introduit une instabilité, une tension. En particulier, il contient la sensible (degré {{Times New Roman|VI}}), qui est une note « aspirée » vers la tonique. Cette tension, qui peut être renforcée par l'utilisation d'un accord de septième, est fréquemment résolue par un passage vers l'accord de tonique. Nous avons donc deux mouvements typiques : {{Times New Roman|I}} → {{Times New Roman|V}} (création d'une tension, d'une attente) et {{Times New Roman|V}} → {{Times New Roman|I}} (résolution d'une tension). Les accords de tonique et de dominante ont le cinquième degré en commun, cette note sert donc de pivot entre les deux accords.
L'accord de sous-dominante, {{Times New Roman|IV}}, est un accord qui introduit lui aussi une tension, mais moins grande : il ne contient pas la sensible. Notons que s'il est une quarte au-dessus de la tonique, il est aussi une quinte en dessous d'elle ; il est symétrique de l'accord de dominante. Il a donc un rôle similaire à l'accord de dominante, mais atténué. L'accord de sous-dominante aspire soit vers l'accord de dominante, très proche, et l'on a alors une augmentation de la tension ; soit vers l'accord de tonique, un retour vers la stabilité (il a alors un rôle semblable à la dominante). Du fait de ces deux bifurcations possibles — augmentation de la tension ({{Times New Roman|IV}} → {{Times New Roman|V}}) ou retour à la stabilité ({{Times New Roman|IV}} → {{Times New Roman|I}}) —, l'utilisation de l'accord de sous-dominante introduit un certain flottement : si l'on peut facilement prédire l'accord qui suit un accord de dominante, on ne peut pas prédire ce qui suit un accord de sous-dominante.
Notons que la composition ne consiste pas à suivre ces règles de manière stricte, ce qui conduirait à des morceaux stéréotypés et plats. Le plaisir d'écoute joue sur une alternance entre satisfaction d'une attente (respect des règles) et surprise (rompre les règles).
=== Accords remplissant ces fonctions ===
Les accords sur les autres degrés peuvent se ramener à une de ces trois fonctions :
* {{Times New Roman|II}} : fonction de sous-dominante {{Times New Roman|IV}} ;
* {{Times New Roman|III}} (très peu utilisé en mode mineur en raison de sa dissonance) et {{Times New Roman|VI}} : fonction de tonique {{Times New Roman|I}} ;
* {{Times New Roman|VII}} : fonction de dominante {{Times New Roman|V}}.
En effet, les accords étant des empilements de tierces, des accords situés à une tierce l'un de l'autre — {{Times New Roman|I}} ↔ {{Times New Roman|III}}, {{Times New Roman|II}} ↔ {{Times New Roman|IV}}, {{Times New Roman|V}} ↔ {{Times New Roman|VII}}, {{Times New Roman|VI}} ↔ {{Times New Roman|VIII}} ( = {{Times New Roman|I}}) — ont deux notes en commun. On retrouve le fait que l'accord sur le degré {{Times New Roman|VII}} est considéré comme un accord de dominante sans tonique. En mode mineur, l'accord sur le degré {{Times New Roman|III}} est évité, il n'a donc pas de fonction.
{|class="wikitable"
|+ Fonction des accords
|-
! scope="col" | Fondamentale
! scope="col" | Fonction
|-
| {{Times New Roman|I}} || tonique
|-
| {{Times New Roman|II}} || sous-dominante faible
|-
| {{Times New Roman|III}} || tonique faible
|-
| {{Times New Roman|IV}} || sous-dominante
|-
| {{Times New Roman|V}} || dominante
|-
| {{Times New Roman|VI}} || tonique faible
|-
| {{Times New Roman|VII}} || dominante faible
|}
Par exemple en ''do'' majeur :
* fonction de tonique : '''''do''<sup>5</sup> (C)''', ''mi''<sup>5</sup> (E–), ''la''<sup>5</sup> (A–) ;
* fonction de sous-dominante : '''''fa''<sup>5</sup> (F)''', ''ré''<sup>5</sup> (D–) ;
* fonction de dominante : '''''sol''<sup>5</sup> (G)''' ou ''sol''<sup>7</sup><sub>+</sub> (G<sup>7</sup>), ''si''<sup> <s>5</s></sup> (B<sup>o</sup>).
En ''la'' mineur harmonique :
* fonction de tonique : '''''la''<sup>5</sup> (A–)''', ''fa''<sup>5</sup> (F) [, rarement : ''do''<sup>+5</sup> (C<sup>+</sup>)] ;
* fonction de sous-dominante : '''''ré''<sup>5</sup> (D–)''', ''si''<sup> <s>5</s></sup> (B<sup>o</sup>) ;
* fonction de dominante : '''''mi''<sup>5</sup> (E)''' ou ''mi''<sup>7</sup><sub>+</sub> (E<sup>7</sup>), ''sol''♯<sup> <s>5</s></sup> (G♯<sup>o</sup>).
Le fait d'utiliser des accords différents pour remplir une fonction permet d'enrichir l'harmonie, et de jouer sur l'équilibre entre satisfaction d'une attente (on respecte les règles sur les fonctions) et surprise (mais on n'utilise pas l'accord attendu).
=== Les dominantes secondaires ===
On utilise aussi des accords de septième dominante se fondant sur un autre degré que la dominante de la gamme ; on parle de « dominante secondaire ». Typiquement, avant un accord de septième de dominante, on utilise parfois un accord de dominante de dominante, dont le degré est alors noté « {{Times New Roman|V}} de {{Times New Roman|V}} » ou « {{Times New Roman|V}}/{{Times New Roman|V}} » ; la fondamentale est de l'accord est alors situé cinq degrés au-dessus de la dominante ({{Times New Roman|V}}), c'est donc le degré {{Times New Roman|IX}}, c'est-à-dire le degré {{Times New Roman|II}} de la tonalité en cours). Ou encore, on utilise un accord de dominante du degré {{Times New Roman|IV}} (« {{Times New Roman|V}} de {{Times New Roman|IV}} », la fondamentale est alors le degré {{Times New Roman|I}}) avant un accord sur le degré {{Times New Roman|IV}} lui-même.
Par exemple, en tonalité de ''do'' majeur, on peut trouver un accord ''ré - fa''♯'' - la - do'' (chiffré {{Times New Roman|V}} de {{Times New Roman|V}}<sup>7</sup><sub>+</sub>), avant un accord ''sol - si - ré - fa'' ({{Times New Roman|V}}<sup>7</sup><sub>+</sub>). L'accord ''ré - fa''♯'' - la - do'' est l'accord de septième de dominante des tonalités de ''sol''. Dans la même tonalité, on pourra utiliser un accord ''do - mi - sol - si''♭ ({{Times New Roman|V}} de {{Times New Roman|IV}}<sup>7</sup><sub>+</sub>) avant un accord ''fa - la - do'' ({{Times New Roman|IV}}<sup>5</sup>). Le recours à une dominante secondaire peut atténuer une transition, par exemple avec un enchaînement ''do''<sup>5</sup> → ''do''<sup>7</sup><sub>+</sub> → ''fa''<sup>5</sup> (C → C<sup>7</sup> → F) qui correspond à un enchaînement {{Times New Roman|I}} → {{Times New Roman|V}} de {{Times New Roman|IV}} → {{Times New Roman|IV}} : le passage ''do''<sup>5</sup> → ''do''<sup>7</sup><sub>+</sub> (C → C<sup>7</sup>) se fait en ajoutant une note (le ''si''♭) et rend naturel le passage ''do'' → ''fa''.
Sur les sept degré de la gamme, on ne considère en général que cinq dominantes secondaires : en effet, la dominante du degré {{Times New Roman|I}} est la dominante « naturelle, primaire » de la tonalité (et n'est donc pas secondaire) ; et utiliser la dominante de {{Times New Roman|VII}} consisterait à considérer l'accord de {{Times New Roman|VII}} comme un accord propre, on évite donc les « {{Times New Roman|V}} de “{{Times New Roman|V}}” » (mais les « “{{Times New Roman|V}}” de {{Times New Roman|V}} » sont tout à fait « acceptables »).
=== Enchaînements classiques ===
Nous avons donc vu que l'on trouve fréquemment les enchaînements suivants :
* pour créer une instabilité :
** {{Times New Roman|I}} → {{Times New Roman|V}},
** {{Times New Roman|I}} → {{Times New Roman|IV}} (instabilité moins forte mais incertitude sur le sens d'évolution) ;
* pour maintenir l'instabilité :
** {{Times New Roman|IV}} → {{Times New Roman|V}} ;
* pour résoudre l'instabilité :
** {{Times New Roman|IV}} → {{Times New Roman|I}},
** {{Times New Roman|V}} → {{Times New Roman|I}}, cas particuliers (voir plus bas) :
*** {{Times New Roman|V}}<sup>+4</sup> → {{Times New Roman|I}}<sup>6</sup>,
*** {{Times New Roman|I}}<sup>6</sup><sub>4</sub> → {{Times New Roman|V}}<sup>7</sup><sub>+</sub> → {{Times New Roman|I}}<sup>5</sup>.
Les degrés indiqués ci-dessus sont les fonctions ; on peut donc utiliser les substitutions suivantes :
* {{Times New Roman|I}} par {{Times New Roman|VI}} et, en tonalité majeure, {{Times New Roman|III}} ;
* {{Times New Roman|IV}} par {{Times New Roman|II}} ;
* {{Times New Roman|V}} par {{Times New Roman|VII}}.
Pour enrichir l'harmonie, on peut utiliser les dominantes secondaires, en particulier :
* {{Times New Roman|V}} de {{Times New Roman|V}} ({{Times New Roman|II}}<sup>7</sup><sub>+</sub>) → {{Times New Roman|V}},
* {{Times New Roman|V}} de {{Times New Roman|IV}} ({{Times New Roman|I}}<sup>7</sup><sub>+</sub>) → {{Times New Roman|IV}}.
On peut enchaîner les enchaînements, par exemple {{Times New Roman|I}} → {{Times New Roman|IV}} → {{Times New Roman|V}}, ou encore {{Times New Roman|I}} → {{Times New Roman|V}} de {{Times New Roman|IV}} → {{Times New Roman|IV}}… En jazz, on utilise très fréquemment l'enchaînement {{Times New Roman|II}} → {{Times New Roman|V}} → {{Times New Roman|I}} (deux-cinq-un).
On peut bien sûr avoir d'autres enchaînements, mais ces règles permettent d'analyser un grand nombre de morceaux, et donnent des clefs utiles pour la composition. Nous voyons ci-après un certain nombre d'enchaînements courants dans différents styles
== Exercice ==
Un hautboïste travaille la sonate en ''do'' mineur S. 277 de Heinichen. Sur le deuxième mouvement ''Allegro'', il a du mal à travailler un passage en raison des altérations accidentelles. Sur la suggestion de sa professeure, il décide d'analyser la progression d'accords sous-jacente afin que les altérations deviennent logiques. Il s'agit d'un duo hautbois et basson pour lequel les accords ne sont pas chiffrés, le basson étant ici un instrument soliste et non pas un élément de la basse continue.
Sur l'extrait suivant, déterminez les basses et la qualité (chiffrage) des accords sous-jacents. Commentez.
[[Fichier:Sonate hautbois basson heinichen 2e mvt mes49.svg|center|Extrait du deuxième mouvement Allegro de la sonate en trio en do mineur S. 277 de Johann David Heinichen.]]
{{note|L'œuvre est en ''do'' mineur et devrait donc avoir trois bémols à la clef, or ici il n'y en a que deux. En effet, le ''la'' pouvant être bécarre en mode mineur mélodique ascendant, le compositeur a préféré le noter explicitement en altération accidentelle lorsque l'on est en mode mélodique naturel, harmonique ou mélodique descendant. C'est un procédé assez courant à l'époque baroque.}}
{{boîte déroulante/début|titre=Solution}}
Une des difficultés ici est que les arpèges joués par les instruments sont agrémentés de notes de passage.
Les notes de la basse (du basson) sont différentes entre le premier et le deuxième temps de chaque mesure et ne peuvent pas appartenir au même accord. On a donc un accord par temps.
Sur le premier temps de chaque mesure, le basson joue une octave. La note concernée est donc la basse de chaque accord. Pour savoir s'il s'agit d'un accord à l'état fondamental ou d'un renversement, on regarde ce que joue le hautbois : dans un mouvement conjoint (succession d'intervalles de secondes), il est difficile de distinguer les notes de l'arpège des notes de passage, mais
: les notes des grands intervalles font partie de l'accord.
Ainsi, sur le premier temps de la première mesure (la basse est un ''mi''♭), on a une sixte descendante ''sol''-''si''♭ et, à la fin du temps, une tierce descendante ''sol''-''mi''♭. L'accord est donc ''mi''♭-''sol''-''si''♭, c'est un accord de quinte (accord parfait à l'état fondamental). À la fin du premier temps, le basson joue un ''do'', c'est donc une note étrangère.
Sur le second temps de la première mesure, le basson joue une tierce ascendante ''fa''-''la''♭, la première note est la basse de l'accord et la seconde une des notes de l'accord. Le hautbois commence par une sixte descendante ''la''♭-''do'', l'accord est donc ''fa''-''la''♭-''do'', un accord de quinte (accord parfait à l'état fondamental). Le ''do'' du basson la fin du premier temps est donc une anticipation.
Les autres notes étrangères de la première mesure sont des notes de passage.
Mais il faut faire attention : en suivant ce principe, sur les premiers temps des deuxième et troisième mesure, nous aurions des accords de septième d'espèce (puisque la septième est majeure). Or, on ne trouve pas, ou alors exceptionnellement, d'accord de septième d'espèce dans le baroque, mais quasi exclusivement des accords de septième de dominante. Donc au début de la deuxième mesure, le ''la''♮ est une appoggiature du ''si''♭, l'accord est donc ''si''♭-''ré''-''fa'', un asscord de quinte. De même, au début de la troisième mesure, le ''sol'' est une appoggiature du ''la''♭.
Il faut donc se méfier d'une analyse purement « mathématique ». Il faut s'attacher à ressentir la musique, et à connaître les styles, pour faire une analyse pertinente.
Ci-dessous, nous avons grisé les notes étrangères.
[[Fichier:Sonate hautbois basson heinichen 2e mvt mes49 analyse.svg|center|Extrait du deuxième mouvement Allegro de la sonate en trio en do mineur S. 277 de Johann David Heinichen. Analyse de la progression harmonique.]]
Le chiffrage jazz équivalent est :
: | E♭ F– | B♭<sup>Δ</sup> E♭ | A♭<sup>Δ</sup> D– | G …
Nous remarquons une progression assez régulière :
: ''mi''♭ ↗[2<sup>de</sup>] ''fa'' | ↘[5<sup>te</sup>] ''si''♭ ↗[4<sup>te</sup>] ''mi''♭ | ↘[5<sup>te</sup>] ''la''♭ ↗[4<sup>te</sup>] ''ré'' | ↘[5<sup>te</sup>] ''sol''
Le ''mi''♭ est le degré {{Times New Roman|III}} de la tonalité principale (''do'' mineur), c'est donc une tonique faible ; il « joue le même rôle » qu'un ''do''. S'il y avait eu un accord de ''do'' au début de l'extrait, on aurait eu une progression parfaitement régulière ↗[4<sup>te</sup>] ↘[5<sup>te</sup>].
Nous avons les modulations suivantes :
* mesure 49 : ''do'' mineur naturel (le ''si''♭ n'est pas une sensible) avec un accord sur “{{Times New Roman|I}}” (tonique faible, {{Times New Roman|III}}, pour la première analyse, ou bien tonique forte, {{Times New Roman|I}}, pour la seconde) suivi d'un accord sur {{Times New Roman|IV}} ;
* mesure 50 : ''si''♭ majeur avec un accord sur {{Times New Roman|I}} suivi d'un accord sur {{Times New Roman|IV}} ;
* mesure 51 : ''la''♭ majeur avec un accord sur {{Times New Roman|I}}, et emprunt à ''do'' majeur avec un accord sur {{Times New Roman|II}} ({{Times New Roman|IV}} faible).
On a donc une marche harmonique {{Times New Roman|I}} → {{Times New Roman|IV}} qui descend d'une seconde majeure (un ton) à chaque mesure (''do'' → ''si''♭ → ''la''♭), avec une exception sur la dernière mesure (modulation en cours de mesure et descente d'une seconde mineure au lieu de majeure).
Ce passage est donc construit sur une régularité, une règle qui crée un effet d'attente — enchaînement {{Times New Roman|I}}<sup>5</sup> → {{Times New Roman|IV}}<sup>5</sup> avec une marche harmonique d'une seconde majeure descendante —, et des « surprises », des exceptions au début — ce n'est pas un accord {{Times New Roman|I}}<sup>5</sup> mais un accord {{Times New Roman|III}}<sup>5</sup> — et à la fin — modulation en milieu de mesure et dernière descente d'une seconde mineure (½t ''la''♭ → ''sol'').
L'extrait ne permet pas de le deviner, mais la mesure 52 est un retour en ''do'' mineur, avec donc une modulation sur la dominante (accord de ''sol''<sup>7</sup><sub>+</sub>, G<sup>7</sup>).
{{boîte déroulante/fin}}
== Progression d'accords ==
Comme pour la mélodie, la succession des accords dans un morceau, la progression d'accords, suit des règles. Et comme pour la mélodie, les règles diffèrent d'un style musical à l'autre et la créativité consiste à parfois ne pas suivre ces règles. Et comme pour la mélodie, on part d'un ensemble de notes organisé, d'une gamme caractéristique d'une tonalité, d'un mode.
Les accords les plus utilisés pour une tonalité donnée sont les accords dont la fondamentale sont les degrés {{Times New Roman|I}}, {{Times New Roman|IV}} et {{Times New Roman|V}} de la tonalité, en particulier la triade {{Times New Roman|I}}, appelée « accord parfait » ou « accord de tonique », et l'accord de septième {{Times New Roman|V}}, appelé « septième de dominante ».
Le fait d'avoir une progression d'accords qui se répète permet de structurer un morceau. Pour les morceaux courts, il participe au plaisir de l'écoute et facilite la mémorisation (par exemple le découpage couplet-refrain d'une chanson). Sur les morceaux longs, une trop grande régularité peut introduire de la lassitude, les longs morceaux sont souvent découpés en parties présentant chacune une progression régulière. Le fait d'avoir une progression régulière permet la pratique de l'improvisation : cadence en musique classique, solo en jazz et blues.
; Note
: Le terme « cadence » désigne plusieurs choses différentes, et notamment en harmonie :
:* une partie improvisée dans un opéra ou un concerto, sens utilisé ci-dessus ;
:* une progression d'accords pour ponctuer un morceau et en particulier pour le conclure, sens utilisé dans la section suivante.
=== Accords peu utilisés ===
En mode mineur, l'accord de quinte augmentée {{Times New Roman|III<sup>+5</sup>}} est très peu utilisé. C'est un accord dissonant ; il intervient en général comme appogiature de l'accord de tonique (par exemple en ''la'' mineur : {{Times New Roman|III<sup>+5</sup>}} ''do'' - ''mi'' - ''sol''♯ → {{Times New Roman|I<sup>6</sup>}} ''do'' - ''mi'' - ''la''), ou de l'accord de dominante ({{Times New Roman|III<sup>6</sup><sub>+3</sub>}} ''mi'' - ''sol''♯ - ''do'' → {{Times New Roman|V<sup>5</sup>}} ''mi'' - ''sol''♯ - ''si''). Il peut être aussi utilisé comme préparation à l'accord de sous-dominante (enchaînement {{Times New Roman|III}} → {{Times New Roman|IV}}). Par ailleurs, il a une constitution symétrique — c'est l'empilement de deux tierces majeures — et ses renversements ont les mêmes intervalles à l'enharmonie près (quinte augmentée/sixte mineure, tierce majeure/quarte diminuée). De ce fait, un même accord est commun, par renversement et à l'enharmonie près, à trois tonalités : le premier renversement de l'accord ''do'' - ''mi'' - ''sol''♯ ({{Times New Roman|III}}<sup>e</sup> degré de ''la'' mineur) est enharmonique à ''mi'' - ''sol''♯ - ''si''♯ ({{Times New Roman|III}}<sup>e</sup> degré de ''do''♯ mineur) ; le second renversement est enharmonique à ''la''♭ - ''do'' - ''mi'' ({{Times New Roman|III}}<sup>e</sup> degré de ''fa'' mineur).
=== Accords très utilisés ===
Les trois accords les plus utilisés sont les accords de tonique (degré {{Times New Roman|I}}), de sous-dominante ({{Times New Roman|IV}}) et de dominante ({{Times New Roman|V}}). Ils interviennent en particulier en fin de phrase, dans les cadences. L'accord de dominante sert souvent à introduire une modulation : la modulation commence sur l'accord de dominante de la nouvelle tonalité. On note que l'accord de sous-dominante est situé une quinte juste en dessous de la tonique, les accords de dominante et de sous-dominante sont donc symétriques.
En jazz, on utilise également très fréquemment l'accord de la sus-tonique (degré {{Times New Roman|II}}), souvent dans des progressions {{Times New Roman|II}} - {{Times New Roman|V}} (- {{Times New Roman|I}}). Rappelons que l'accord de sus-tonique a la fonction de sous-dominante.
=== Cadences et ''turnaround'' ===
Le terme « cadence » provient de l'italien ''cadenza'' et désigne la « chute », la fin d'un morceau ou d'une phrase musicale.
On distingue deux types de cadences :
* les cadences conclusive, qui créent une sensation de complétude ;
* les cadences suspensives, qui crèent une sensation d'attente.
==== Cadence parfaite ====
[[Fichier:Au clair de le lune cadence parfaite.midi|thumb|''Au clair de la lune'', harmonisé avec une cadence parfaite (italienne).]]
[[Fichier:Au clair de le lune mineur cadence parfaite.midi|thumb|''Idem'' mais en mode mineur harmonique.]]
La cadence parfaite est l'enchaînement de l'accord de dominante suivi de l'accord parfait : {{Times New Roman|V<sup>5</sup> - I<sup>5</sup>}}, les deux accord étant à l'état fondamental. Elle donne une impression de stabilité et est donc très souvent utilisée pour conclure un morceau. C'est une cadence conclusive.
On peut aussi utiliser l'accord de septième de dominante, la dissonance introduisant une tension résolue par l'accord parfait : {{Times New Roman|V<sup>7</sup><sub>+</sub> - I<sup>5</sup>}}.
Elle est souvent précédée de l'accord construit sur le IV<sup>e</sup> degré, appelé « accord de préparation », pour former la cadence italienne : {{Times New Roman|IV<sup>5</sup> - V<sup>5</sup>}} (ou {{Times New Roman|V<sup>7</sup><sub>+</sub>}}) {{Times New Roman|- I<sup>5</sup>}}.
Elle est également souvent précédée du second renversement de l'accord de tonique, qui est alors appelé « appoggiature de la cadence » : {{Times New Roman|I<sup>6</sup><sub>4</sub> - V<sup>5</sup>}} (ou {{Times New Roman|V<sup>7</sup><sub>+</sub>}}) {{Times New Roman|- I<sup>5</sup>}} (on remarque que les accords {{Times New Roman|I}}<sup>6</sup><sub>4</sub> et {{Times New Roman|V}}<sup>5</sup> ont la basse en commun, et que l'on peut passer de l'un à l'autre par un mouvement conjoint sur les autres notes).
{{clear}}
==== Demi-cadence ====
[[Fichier:Au clair de le lune demi cadence.midi|thumb|''Au clair de la lune'', harmonisé avec une demi-cadence.]]
Une demi-cadence est une phrase ou un morceau se concluant sur l'accord construit sur le cinquième degré. Il provoque une sensation d'attente, de suspens. Il s'agit en général d'une succession {{Times New Roman|II - V}} ou {{Times New Roman|IV - V}}. C'est une cadence suspensive. On utilise rarement un accord de septième de dominante.
{{clear}}
==== Cadence rompue ou évitée ====
La cadence rompue, ou cadence évitée, est succession d'un accord de dominante et d'un accord de sus-dominante, {{Times New Roman|V}} - {{Times New Roman|VI}}. C'est une cadence suspensive.
==== Cadence imparfaite ====
Une cadence imparfaite est une cadence {{Times New Roman|V - I}}, comme la cadence parfaite, mais dont au moins un des deux accords est dans un état renversé.
==== Cadence plagale ====
La cadence plagale — du grec ''plagios'', oblique, en biais — est la succession de l'accord construit sur le quatrième degré, suivi de l'accord parfait : {{Times New Roman|IV<sup>5</sup> - I<sup>5</sup>}}. Elle peut être utilisée après une cadence parfaite ({{Times New Roman|V<sup>5</sup> - I<sup>5</sup>}} - {{Times New Roman|IV<sup>5</sup> - I<sup>5</sup>}}). Elle donne un caractère solennel, voire religieux — elle est parfois appelée « cadence amen » —, elle a un côté antique qui rappelle la musique modale et médiévale<ref>{{lien web |url=https://www.radiofrance.fr/francemusique/podcasts/maxxi-classique/la-cadence-amen-ou-comment-se-dire-adieu-7191921 |titre=La cadence « Amen » ou comment se dire adieu |auteur=Max Dozolme (MAXXI Classique) |site=France Musique |date=2025-04-25 |consulté le=2025-04-25}}.</ref>.
C'est une cadence conclusive.
==== {{lang|en|Turnaround}} ====
[[Fichier:Au clair de le lune turnaround.midi|thumb|Au clair de la lune, harmonisé en style jazz : accords de 7{{e}}, anatole suivie d'un ''{{lang|en|turnaround}}'' ii-V-I.]]
Le terme ''{{lang|en|turnaround}}'' signifie revirement, retournement. C'est une succession d'accords que fait la transition entre deux parties, en créant une tension-résolution. Le ''{{lang|en|turnaround}}'' le plus courant est la succession {{Times New Roman|II - V - I}}.
On utilise également fréquemment l'anatole : {{Times New Roman|I - VI - II - V}}.
{| class="wikitable"
|+ Progressions typiques d'accords dans une tonalité majeure
! scope="col" | Tonalité
! scope="col" | Armure
! scope="col" | Cadence<br />parfaite<br /> {{Times New Roman|V - I}}
! scope="col" | Cadence<br />italienne<br />{{Times New Roman|IV - V - I}}
! scope="col" | Demi-<br />cadence<br />{{Times New Roman|ii - V ou IV - V}}
! scope="col" | Cadence<br />plagale<br />{{Times New Roman|IV - I}}
! scope="col" | ''Turnaround''<br />{{Times New Roman|ii - V - I}}
! scope="col" | Anatole<br />{{Times New Roman|I - vi - ii - V}}
|-
|''Do'' majeur || || G - C || F - G - C || Dm - G ou F - G || F - C || Dm - G - C || C - Am - Dm - G
|-
|''Sol'' majeur || ''fa''♯ || D - G || C - D - G || Am - D ou C - D || C - G || Am - D - G || G - Em - Am - D
|-
|''Ré'' majeur || ''fa''♯, ''do''♯ || A - D || G - A - D || Em - A ou G - A || G - D || Em - A - D || D - Bm - Em - A
|-
|''La'' majeur || ''fa''♯, ''do''♯, ''sol''♯ || E - A || D - E - A || Bm - E ou D - E || D - A || Bm - E - A || A - F♯m - B - E
|-
| ''Fa'' majeur || ''si''♭ || C - F || B♭ - C - F || Gm - C ou B♭ - C || B♭ - F || Gm - C - F || F - Dm - Gm - C
|-
| ''Si''♭ majeur || ''si''♭, ''mi''♭ || F - B♭ || E♭ - F - B♭ || Cm - F ou E♭ - F || E♭ - B♭ || Cm - F - B♭ || B♭ - Gm - Cm - F
|-
| ''Mi''♭ majeur || ''si''♭, ''mi''♭, ''la''♭ || B♭ - E♭ || A♭ - B♭ - E♭ || Fm - B♭ ou A♭ - B♭ || A♭ - E♭ || Fm - B♭ - E♭ || Gm - Cm - Fm - B♭
|}
{| class="wikitable"
|+ Progressions typiques d'accords dans une tonalité mineure
! scope="col" | Tonalité
! scope="col" | Armure
! scope="col" | Cadence<br />parfaite<br />{{Times New Roman|V - i}}
! scope="col" | Cadence<br />italienne<br />{{Times New Roman|iv - V - i}}
! scope="col" | Demi-<br />cadence<br />{{Times New Roman|ii - V ou iv - V}}
! scope="col" | Cadence<br />plagale<br />{{Times New Roman|iv - i}}
! scope="col" | ''Turnaround''<br />{{Times New Roman|ii - V - I}}
! scope="col" | Anatole<br />{{Times New Roman|i - VI - ii - V}}
|-
| ''La'' mineur<br />harmonique || || E - Am || Dm - E - Am || B° - E ou Dm - E || Dm - Am || B° - E - Am || Am - F - B° - E
|-
| ''Mi'' mineur<br />harmonique || ''fa''♯ || B - Em || Am - B - Em || F♯° - B ou Am - B || Am - Em || F♯° - B - Em || Em - C - F♯° - B
|-
| ''Si'' mineur<br />harmonique || ''fa''♯, ''do''♯ || F♯ - Bm || Em - F♯ - Bm || C♯° - F♯ ou Em - F♯ || Em - Bm || C♯° - F♯ - Bm || Bm - G - C♯° - F♯
|-
| ''Fa''♯ mineur<br />harmonique || ''fa''♯, ''do''♯, ''sol''♯ || C♯ - F♯m || Bm - C♯ - F♯m || G♯° - C♯ ou Bm - C♯ || Bm - F♯m || G♯° - C♯ - F♯m || A+ - D - G♯° - C♯
|-
| ''Ré'' mineur<br />harmonique || ''si''♭ || A - Dm || Gm - A - Dm || E° - A ou Gm - A || Gm - Dm || E° - A - Dm || Dm - B♭ - E° - A
|-
| ''Sol'' mineur<br />harmonique || ''si''♭, ''mi''♭ || D - Gm || Cm - D - Gm || A° - D ou Cm - D || Cm - Gm|| A° - D - Gm || Gm - E♭ - A° - D
|-
| ''Do'' mineur<br />harmonique || ''si''♭, ''mi''♭, ''la''♭ || G - Cm || Fm - G - Cm || D° - G ou Fm - G || Fm - Dm || D° - G - Cm || Cm - A♭ - D° - G
|}
==== Exemple : ''La Mer'' ====
: {{lien web
| url = https://www.youtube.com/watch?v=PXQh9jTwwoA
| titre = Charles Trenet - La mer (Officiel) [Live Version]
| site = YouTube
| auteur = Charles Trenet
| consulté le = 2020-12-24
}}
Le début de ''La Mer'' (Charles Trenet, 1946) est en ''do'' majeur et est harmonisé par l'anatole {{Times New Roman|I-vi-ii-V<sup>7</sup>}} (C - Am - Dm - G<sup>7</sup>) sur deux mesures, jouée deux fois ({{Times New Roman|1=<nowiki>|I-vi|ii-V</nowiki><sup>7</sup><nowiki>|</nowiki>}} × 2). Viennent des variations avec les progressions {{Times New Roman|I-III-vi-V<sup>7</sup>}} (C - E - Am - G<sup>7</sup>) puis la « progression ’50s » (voir plus bas) {{Times New Roman|I-vi-IV-VI<sup>7</sup>}} (C - Am - F - A<sup>7</sup>, on remarque que {{Times New Roman|IV}}/F est le relatif majeur du {{Times New Roman|ii}}/Dm de l'anatole), jouées chacune une fois sur deux mesure ; puis cette première partie se conclut par une demie cadence {{Times New Roman|ii-V<sup>7</sup>}} sur une mesure puis une dernière anatole sur trois mesures ({{Times New Roman|1=<nowiki>|I-vi|ii|V</nowiki><sup>7</sup><nowiki>|</nowiki>}}). Cela constitue une première partie « A » sur douze mesures qui se termine par une demi-cadence ({{Times New Roman|ii-V<sup>7</sup>}}) qui appelle une suite. Cette partie A est jouée une deuxième fois mais la fin est modifiée pour la transition : les deux dernières mesures {{Times New Roman|<nowiki>|ii|V</nowiki><sup>7</sup><nowiki>|</nowiki>}} deviennent {{Times New Roman|<nowiki>|ii-V</nowiki><sup>7</sup><nowiki>|I|</nowiki>}} (|Dm-G7|C|), cette partie « A’ » se conclut donc par une cadence parfaite ({{Times New Roman|V<sup>7</sup>-I}}).
Le morceau passe ensuite en tonalité de ''mi'' majeur, donc une tierce au dessus de ''do'' majeur, sur six mesures. Cette partie utilise une progression ’50s {{Times New Roman|I-vi-IV-V<sup>7</sup>}} (E - C♯m - A - B<sup>7</sup>), qui est rappelons-le une variation de l'anatole, l'accord {{Times New Roman|ii}} (Fm) étant remplacé par son relatif majeur {{Times New Roman|IV}} (A). Cette anatole modifiée est jouée deux fois puis la partie en ''mi'' majeur se conclut par l'accord parfait {{Times New Roman|I}} joué sur deux mesures (|E|E|), on a donc, avec la mesure précédente, avec une cadence parfaite ({{Times New Roman|V<sup>7</sup>-I}}).
Suivent ensuite six mesures en ''sol'' majeur, donc à nouveau une tierce au dessus de ''mi'' majeur. Elle comporte une progression {{Times New Roman|I-vi-IV-V<sup>7</sup>}} (G - Em - C - D<sup>7</sup>), donc anatole avec substitution du {{Times New Roman|ii}}/Am par son relatif majeur {{Times New Roman|VI}}/C (progression ’50s), puis une anatole {{Times New Roman|I-vi-ii-V<sup>7</sup>}} (G - Em - Am - D<sup>7</sup>) et deux mesure sur la tonique {{Times New Roman|I-I<sup>7</sup>}} (G - G<sup>7</sup>), formant à nouveau une cadence parfaite. La fin sur un accord de septième, dissonant, appelle une suite.
Cette partie « B » de douze mesures comporte donc deux parties similaires « B1 » et « B2 » qui forment une marche harmonique (montée d'une tierce).
Le morceau se conclut par une reprise de la partie « A’ » et se termine donc par une cadence parfaite.
Nous avons une structure A-A’-B-A’ sur 48 mesures, proche la forme AABA étudiée plus loin.
Donc ''La Mer'' est un morceau structuré autour de l'anatole avec des variations (progression ’50s, substitution du {{Times New Roman|ii}} par son relatif majeur {{Times New Roman|IV}}) et comportant une marche harmonique dans sa troisième partie. Les parties se concluent par des ''{{lang|en|turnarounds}}'' sous la forme d'une cadence parfaite ou, pour la partie A, par une demi-cadence.
{| border="1" rules="rows" frame="hsides"
|+ Structure de ''La Mer''
|- align="center"
|
| colspan="12" | ''do'' majeur
|
|- align="center"
! scope="row" rowspan=2 | A
| colspan="2" | anatole
| colspan="2" | //
| colspan="2" | variation
| colspan="2" | ’50s
| ½ c.
| colspan="3" | anatole
|
|-
| <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|ii-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|ii-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I-III}} || <nowiki>|</nowiki> {{Times New Roman|vi-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|IV-VI<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|ii-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|ii}} || <nowiki>|</nowiki> {{Times New Roman|V<sup>7</sup>}} || <nowiki>|</nowiki>
|- align="center"
! scope="row" rowspan="2" | A’
| colspan="2" | anatole
| colspan="2" | //
| colspan="2" | variation
| colspan="2" | ’50s
| ½ c.
| colspan="2" | anatole
| c.p.
|
|-
| <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|ii-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|ii-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I-III}} || <nowiki>|</nowiki> {{Times New Roman|vi-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|IV-VI<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|ii-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|ii-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I}} || <nowiki>|</nowiki>
|- align="center"
|
| colspan="6" | B1 : ''mi'' majeur
| colspan="6" background="lightgray" | B2 : ''sol'' majeur
|
|- align="center"
! scope="row" rowspan="2" | B
| colspan="2" | ’50s
| colspan="2" | //
|colspan="2" | c.p.
| colspan="2" | ’50s
| colspan="2" | //
|colspan="2" | c.p.
|
|-
| <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|IV-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|IV-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I}} || <nowiki>|</nowiki> {{Times New Roman|I}} || <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|IV-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I-vi}} || <nowiki>|</nowiki> {{Times New Roman|IV-V<sup>7</sup>}} || <nowiki>|</nowiki> {{Times New Roman|I}} || <nowiki>|</nowiki> {{Times New Roman|I<sup>7</sup>}} || <nowiki>|</nowiki>
|-
! scope="row" | A’
| colspan="12" |
|
|}
=== Progression blues ===
La musique blues est apparue dans les années 1860. Elle est en général bâtie sur une grille d'accords ''({{lang|en|changes}})'' immuable de douze mesures ''({{lang|en|twelve-bar blues}})''. C'est sur cet accompagnement qui se répète que s'ajoute la mélodie — chant et solo. Cette structure est typique du blues et se retrouve dans ses dérivés comme le rock 'n' roll.
Le rythme est toujours un rythme ternaire syncopé ''({{lang|en|shuffle, swing, groove}}, ''notes inégales'')'' : la mesure est à quatre temps, mais la noire est divisée en noire-croche en triolet, ou encore triolet de croche en appuyant la première et la troisième.
La mélodie se construit en général sur une gamme blues de six degrés (gamme pentatonique mineure avec une quarte augmentée), mais bien que la gamme soit mineure, l'harmonie est construite sur la gamme majeure homonyme : un blues en ''fa'' a une mélodie sur la gamme de ''fa'' mineur, mais une harmonie sur la gamme de ''fa'' majeur. La grille d'accord comporte les accords construits sur les degrés {{Times New Roman|I}}, {{Times New Roman|IV}} et {{Times New Roman|V}} de la gamme majeure homonyme. Les accords sont souvent des accords de septième (donc avec une tierce majeure et une septième mineure), il ne s'agit donc pas d'une harmonisation de gamme diatonique (puisque la septième est majeure sur l'accord de tonique).
Par exemple, pour un blues en ''do'' :
* accord parfait de do majeur, C ({{Times New Roman|I}}<sup>er</sup> degré) ;
* accord parfait de fa majeur, F ({{Times New Roman|IV}}<sup>e</sup> degré) ;
* accord parfait de sol majeur, G ({{Times New Roman|V}}<sup>e</sup> degré).
Il existe quelques morceaux harmonisés avec des accords mineurs, comme par exemple ''As the Years Go Passing By'' d'Albert King (Duje Records, 1959).
La progression blues est organisée en trois blocs de quatre mesures ayant les fonctions suivantes (voir ci-dessus ''[[#Harmonie fonctionnelle|Harmonie fonctionnelle]]'') :
* quatre mesures toniques ;
* quatre mesures sous-dominantes ;
* quatre mesures dominantes.
La forme la plus simple, que Jeff Gardner appelle « forme A », est la suivante :
{| class="wikitable" style="font-family:Times New Roman; text-align:center;"
|+ Progression blues, forme A
|-
! scope="row" | Tonique
| width="50px" | I
| width="50px" | I
| width="50px" | I
| width="50px" | I
|-
! scope="row" | Sous-domminante
| width="50px" | IV
| width="50px" | IV
| width="50px" | I
| width="50px" | I
|-
! scope="row" | Dominante
| width="50px" | V
| width="50px" | IV
| width="50px" | I
| width="50px" | V
|}
La progression {{Times New Roman|I-V}} des deux dernières mesures forment le ''{{lang|en|turnaround}}'', la demie cadence qui lance le cycle suivant. Nous présentons ci-dessous un exemple typique de ligne de basse ''({{lang|en|walking bass}})'' pour le ''{{lang|en|turnaround}}'' d'un blues en ''la'' :
[[Fichier:Turnaround classique blues en la.svg|Exemple typique de ligne de basse pour un ''turnaround'' de blues en ''la''.]]
[[Fichier:Blues mi harmonie elementaire.midi|thumb|Blues en ''mi'', harmonisé de manière élémentaire avec une ''{{lang|en|walking bass}}''.]]
Vous pouvez écouter ci-contre une harmonisation typique d'un blues en ''mi''. Les accords sont exécutés par une basse marchante ''({{lang|en|walking bass}})'', qui joue une arpège sur la triade avec l'ajout d'une sixte majeure et d'une septième mineure, et par une guitare qui joue un accord de puissance ''({{lang|en|power chord}})'', qui n'est composé que de la fondamentale et de la quinte juste, avec une sixte en appoggiature.
La forme B s'obtient en changeant la deuxième mesure : on joue un degré {{Times New Roman|IV}} au lieu d'un degré {{Times New Roman|I}}. La progression {{Times New Roman|I-IV}} sur les deux premières mesures est appelé ''{{lang|en|quick change}}''.
{| class="wikitable" style="font-family:Times New Roman; text-align:center;"
|+ Progression blues, forme B
|-
| width="50px" | I
| width="50px" | IV
| width="50px" | I
| width="50px" | I
|-
| width="50px" | IV
| width="50px" | IV
| width="50px" | I
| width="50px" | I
|-
| width="50px" | V
| width="50px" | IV
| width="50px" | I
| width="50px" | V
|}
Par exemple, ''Sweet Home Chicago'' (Robert Johnson, 1936) est un blues en ''fa'' ; sa grille d'accords, aux variations près, suit une forme B :
{| class="wikitable" style="font-family:Times New Roman; text-align:center;"
|+ Progression de ''Sweet Home Chicago''
|-
| width="50px" | F
| width="50px" | B♭
| width="50px" | F
| width="50px" | F
|-
| width="50px" | B♭
| width="50px" | B♭
| width="50px" | F
| width="50px" | F
|-
| width="50px" | C7
| width="50px" | B♭7
| width="50px" | F7
| width="50px" | C7
|}
: Écouter {{lien web
| url =https://www.youtube.com/watch?v=dkftesK2dck
| titre = Robert Johnson "Sweet Home Chicago"
| auteur = Michal Angel
| site = YouTube
| date = 2007-12-09 | consulté le = 2020-12-17
}}
Les formes C et D s'obtiennent à partir des formes A et B en changeant le dernier accord par un accord sur le degré {{Times New Roman|I}}, ce qui forme une cadence plagale.
{| class="wikitable" style="font-family:Times New Roman; text-align:center;"
|+ Progression blues, formes C et D
|-
| colspan="4" | …
|-
| colspan="4" | …
|-
| width="50px" | V
| width="50px" | IV
| width="50px" | I
| width="50px" | I
|}
L'harmonie peut être enrichie, notamment en jazz. Voici par exemple une grille du blues souvent utilisés en bebop.
{| class="wikitable" style="font-family:Times New Roman; text-align:center;"
|+ Exemple de progression de blues bebop sur une base de forme B
|-
| width="60px" | I<sup>7</sup>
| width="60px" | IV<sup>7</sup>
| width="60px" | I<sup>7</sup>
| width="60px" | V–<sup>7</sup> <nowiki>|</nowiki> I<sup>7</sup>
|-
| width="60px" | IV<sup>7</sup>
| width="60px" | IV<sup>7</sup>
| width="60px" | I<sup>7</sup>
| width="60px" | VI<sup>7 ♯9 ♭13</sup>
|-
| width="60px" | II–<sup>7</sup>
| width="60px" | V<sup>7</sup>
| width="60px" | V<sup>7</sup> <nowiki>|</nowiki> IV<sup>7</sup>
| width="60px" | II–<sup>7</sup> <nowiki>|</nowiki> V<sup>7</sup>
|}
On peut aussi trouver des blues sur huit mesures, sur seize mesures comme ''Watermelon Man'' de Herbie Hancock (album ''Takin' Off'', Blue Note, 1962) ou ''Let's Dance'' de Jim Lee (interprété par Chris Montez, Monogram, 1962)
* {{lien web
|url= https://www.dailymotion.com/video/x5iduwo
|titre=Herbie Hancock - Watermelon Man (1962)
|auteur=theUnforgettablesTv
|site=Dailymotion
|date=2003 |consulté le=2021-02-09
}}
* {{lien web
|url=https://www.youtube.com/watch?v=6JXshurYONc
|titre=Let's Dance
|auteur=Chris Montez
|site=YouTube
|date=2016-08-06 |consulté le=2021-02-09
}}
À l'inverse, certains blues peuvent avoir une structure plus simple que les douze mesure ; par exemple ''Hoochie Coochie Man'' de Willie Dixon (interprété par Muddy Waters sous le titre ''Mannish Boy'', Chicago Blues, 1954) est construit sur un seul accord répété tout le long de la chanson.
* {{lien web
|url=https://www.dailymotion.com/video/x5iduwo
|titre=Muddy Waters - Hoochie Coochie Man
|auteur=Muddy Waters
|site=Dailymotion
|date=2012 | consulté le=2021-02-09
}}
=== Cadence andalouse ===
La cadence andalouse est une progression de quatre accords, descendant par mouvement conjoint :
* en mode de ''mi'' (mode phrygien) : {{Times New Roman|IV}} - {{Times New Roman|III}} - {{Times New Roman|II}} - {{Times New Roman|I}} ;<br />par exemple en ''mi'' phrygien : Am - G - F - E ; en ''do'' phrygien : Fm - E♭ - D♭ - C ;<br />on notera que le degré {{Times New Roman|III}} est diésé dans l'accord final (ou bécarre s'il est bémol dans la tonalité) ;
* en mode mineur : {{Times New Roman|I}} - {{Times New Roman|VII}} - {{Times New Roman|VI}} - {{Times New Roman|V}} ;<br />par exemple en ''la'' mineur : Am - G - F - E ; en ''do'' mineur : Cm - B♭ - A♭ - m ;<br />comme précédemment, on notera que le degré {{Times New Roman|VII}} est diésé dans l'accord final.
=== Progressions selon le cercle des quintes ===
[[Fichier:Cercle quintes degres tonalite majeure.svg|vignette|Cercle des quinte justes (parcouru dans le sens des aiguilles d'une montre) des degrés d'une tonalité majeure.]]
La progression {{Times New Roman|V-I}} est la cadence parfaite, mais on peut aussi l'employer au milieu d'un morceau. Cette progression étant courte, sa répétition crée de la lassitude ; on peut la compléter par d'autres accords séparés d'une quinte juste, en suivant le « cercle des quintes » : {{Times New Roman|I-V-IX}}, la neuvième étant enharmonique de la seconde, on obtient {{Times New Roman|I-V-II}}.
On peut continuer de décrire le cercle des quintes : {{Times New Roman|I-V-II-VI}}, on obtient l'anatole dans le désordre ; on peut à l'inverse étendre les quintes vers la gauche, {{Times New Roman|IV-I-V-II-VI}}.
En musique populaire, on trouve fréquemment une progression fondée sur les accord {{Times New Roman|I}}, {{Times New Roman|IV}}, {{Times New Roman|V}} et {{Times New Roman|VI}}, popularisée dans les années 1950. La « progression années 1950 », « progression ''{{lang|en|fifties ('50)}}'' » ''({{lang|en|'50s progression}})'' est dans l'ordre {{Times New Roman|I-VI-IV-V}}. On trouve aussi cette progression en musique classique. Si la tonalité est majeure, la triade sur la sus-dominante est mineure, les autres sont majeures, on notera donc souvent {{Times New Roman|I-vi-IV-V}}. On peut avoir des permutations circulaires (le dernier accord venant au début, ou vice-versa) : {{Times New Roman|vi-IV-V-I}}, {{Times New Roman|IV-V-I-vi}} et {{Times New Roman|V-I-vi-IV}}.
{| class="wikitable"
|+ Accords selon la tonalité
! scope="col" | Tonalité
! scope="col" | Armure
! scope="col" style="font-family:Times New Roman" | I
! scope="col" style="font-family:Times New Roman" | IV
! scope="col" style="font-family:Times New Roman" | V
! scope="col" style="font-family:Times New Roman" | vi
|-
|''Do'' majeur || || C || F || G || Am
|-
|''Sol'' majeur || ''fa''♯ || G || C || D || Em
|-
|''Ré'' majeur || ''fa''♯, ''do''♯ || D || G || A || Bm
|-
|''La'' majeur || ''fa''♯, ''do''♯, ''sol''♯ || A || D || E || F♯m
|-
| ''Fa'' majeur || ''si''♭ || F || B♭ || C || Dm
|-
| ''Si''♭ majeur || ''si''♭, ''mi''♭ || B♭ || E♭ || F || Gm
|-
| ''Mi''♭ majeur || ''si''♭, ''mi''♭, ''la''♭ || E♭ || A♭ || B♭ || Cm
|}
Par exemple, en tonalité de ''do'' majeur, la progression {{Times New Roman|I-vi-IV-V}} sera C-Am-F-G.
Il existe d'autres progressions utilisant ces accords mais dans un autre ordre, typiquement {{Times New Roman|I–IV–vi–V}} ou une de ses permutations circulaires : {{Times New Roman|IV–vi–V-I}}, {{Times New Roman|vi–V-I-IV}} ou {{Times New Roman|V-I-IV-vi}}. Ou dans un autre ordre.
PV Nova l'illustre dans plusieurs de ses « expériences » dans la version {{Times New Roman|vi-V-IV-I}}, soit Am-G-F-C, ou encore {{Times New Roman|vi-IV-I-V}}, soit Am-F-C-G :
: {{lien web
| url = https://www.youtube.com/watch?v=w08LeZGbXq4
| titre = Expérience n<sup>o</sup> 6 — La Happy Pop
| auteur = PV Nova
| site = YouTube
| date = 2011-08-20 | consulté le = 2020-12-13
}}
et cela devient un gag récurrent avec son « chapeau des accords magiques qu'on nous ressort à toutes les sauces »
: {{lien web
| url = https://www.youtube.com/watch?v=VMY_vc4nZAU
| titre = Expérience n<sup>o</sup> 14 — La Soupe dou Brasil
| auteur = PV Nova
| site = YouTube
| date = 2012-10-03 | consulté le = 2020-12-17
}}
Cette récurrence est également parodiée par le groupe The Axis of Awesome avec ses « chansons à quatre accords » ''({{lang|en|four-chords song}})'', dans une sketch où ils mêlent 47 chansons en utilisant l'ordre {{Times New Roman|I-V-vi-IV}} :
: {{lien web
| url = https://www.youtube.com/watch?v=oOlDewpCfZQ
| titre = 4 Chords | Music Videos | The Axis Of Awesome
| auteur = The Axis of Awesome
| site = YouTube
| date = 2011-07-20 | consulté le = 2020-12-17
}}
{{boîte déroulante/début|titre=Chansons mêlées dans le sketch}}
# Journey : ''Don't Stop Believing'' ;
# James Blunt : ''You're Beautiful'' ;
# Black Eyed Peas : ''Where Is the Love'' ;
# Alphaville : ''Forever Young'' ;
# Jason Mraz : ''I'm Yours'' ;
# Train : ''Hey Soul Sister'' ;
# The Calling : ''Wherever You Will Go'' ;
# Elton John : ''Can You Feel The Love Tonight'' (''Le Roi lion'') ;
# Akon : ''Don't Matter'' ;
# John Denver : ''Take Me Home, Country Roads'' ;
# Lady Gaga : ''Paparazzi'' ;
# U2 : ''With Or Without You'' ;
# The Last Goodnight : ''Pictures of You'' ;
# Maroon Five : ''She Will Be Loved'' ;
# The Beatles : ''Let It Be'' ;
# Bob Marley : ''No Woman No Cry'' ;
# Marcy Playground : ''Sex and Candy'' ;
# Men At Work : ''Land Down Under'' ;
# thème de ''America's Funniest Home Videos'' (équivalent des émissions ''Vidéo Gag'' et ''Drôle de vidéo'') ;
# Jack Johnson : ''Taylor'' ;
# Spice Girls : ''Two Become One'' ;
# A Ha : ''Take On Me'' ;
# Green Day : ''When I Come Around'' ;
# Eagle Eye Cherry : ''Save Tonight'' ;
# Toto : ''Africa'' ;
# Beyonce : ''If I Were A Boy'' ;
# Kelly Clarkson : ''Behind These Hazel Eyes'' ;
# Jason DeRulo : ''In My Head'' ;
# The Smashing Pumpkins : ''Bullet With Butterfly Wings'' ;
# Joan Osborne : ''One Of Us'' ;
# Avril Lavigne : ''Complicated'' ;
# The Offspring : ''Self Esteem'' ;
# The Offspring : ''You're Gonna Go Far Kid'' ;
# Akon : ''Beautiful'' ;
# Timberland featuring OneRepublic : ''Apologize'' ;
# Eminem featuring Rihanna : ''Love the Way You Lie'' ;
# Bon Jovi : ''It's My Life'' ;
# Lady Gaga : ''Pokerface'' ;
# Aqua : ''Barbie Girl'' ;
# Red Hot Chili Peppers : ''Otherside'' ;
# The Gregory Brothers : ''Double Rainbow'' ;
# MGMT : ''Kids'' ;
# Andrea Bocelli : ''Time To Say Goodbye'' ;
# Robert Burns : ''Auld Lang Syne'' ;
# Five for fighting : ''Superman'' ;
# The Axis of Awesome : ''Birdplane'' ;
# Missy Higgins : ''Scar''.
{{boîte déroulante/fin}}
Vous pouvez par exemple jouer les accords C-G-Am-F ({{Times New Roman|I-V-vi-IV}}) et chanter dessus ''{{lang|en|Let It Be}}'' (Paul McCartney, The Beattles, 1970) ou ''Libérée, délivrée'' (Robert Lopez, ''La Reine des neiges'', 2013).
La progression {{Times New Roman|I-V-vi-IV}} est considérée comme « optimiste » tandis que sa variante {{Times New Roman|iv-IV-I-V}} est considérée comme « pessimiste ».
On peut voir la progression {{Times New Roman|I-vi-IV-V}} comme une variante de l'anatole {{Times New Roman|I-vi-ii-V}}, obtenue en remplaçant l'accord de sustonique {{Times New Roman|ii}} par l'accord de sous-dominante {{Times New Roman|IV}} (son relatif majeur, et degré ayant la même fonction).
==== Exemples de progression selon le cercle des quintes en musique classique ====
[[Fichier:BuxWV92 quemadmodum desiderat cervis Dietrich Buxtehude.midi|vignette|Dietrich Buxtehude, Psaume 42 ''Quemadmodum desiderat cervis'', quatre premières mesures.]]
Cette progression selon la cercle des quintes, sous la forme {{Times New Roman|I-vi-IV-V}}, apparaît déjà au {{pc|xvii}}<sup>e</sup> siècle dans le psaume 42 ''Quem ad modum desiderat cervis'' (BuxVW92) de Dietrich Buxtehude (1637-1707). Le morceau est en ''fa'' majeur, la progression d'accords est donc F-Dm-B♭-C.
: {{lien web
| url = https://www.youtube.com/watch?v=8FmV9l1RqSg
| titre = D. Buxtehude - Quemadmodum desiderat cervus, BuxWV 92
| auteur = Longobardo
| site = YouTube
| date = 2013-04-06 | consulté la = 2021-01-01
}}
[[File:BuxWV92 quemadmodum desiderat cervis Dietrich Buxtehude.svg|vignette|450x450px|center|Dietrich Buxtehude, psaume 42 ''Quemadmodum desiderat cervis'', quatre premières mesures.]]
{{clear}}
[[Fichier:JSBach BWV140 cantate 4 mesures.midi|vignette|J.-S. Bach, cantate BWV140, quatre premières mesures.]]
On la trouve également dans l'ouverture de la cantate ''{{lang|de|Wachet auf, ruft uns die Stimme}}'' de Jean-Sébastien Bach (BWV140, 1731). Le morceau est en ''mi''♭ majeur, la progression d'accords est donc E♭-Cm-A♭<sup>6</sup>-B♭.
[[Fichier:JSBach BWV140 cantate 4 mesures.svg|vignette|center|J.-S. Bach, cantate BWV140, quatre premières mesures.|alt=|517x517px]]
{{clear}}
[[Fichier:Mozart K310 Sonate8 mesures 45 a 49.midi|vignette|Mozart, mesures 45 à 49 du premier mouvement de la sonate pour piano n<sup>o</sup> 8 en ''la'' mineur (K310, 1778).]]
La même progression est utilisée par Mozart, par exemple dans le premier mouvement de la sonate pour piano n<sup>o</sup> 8 en ''la'' mineur (K310, 1778), la progression d'accords est C-Am-F-G qui correspond à la progression {{Times New Roman|III-i-VI-VII}} de ''la'' mineur, mais à la progression {{Times New Roman|I-vi-IV-V}} de la gamme relative, ''do'' majeur .
[[Fichier:Mozart K310 Sonate8 mesures 45 a 49.svg|vignette|center|500px|Mozart, mesures 45 à 49 du premier mouvement de la sonate pour piano n<sup>o</sup> 8 en ''la'' mineur (K310, 1778).]]
=== Substitution tritonique ===
Un des accords les plus utilisés est donc l'accord de septième de dominante, {{Times New Roman|V<sup>7</sup><sub>+</sub>}} qui contient les degrés {{Times New Roman|V}}, {{Times New Roman|VII}}, {{Times New Roman|II}} ({{Times New Roman|IX}}) et {{Times New Roman|IV}}({{Times New Roman|XI}}) ; par exemple, en tonalité de ''do'' majeur, l'accord de ''sol'' septième (G<sup>7</sup>) contient les notes ''sol''-''si''-''ré''-''fa''. Si l'on prend l'accord dont la fondamentale est trois tons (triton) au-dessus ou en dessous — l'octave contenant six tons, on arrive sur la même note —, {{Times New Roman|♭II<sup>7</sup>}}, ici ''ré''♭ septième (D♭<sup>7</sup>), celui-ci contient les notes ''ré''♭-''fa''-''la''♭-''do''♭, cette dernière note étant l'enharmonique de ''si''. Les deux accords G<sup>7</sup> et D♭<sup>7</sup> ont donc deux notes en commun : le ''fa'' et le ''si''/''do''♭.
Il est donc fréquent en jazz de substituer l'accord {{Times New Roman|V<sup>7</sup><sub>+</sub>}} par l'accord {{Times New Roman|♭II<sup>7</sup>}}. Par exemple, la progression {{Times New Roman|ii<sup>7</sup>}}-{{Times New Roman|V<sup>7</sup>}}-{{Times New Roman|I<sup>Δ</sup>}} devient {{Times New Roman|ii<sup>7</sup>}}-{{Times New Roman|♭II<sup>7</sup>}}-{{Times New Roman|I<sup>Δ</sup>}}. C'est un procédé courant de réharmonisation (le fait de remplacer un accord par un autre dans un morceau existant).
Les six substitutions possibles sont donc : C<sup>7</sup>↔F♯<sup>7</sup> - D♭<sup>7</sup>↔G<sup>7</sup> - D<sup>7</sup>↔A♭<sup>7</sup> - E♭<sup>7</sup>↔A<sup>7</sup> - E<sup>7</sup>↔B♭<sup>7</sup> - F<sup>7</sup>↔B<sup>7</sup>.
[[Fichier:Übermäsiger Terzquartakkord.jpg|vignette|Exemple de cadence parfaite en ''do'' majeur avec substitution tritonique (sixte française).]]
Dans l'accord D♭<sup>7</sup>, si l'on remplace le ''do''♭ par son ''si'' enharmonique, on obtient un accord de sixte augmentée : ''ré''♭-''fa''-''la''♭-''si''. Cet accord est utilisé en musique classique depuis la Renaissance ; on distingue en fait trois accords de sixte augmentée :
* sixte française ''ré''♭-''fa''-''sol''-''si'' ;
* sixte allemande : ''ré''♭-''fa''-''la''♭-''si'' ;
* sixte italienne : ''ré''♭-''fa''-''si''.
Par exemple, le ''Quintuor en ''ut'' majeur'' de Franz Schubert (1828) se termine par une cadence parfaite dont l'accord de dominante est remplacé par une sixte française ''ré''♭-''fa''-''si''-''sol''-''si'' (''ré''♭ aux violoncelles, ''fa'' à l'alto, ''si''-''sol'' aux seconds violons et ''si'' au premier violon).
[[Fichier:Schubert C major Quintet ending.wav|vignette|Sept dernières mesures du ''Quintuor en ''ut'' majeur'' de Franz Schubert.]]
[[Fichier:Schubert C major Quintet ending.png|vignette|center|upright=2.5|Sept dernières mesures du ''Quintuor en ''ut'' majeur'' de Franz Schubert.]]
=== Autres accords de substitution ===
Substituer un accord consiste à utiliser un accord provenant d'une tonalité étrangère à la tonalité en cours. À la différence d'une modulation, la substitution est très courte et ne donne pas l'impression de changer de tonalité ; on a juste un sentiment « étrange » passager. Un court passage dans une autre tonalité est également appelée « emprunt ».
Nous avons déjà vu plusieurs méthodes de substitution :
* utilisation d'une note étrangère : une note étrangère — note de passage, appoggiature, anticipation, retard… — crée momentanément un accord hors tonalité ; en musique classique, ceci n'est pas considéré comme un accord en propre, mais en jazz, on parle « d'accord de passage » et « d'accord suspendu » ;
* utilisation d'une dominante secondaire : l'accord de dominante secondaire est hors tonalité ; le but ici est de faire une cadence parfaite, mais sur un autre degré que la tonique de la tonalité en cours ;
* la substitution tritonique, vue ci-dessus, pour remplacer un accord de septième de dominante.
Une dernière méthode consiste à remplacer un accord par un accord d'une gamme de même tonique, mais d'un autre mode ; on « emprunte » ''({{lang|en|borrow}})'' l'accord d'un autre mode. Par exemple, substituer un accord de la tonalité de ''do'' majeur par un accord de la tonalité de ''do'' mineur ou de ''do'' mode de ''mi'' (phrygien).
Donc en ''do'' majeur, on peut remplacer un accord de ''ré'' mineur septième (D<sub>m</sub><sup>7</sup>) par un accord de ''ré'' demi-diminué (D<sup>⌀</sup>, D<sub>m</sub><sup>7♭5</sup>) qui est un accord appartenant à la donalité de ''la'' mineur harmonique.
=== Forme AABA ===
La forme AABA est composée de deux progressions de huit mesures, notées A et B ; cela représente trente-deux mesures au total, on parle donc souvent en anglais de la ''{{lang|en|32-bars form}}''. C'est une forme que l'on retrouve dans de nombreuses chanson de comédies musicales de Broadway comme ''Have You Met Miss Jones'' (''{{lang|en|I'd Rather Be Right}}'', 1937), ''{{lang|en|Over the Rainbow}}'' (''Le Magicien d'Oz'', Harold Harlen, 1939), ''{{lang|en|All the Things You Are}}'' (''{{lang|en|Very Warm for may}}'', 1939).
Par exemple, la version de ''{{lang|en|Over the Rainbow}}'' chantée par Judy Garland est en ''la''♭ majeur et la progression d'accords est globalement :
* A (couplet) : A♭-Fm | Cm-A♭ | D♭ | Cm-A♭ | D♭ | D♭-F | B♭-E♭ | A♭
* B (pont) : A♭ | B♭m | Cm | D♭ | A♭ | B♭-G | Cm-G | B♭m-E♭
soit en degrés :
* A : {{Times New Roman|<nowiki>I-vi | iii-I | IV | iii-IV | IV | IV-vi | II-V | I</nowiki>}}
* B : {{Times New Roman|<nowiki>I | ii | iii | IV | I | II-VII | iii-VII | ii-V</nowiki>}}
Par rapport aux paroles de la chanson, on a
* A : couplet 1 ''« {{lang|en|Somewhere […] lullaby}} »'' ;
* A : couplet 2 ''« {{lang|en|Somewhere […] really do come true}} »'' ;
* B : pont ''« {{lang|en|Someday […] you'll find me}} »'' ;
* A : couplet 3 ''« {{lang|en|Somewhere […] oh why can't I?}} »'' ;
: {{lien web
| url = https://www.youtube.com/watch?v=1HRa4X07jdE
| titre = Judy Garland - Over The Rainbow (Subtitles)
| site = YouTube
| auteur = Overtherainbow
| consulté le = 2020-12-17
}}
Une mise en œuvre de la forme AABA couramment utilisée en jazz est la forme anatole (à le pas confondre avec la succession d'accords du même nom), en anglais ''{{lang|en|rythm changes}}'' car elle s'inspire du morceau ''{{lang|en|I Got the Rythm}}'' de George Gerschwin (''Girl Crazy'', 1930) :
* A : {{Times New Roman|I–vi–ii–V}} (succession d'accords « anatole ») ;
* B : {{Times New Roman|III<sup>7</sup>–VI<sup>7</sup>–II<sup>7</sup>–V<sup>7</sup>}} (les fondamentales forment une succession de quartes, donc parcourent le « cercle des quintes » à l'envers).
Par exemple, ''I Got the Rythm'' étant en ''ré''♭ majeur, la forme est :
* A : D♭ - B♭m - E♭m - A♭
* B : F7 - B♭7 - E♭7 - A♭7
=== Exemples ===
==== Début du Largo de la symphonie du Nouveau Monde ====
[[File:Largo nouveau monde 5 1res mesures.svg|vignette|Partition avec les cinq premières mesures du Largo de la symphonie du Nouveau Monde.]]
[[File:Largo nouveau monde 5 1res mesures.midi|vignette|Fichier son avec les cinq premières mesures du Largo de la symphonie du Nouveau Monde.]]
Nous avons reproduit ci-contre les cinq premières mesure du deuxième mouvement Largo de la symphonie « Du Nouveau Monde » (symphonie n<sup>o</sup> 9 d'Antonín Dvořák, 1893). Cliquez sur l'image pour l'agrandir.
Vous pouvez écouter cette partie jouée par un orchestre symphonique :
* {{lien web
|url =https://www.youtube.com/watch?v=y2Nw9r-F_yQ?t=565
|titre = Dvorak Symphony No.9 "From the New World" Karajan 1966
|site=YouTube (Seokjin Yoon)
|consulté le=2020-12-11
}} (à 9 min 25), par le Berliner Philharmoniker, dirigé par Herbert von Karajan (1966) ;
* {{lien web
|url = https://www.youtube.com/watch?v=ASlch7R1Zvo
|titre=Dvořák: Symphony №9, "From The New World" - II - Largo
|site=YouTube (diesillamusicae)
|consulté le=2020-12-11
}} : Wiener Philharmoniker, dirigé par Herbert von Karajan (1985).
{{clear}}
Cette partie fait intervenir onze instruments monodiques (ne jouant qu'une note à la fois) : des vents (trois bois, sept cuivres) et une percussion. Certains de ces instruments sont transpositeurs (les notes sur la partition ne sont pas les notes entendues). Jouées ensemble, ces onze lignes mélodiques forment des accords.
Pour étudier cette partition, nous réécrivons les parties des instruments transpositeurs en ''do'' et les parties en clef d’''ut'' en clef de ''fa''. Nous regroupons les parties en clef de ''fa'' d'un côté et les parties en clef de ''sol'' d'un autre.
{{boîte déroulante|Résultat|contenu=[[File:Largo nouveau monde 5 1res mesures transpositeurs en do.svg|class=transparent|center|Début du Largo de la symphonie Du Nouveau Monde, en do.]]}}
Nous pouvons alors tout regrouper sous la forme d'un système de deux portées clef de ''fa'' et clef de ''sol'', comme une partition de piano.
{{boîte déroulante|Résultat|contenu=
[[Fichier:Largo nouveau monde 5 1res mesures accords.svg|class=transparent|center|Le début du Largo de la symphonie Du Nouveau Monde sous forme d'accords.]]
}}
[[Fichier:Largo nouveau monde 5 1res mesures accords.midi|vignette|Début du Largo de la symphonie Du Nouveau Monde joué sous forme d'accords.]]
{{clear}}
Ensuite, nous ne gardons que la basse et les notes médium. Nous changeons éventuellement certaines notes d'octave afin de n'avoir que des superpositions de tierce ou de quinte (état fondamental des accords, en faisant ressortir les notes manquantes).
{{boîte déroulante|Résultat|contenu=
[[Fichier:Largo nouveau monde 5 1res mesures accords simplifies.svg|class=transparent|center|Le début du Largo de la symphonie Du Nouveau Monde sous forme d'accords simplifiés.]]
}}
[[Fichier:Largo nouveau monde 5 1res mesures accords simplifies.midi|vignette|Début du Largo de la symphonie Du Nouveau Monde joué sous forme d'accords simplifiés.]]
Vous pouvez écouter cette partie jouée par un quintuor de cuivres (trompette, bugle, cor, trombone, tuba), donc avec des accords de cinq notes :
: {{lien web
|url=https://www.youtube.com/watch?v=pWfe60nbvjA
|titre = Largo from The New World Symphony by Dvorak
|site=YouTube (The Chamberlain Brass)
|consulté le=2020-12-11
}} : The American Academy of Arts & Letters in New York City (2017).
Nous allons maintenant chiffrer les accords.
Pour établir la basse chiffrée, il nous faut déterminer le parcours harmonique. Pour le premier accord, les tonalités les plus simples avec un ''sol'' dièse sont ''la'' majeur et ''fa'' dièse mineur ; comme le ''mi'' est bécarre, nous retenons ''la'' majeur, il s'agit donc d'un accord de quinte sur la dominante (les accords de dominante étant très utilisés, cela nous conforte dans notre choix). Puis nous avons un ''si'' bémol, nous pouvons être en ''fa'' majeur ou en ''ré'' mineur ; nous retenons ''fa'' majeur, c'est donc le renversement d'un accord sur le degré {{Times New Roman|II}}.
Dans la deuxième mesure, nous revenons en ''la'' majeur, puis, avec un ''la'' et un ''ré'' bémols, nous sommes en ''la'' bémol majeur ; nous avons donc un accord de neuvième incomplet sur la sensible, ou un accord de onzième incomplet sur la dominante.
Dans la troisième mesure, nous passons en ''ré'' majeur, avec un accord de dominante. Puis, nous arrivons dans la tonalité principale, avec le renversement d'un accord de dominante sans tierce suivi d'un accord de tonique. Nous avons donc une cadence parfaite, conclusion logique d'une phrase.
La progression des accords est donc :
{| class="wikitable"
! scope="row" | Tonalité
| ''la'' M - ''fa'' M || ''la'' M - ''la''♭ M || ''ré'' M - ''ré''♭ M || ''ré''♭ M
|-
! scope="row" | Accords
| {{Times New Roman|V}}<sup>5</sup> - {{Times New Roman|II}}<sup>6</sup><sub>4</sub> || {{Times New Roman|V}}<sup>5</sup> - {{Times New Roman|“V”}}<sup>9</sup><sub><s>5</s></sub> || {{Times New Roman|V}}<sup>5</sup> - {{Times New Roman|V}}<sup>+4</sup> || {{Times New Roman|I}}<sup>5</sup>
|}
Dans le chiffrage jazz, nous avons donc :
* une triade de ''mi'' majeur, E ;
* une triade de ''sol'' majeur avec un ''ré'' en basse : G/D ;
* à nouveau un E ;
* un accord de ''sol'' neuvième diminué incomplet, avec un ''ré'' bémol en basse : G dim<sup>9</sup>/D♭ ;
* un accord de ''la'' majeur, A ;
* un accord de ''la'' bémol septième avec une ''sol'' bémol à la basse : A♭<sup>7</sup>/G♭ ;
* la partie se conclue par un accord parfait de ''ré''♭ majeur, D♭.
Soit une progression E - G/D | E - G dim<sup>9</sup>/D♭ | A - A♭<sup>7</sup>/G♭ | D♭.
[[Fichier:Largo nouveau monde 5 1res mesures accords chiffres.svg|class=transparent|center|Début du Largo de la symphonie Du Nouveau Monde en accords simplifiés.]]
{{clear}}
==== Thème de Smoke on the Water ====
Le morceau ''Smoke on the Water'' du groupe Deep Purple (album ''Machine Head'', 1972) possède un célèbre thème, un riff ''({{lang|en|rythmic figure}})'', joué à la guitare sous forme d'accords de puissance ''({{lang|en|power chords}})'', c'est-à-dire des accords sans tierce. Le morceau est en tonalité de ''sol'' mineur naturel (donc avec un ''fa''♮) avec ajout de la note bleue (''{{lang|en|blue note}}'', quinte diminuée, ''ré''♭), et les accords composant le thème sont G<sup>5</sup>, B♭<sup>5</sup>, C<sup>5</sup> et D♭<sup>5</sup>, ce dernier accord étant l'accord sur la note bleue et pouvant être considéré comme une appoggiature (indiqué entre parenthèse ci-après). On a donc ''a priori'', sur les deux premières mesures, une progression {{Times New Roman|I-III-IV}} puis {{Times New Roman|I-III-(♭V)-IV}}. Durant la majeure partie du thème, la guitare basse tient la note ''sol'' en pédale.
{{note|En jazz, la qualité « <sup>5</sup> » indique que l'on n'a que la quinte (et donc pas la tierce), contrairement à la notation de basse chiffrée.}}
: {{lien web
| url = https://www.dailymotion.com/video/x5ili04
| titre = Deep Purple — Smoke on the Water (Live at Montreux 2006)
| auteur = Deep Purple
| site = Dailymotion
| date = 2016 | consulté le = 2020-12-31
}}
Cependant, cette progression forme une mélodie, on peut donc plus la voir comme un contrepoint, la superposition de deux voies ayant un mouvement conjoint, joué par un seul instrument, la guitare, la voie 2 étant jouée une quarte juste en dessous de la voie 1 (la quarte juste descendante étant le renversement de la quinte juste ascendante) :
* voie 1 (aigu) : | ''sol'' - ''si''♭ - ''do'' | ''sol'' - ''si''♭ - (''ré''♭) - ''do'' | ;
* voie 2 (grave) : | ''ré'' - ''fa'' - ''sol'' | ''ré'' - ''fa'' - (''la''♭) - ''sol'' |.
En se basant sur la basse (''sol'' en pédale), nous pouvons considérer que ces deux mesures sont accompagnées d'un accord de Gm<sup>7</sup> (''sol''-''si''♭-''ré''-''fa''), chaque accord de la mélodie comprenant à chaque fois au moins une note de cet accord à l'exception de l'appogiature.
{| class="wikitable"
|+ Mise en évidence des notes de l'accord Gm<sup>7</sup>
|-
! scope="row" | Accords
| G<sup>5</sup> || B♭<sup>5</sup> || C<sup>5</sup>
|-
! scope="row" | Voie 1
| '''''sol''''' || '''''si''♭''' || ''do''
|-
! scope="row" | Voie 2
| '''''ré''''' || '''''fa''''' || '''''sol'''''
|-
! scope="row" | Basse
| '''''sol''''' || '''''sol''''' || '''''sol'''''
|}
Sur les deux mesures suivantes, la basse varie et suit les accords de la guitare avec un retard sur le dernier accord :
{| class="wikitable"
|+ Voies sur les mesure 3-4 du thème
|-
! scope="row" | Accords
| G<sup>5</sup> || B♭<sup>5</sup> || C<sup>5</sup> || B♭<sup>5</sup> || G<sup>5</sup>
|-
! scope="row" | Voie 1
| ''sol'' || ''si''♭ || ''do'' || ''si''♭ || ''sol''
|-
! scope="row" | Voie 2
| ''ré'' || ''fa'' || ''sol'' || ''fa'' || ''ré''
|-
! scope="row" | Basse
| ''sol'' || ''sol'' || ''do'' || ''si''♭ || ''si''♭-''sol''
|}
Le couplet de cette chanson est aussi organisé sur une progression de quatre mesures, la guitare faisant des arpèges sur les accords G<sup>5</sup> (''sol''-''ré''-''sol'') et F<sup>5</sup> (''fa''-''do''-''fa'') :
: | G<sup>5</sup>-G<sup>5</sup> | G<sup>5</sup>-G<sup>5</sup> | G<sup>5</sup>-F<sup>5</sup> | G<sup>5</sup>-G<sup>5</sup> |
soit une progression {{Times New Roman|<nowiki>| I-I | I-I | I-VII | I-I |</nowiki>}}. Nous pouvons aussi harmoniser le riff du thème sur cette progression, avec un accord F (''fa''-''la''-''do'') ; nous pouvons aussi nous rappeler que l'accord sur le degré {{Times New Roman|VII}} est plus volontiers considéré comme un accord de septième de dominante {{Times New Roman|V<sup>7</sup>}}, soit ici un accord Dm<sup>7</sup> (''ré''-''fa''-''la''-''do''). On peut donc considérer la progression harmonique sur le thème :
: | Gm-Gm | Gm-Gm | Gm-F ou Dm<sup>7</sup> | Gm-Gm |.
Cette analyse permet de proposer une harmonisation enrichie du morceau, tout en se rappelant qu'une des forces du morceau initial est justement la simplicité de sa structure, qui fait ressortir la virtuosité des musiciens. Nous pouvons ainsi comparer la version album à la version concert avec orchestre ou à la version latino de Pat Boone. À l'inverse, le groupe Psychostrip, dans une version grunge, a remplacé les accords par une ligne mélodique :
* le thème ne contient plus qu'une seule voie (la guitare ne joue pas des accords de puissance) ;
* dans les mesures 9 et 10, la deuxième guitare joue en contrepoint de type mouvement inverse, qui est en fait la voie 2 jouée en miroir ;
* l'arpège sur le couplet est remplacé par une ligne mélodique en ostinato sur une gamme blues.
{| class="wikitable"
|+ Contrepoint sur les mesures 9 et 10
|-
! scope="row" | Guitare 1
| ''sol'' ↗ ''si''♭ ↗ ''do''
|-
! scope="row" | Guitare 2
| ''sol'' ↘ ''fa'' ↘ ''ré''
|}
* {{lien web
| url = https://www.dailymotion.com/video/x5ik234
| titre = Deep Purple — Smoke on the Water (In Concert with the London Symphony Orchestra, 1999)
| auteur = Deep Purple
| site = Dailymotion
| date = 2016 | consulté le = 2020-12-31
}}
* {{lien web
| url = https://www.youtube.com/watch?v=MtUuNzVROIg
| titre = Pat Boone — Smoke on the Water (In a Metal Mood, No More Mr. Nice Guy, 1997)
| auteur = Orrore a 33 Giri
| site = YouTube
| date = 2019-06-24 | consulté le = 2020-12-31
}}
* {{lien web
| url = https://www.youtube.com/watch?v=n7zLlZ8B0Bk
| titre = Smoke on the Water (Heroes, 1993)
| auteur = Psychostrip
| site = YouTube
| date = 2018-06-20 | consulté le = 2020-12-31
}}
== Accords et improvisation ==
Nous avons vu précédemment (chapitre ''[[../Gammes et intervalles#Modes et improvisation|Gammes et intervalles > Modes et improvisation]]'') que le choix d'un mode adapté permet d'improviser sur un accord. L'harmonisation des gammes permet, en inversant le processus, d'étendre notre palette : il suffit de repérer l'accord sur une harmonisaiton de gamme, et d'utiliser cette gamme-là, dans le mode correspondant du degré de l'accord (voir ci-dessus ''[[#Harmonisation par des accords de septième|Harmonisation par des accords de septième]]'').
Par exemple, nous avons vu que l'accord sur le septième degré d'une gamme majeure était un accord demi-diminué ; nous savons donc que sur un accord demi-diminué, nous pouvons improviser sur le mode correspondant au septième degré, soit le mode de ''si'' (locrien).
Un accord de septième de dominante étant commun aux deux tonalités homonymes (par exemple ''fa'' majeur et ''fa'' mineur pour un ''do''<sup>7</sup><sub>+</sub> / C<sup>7</sup>), nous pouvons utiliser le mode de ''sol'' de la gamme majeure (mixolydien) ou de la gamme mineure mineure (mode phrygien dominant, ou phrygien espagnol) pour improviser. Mais l'accord de septième de dominante est aussi l'accord au début d'une grille blues ; on peut donc improviser avec une gamme blues, même si la tierce est majeure dans l'accord et mineure dans la gamme.
[[Fichier:Mode improvisation accords do complet.svg]]
== Autres accords courants ==
[[fichier:Cluster cdefg.png|vignette|Agrégat ''do - ré - mi - fa - sol''.]]
Nous avons vu précédemment l'harmonisation des tonalités majeures et mineures harmoniques par des triades et des accords de septième ; certains accords étant rarement utilisés (l'accord sur le degré {{Times New Roman|III}} et, pour les tonalités mineures harmoniques, l'accord sur la tonique), certains accords étant utilisés comme des accords sur un autre degré (les accords sur la sensible étant considérés comme des accords de dominante sans fondamentale).
Dans l'absolu, on peut utiliser n'importe quelle combinaison de notes, jusqu'aux agrégats, ou ''{{lang|en|clusters}}'' (mot anglais signifiant « amas », « grappe ») : un ensemble de notes contigües, séparées par des intervalles de seconde. Dans la pratique, on reste souvent sur des accords composés de superpositions de tierces, sauf dans le cas de transitions (voir la section ''[[#Notes étrangères|Notes étrangère]]'').
=== En musique classique ===
On utilise parfois des accords dont les notes ne sont pas dans la tonalité (hors modulation). Il peut s'agir d'accords de passage, de notes étrangères, par exemple utilisant un chromatisme (mouvement conjoint par demi-tons).
Outre les accords de passage, les autres accords que l'on rencontre couramment en musique classique sont les accords de neuvième, et les accords de onzième et treizième sur tonique. Ces accords sont simplement obtenus en continuant à empiler les tierces. Il n'y a pas d'accord d'ordre supérieur car la quinzième est deux octaves au-dessus de la fondamentale.
Comme pour les accords de septième, on distingue les accords de neuvième de dominante et les accords de neuvième d'espèce. Dans le cas de la neuvième de dominante, il y a une différence entre les tonalités majeures et mineures : l'intervalle de neuvième est respectivement majeur et mineur. Les chiffrages des renversements peuvent donc différer. Comme pour les accords de septième de dominante, on considère que les accords de septième sur le degré {{Times New Roman|VI}} sont en fait des accords de neuvième de dominante sans fondamentale.
Les accords de neuvième d'espèce sont en général préparés et résolus. Préparés : la neuvième étant une note dissonante (c'est à une octave près la seconde de la fondamentale), l'accord qui précède doit contenir cette note, mais dans un accord consonant ; la neuvième est donc commune avec l'accord précédent. Résolus : la dissonance est résolue en abaissant la neuvième par un mouvement conjoint. Par exemple, en tonalité de ''do'' majeur, si l'on veut utiliser un accord de neuvième d'espèce sur la tonique ''(do - mi - sol - si - ré)'', on peut utiliser avant un accord de dominante ''(sol - si - ré)'' en préparation puis un accord parfait sur le degré {{Times New Roman|IV}} ''(fa - la - do)'' en résolution ; nous avons donc sur la voie la plus aigüe la succession ''ré'' (consonant) - ''ré'' (dissonant) - ''do'' (consonant).
On rencontre également parfois des accords de onzième et de treizième. On omet en général la tierce, car elle est dissonante avec la onzième. L'accord le plus fréquemment rencontré est l'accord sur la tonique : on considère alors que c'est un accord sur la dominante que l'on a enrichi « par le bas », en ajoutant une quinte inférieure. par exemple, dans la tonalité de ''do'' majeur, l'accord ''do - sol - si - ré - fa'' est considéré comme un accord de septième de dominante sur tonique, le degré étant noté « {{Times New Roman|V}}/{{Times New Roman|I}} ». De même pour l'accord ''do - sol - si - ré - fa - la'' qui est considéré comme un accord de neuvième de dominante sur tonique.
=== En jazz ===
En jazz, on utilise fréquemment l'accord de sixte à la place de l'accord de septième majeure sur la tonique. Par exemple, en ''do'' majeur, on utilise l'accord C<sup>6</sup> ''(do - mi - sol - la)'' à la place de C<sup>Δ</sup> ''(do - mi - sol - si)''. On peut noter que C<sup>6</sup> est un renversement de Am<sup>7</sup> et pourrait donc se noter Am<sup>7</sup>/C ; cependant, le fait de le noter C<sup>6</sup> indique que l'on a bien un accord sur la tonique qui s'inscrit dans la tonalité de ''do'' majeur (et non, par exemple, de ''la'' mineur naturelle) — par rapport à l'harmonie fonctionnelle, on remarquera que Am<sup>7</sup> a une fonction tonique, l'utilisation d'un renversement de Am<sup>7</sup> à la place d'un accord de C<sup>Δ</sup> est donc logique.
Les accords de neuvième, onzième et treizième sont utilisés comme accords de septième enrichis. Le chiffrage suit les règles habituelles : on ajoute un « 9 », un « 11 » ou un « 13 » au chiffrage de l'accord de septième.
On utilise également des accords dits « suspendus » : ce sont des accords de transition qui sont obtenus en prenant une triade majeure ou mineure et en remplaçant la tierce par la quarte juste (cas le plus fréquent) ou la seconde majeure. Plus particulièrement, lorsque l'on parle simplement « d'accord suspendu » sans plus de précision, cela désigne l'accord de neuvième avec une quarte suspendue, noté « 9sus4 » ou simplement « sus ».
== L'harmonie tonale ==
L'harmonie tonale est un ensemble de règle assez strictes qui s'appliquent dans la musique savante européenne, de la période baroque à la période classique classique ({{pc|xiv}}<sup>e</sup>-{{pc|xviii}}<sup>e</sup> siècle). Certaines règles sont encore largement appliquées dans divers styles musicaux actuels, y compris populaire (rock, rap…), d'autres sont au contraire ignorées (par exemple, un enchaînement de plusieurs accords de même qualité forme un mouvement parallèle, ce qui est proscrit en harmonie tonale). De nos jours, on peut voir ces règles comme des règles « de bon goût », et leur application stricte comme une manière de composer « à la manière de ».
Précédemment, nous avons vu la progression des accords. Ci-après, nous abordons aussi la manière dont les notes de l'accord sont réparties entre plusieurs voix, et comment on construit chaque voix.
=== Concepts fondamentaux ===
; Consonance
: Les intervalles sont considérés comme « plus ou moins consonants » :
:* consonance parfaite : unisson, quinte et octave ;
:* consonance mixte (parfaite dans certains contextes, imparfaite dans d'autres) : quarte ;
:* consonance imparfaite : tierce et sixte ;
:* dissonance : seconde et septième.
; Degrés
: Certains degrés sont considérés comme « forts », « meilleurs », ce sont les « notes tonales » : {{Times New Roman|I}} (tonique), {{Times New Roman|IV}} (sous-dominante) et {{Times New Roman|V}} (dominante).
[[Fichier:Mouvements harmoniques.svg|vignette|upright=0.75|Mouvements harmoniques.]]
; Mouvements
: Le mouvement décrit la manière dont les voix évoluent les unes par rapport aux autres :
:# Mouvement parallèle : les voix sont séparées par un intervalle constant.
:# Mouvement oblique : une voix reste constante, c'est le bourdon ; l'autre monte ou descend.
:# Mouvement contraire : une voix descend, l'autre monte.
:# Échange de voix : les voix échangent de note ; les mélodies se croisent mais on a toujours le même intervalle harmonique.
{{clear}}
=== Premières règles ===
; Règle du plus court chemin
: Quand on passe d'un accord à l'autre, la répartition des notes se fait de sorte que chaque voix fait le plus petit mouvement possible. Notamment : si les deux accords ont des notes en commun, alors les voix concernées gardent la même note.
: Les deux voix les plus importantes sont la voix aigüe — soprano — et la voix la plus grave — basse. Ces deux voix sont relativement libres : la voix de soprano a la mélodie, la voix de basse fonde l'harmonie. La règle du plus court chemin s'applique surtout aux voix intermédiaires ; si l'on a des mouvements conjoints, ou du moins de petits intervalles — c'est le sens de la règle du plus court chemin —, alors les voix sont plus faciles à interpréter. Cette règle évite également que les voix n'empiètent l'une sur l'autre (voir la règle « éviter le croisement des voix »).
; Éviter les consonances parfaites consécutives
:* Lorsque deux voix sont à l'unisson ou à l'octave, elles ne doivent pas garder le même intervalle, l'effet serait trop plat.
:* Lorsque deux voix sont à la quarte ou à la quinte, elles ne doivent pas garder le même intervalle, car l'effet est trop dur.
: Pour éviter cela, lorsque l'on part d'un intervalle juste, on a intérêt à pratiquer un mouvement contraire aux voix qui ne gardent pas la même note, ou au moins un mouvement direct : les voix vont dans le même sens, mais l'intervalle change.
: Notez que même avec le mouvement contraire, on peut avoir des consonances parfaites consécutives, par exemple si une voix fait ''do'' aigu ↗ ''sol'' aigu et l'autre ''sol'' médium ↘ ''do'' grave.
: L'interdiction des consonances parfaites consécutives n'a pas été toujours appliquée, le mouvement parallèle strict a d'ailleurs été le premier procédé utilisé dans la musique religieuse au {{pc|x}}<sup>e</sup> siècle. On peut par exemple utiliser des quintes parallèles pour donner un style médiéval au morceau. On peut également utiliser des octaves parallèles sur plusieurs notes afin de créer un effet de renforcement de la mélodie.
: Par ailleurs, les consonances parfaites consécutives sont acceptées lorsqu'il s'agit d'une cadence (transition entre deux parties ou bien conclusion du morceau).
; Éviter le croisement des voix
: Les voix sont organisées de la plus grave à la plus aigüe. Deux voix n'étant pas à l'unisson, celle qui est plus aigüe ne doit pas devenir la plus grave et ''vice versa''.
; Soigner la partie soprano
: Comme c'est celle qu'on entend le mieux, c'est en général celle qui porte la mélodie principale. On lui applique des règles spécifiques :
:# Si elle chante la sensible dans un accord de dominante ({{Times New Roman|V}}), alors elle doit monter à la tonique, c'est-à-dire que la note suivante sera la tonique située un demi-ton au dessus.
:# Si l'on arrive à une quinte ou une octave entre les parties basse et soprano par un mouvement direct, alors sur la partie soprano, le mouvement doit être conjoint. On doit donc arriver à cette situation par des notes voisines au soprano.
; Préférer certains accords
: Les deux degrés les plus importants sont la tonique ({{Times New Roman|I}}) et la dominante ({{Times New Roman|V}}), les accords correspondants ont donc une importance particulière.
: À l'inverse, l'accord de sensible ({{Times New Roman|VII}}) n'est pas considéré comme ayant une fonction harmonique forte. On le considère comme un accord de dominante affaibli. En tonalité mineure, on évite également l'accord de médiante ({{Times New Roman|III}}).
: Donc on utilise en priorité les accords de :
:# {{Times New Roman|I}} et {{Times New Roman|V}}.
:# Puis {{Times New Roman|II}}, {{Times New Roman|IV}}, {{Times New Roman|VI}} ; et {{Times New Roman|III}} en mode majeur.
:# On évite {{Times New Roman|VII}} ; et {{Times New Roman|III}} en mode mineur.
; Préférer certains enchaînements
: Les enchaînements d'accord peuvent être classés par ordre de préférence. Par ordre de préférence décroissante (du « meilleur » au « moins bon ») :
:# Meilleurs enchaînements : quarte ascendante ou descendante. Notons que la quarte est le renversement de la quinte, on a donc des enchaînements stables et naturels, mais avec un intervalle plus court qu'un enchaînement de quintes.
:# Bons enchaînements : tierce ascendante ou descendante. Les accords consécutifs ont deux notes en commun.
:# Enchaînements médiocres : seconde ascendante ou descendante. Les accords sont voisins, mais ils n'ont aucune note en commun. On les utilise de préférence en mouvement ascendant, et on utilise surtout les enchaînements {{Times New Roman|IV}}-{{Times New Roman|V}}, {{Times New Roman|V}}-{{Times New Roman|VI}} et éventuellement {{Times New Roman|I}}-{{Times New Roman|II}}.
:# Les autres enchaînements sont à éviter.
: On peut atténuer l'effet d'un enchaînement médiocre en plaçant le second accord sur un temps faible ou bien en passant par un accord intermédiaire.
[[Fichier:Progression Vplus4 I6.svg|thumb|Résolution d'un accord de triton (quarte sensible) vers l'accord de sixte de la tonique.]]
; La septième descend par mouvement conjoint
: Dans un accord de septième de dominante, la septième — qui est donc le degré {{Times New Roman|IV}} — descend par mouvement conjoint — elle est donc suivie du degré {{Times New Roman|III}}.
: Corolaire : un accord {{Times New Roman|V}}<sup>+4</sup> se résout par un accord {{Times New Roman|I}}<sup>6</sup> : on a bien un enchaînement {{Times New Roman|V}} → {{Times New Roman|I}}, et la 7{{e}} (degré {{Times New Roman|IV}}), qui est la basse de l'accord {{Times New Roman|V}}<sup>+4</sup>, descend d'un degré pour donner la basse de l'accord {{Times New Roman|I}}<sup>6</sup> (degré {{Times New Roman|III}}).
{{clear}}
[[Fichier:Progression I64 V7plus I5.svg|thumb|Accord de sixte et de quarte cadentiel.]]
; Un accord de sixte et quarte est un accord de passage
: Le second renversement d'un accord parfait est soit une appoggiature, soit un accord de passage, soit un accord de broderie.
: S'il s'agit de l'accord de tonique {{Times New Roman|I}}<sup>6</sup><sub>4</sub>, c'est « accord de sixte et quarte de cadence », l'appoggiature de l'accord de dominante de la cadence parfaite.
{{clear}}
Mais il faut appliquer ces règles avec discernement. Par exemple, la voix la plus aigüe est celle qui s'entend le mieux, c'est donc elle qui porte la mélodie principale. Il est important qu'elle reste la plus aigüe. La voix la plus grave porte l'harmonie, elle pose les accords, il est donc également important qu'elle reste la plus grave. Ceci a deux conséquences :
# Ces deux voix extrêmes peuvent avoir des intervalles mélodiques importants et donc déroger à la règle du plus court chemin : la voix aigüe parce que la mélodie prime, la voix de basse parce que la progression d'accords prime.
# Les croisements des voix intermédiaires sont moins critiques.
Par ailleurs, si l'on applique strictement toutes les règles « meilleurs accords, meilleurs enchaînements », on produit un effet conventionnel, stéréotypé. Il est donc important d'utiliser les solutions « moins bonnes », « médiocres » pour apporter de la variété.
Ajoutons que les renversements d'accords permettent d'avoir plus de souplesse : on reste sur le même accord, mais on enrichit la mélodie sur chaque voix.
Le ''Bolero'' de Maurice Ravel (1928) brise un certain nombre de ces règles. Par exemple, de la mesure 39 à la mesure 59, la harpe joue des secondes. De la mesure 149 à la mesure 165, les piccolo jouent à la sixte, dans des mouvement strictement parallèle, ce qui donne d'ailleurs une sonorité étrange. À partir de la mesure 239, de nombreux instruments jouent en mouvement parallèles (piccolos, flûtes, hautbois, cor, clarinettes et violons).
=== Application ===
[[Fichier:Harmonisation possible de frere jacques exercice.svg|vignette|Exercice : harmoniser ''Frère Jacques''.]]
Harmoniser ''Frère Jacques''.
Nous considérons un morceau à quatre voix : basse, ténor, alto et soprano. La soprano chante la mélodie de ''Frère Jacques''. L'exercice consiste à proposer l'écriture des trois autres voix en respectant les règles énoncées ci-dessus. Pour simplifier, nous ajoutons les contraintes suivantes :
* toutes les voix chantent des blanches ;
* nous nous limitons aux accords de quinte (accords de trois sons composés d'une tierce et d'une quinte) sans avoir recours à leurs renversements (accords de sixte, accords de sixte et de quarte).
Les notes à gauche de la portée indiquent la tessiture (ou ambitus), l'amplitude que peut chanter la voix.
{{clear}}
{{boîte déroulante/début|titre=Solution possible}}
[[Fichier:Harmonisation possible de frere jacques solution.svg|vignette|Harmonisation possible de ''Frère Jacques'' (solution de l'exercice).]]
Il n'y a pas qu'une solution possible.
Le premier accord doit contenir un ''do''. Nous sommes manifestement en tonalité de ''do'' majeur, nous proposons de commencer par l'accord parfait de ''do'' majeur, I<sup>5</sup>.
Le deuxième accord doit comporter un ''ré''. Si nous utilisons l'accord de quinte de ''ré'', nous allons créer une quinte parallèle. Nous pourrions utiliser un renversement, mais nous nous imposons de chercher un autre accord. Il peut s'agir de l'accord ''si''<sup>5</sup> ''(si-ré-fa)'' ou de l'accord de ''sol''<sup>5</sup> ''(sol-si-ré)''. La dernière solution permet d'utiliser l'accord de dominante qui est un accord important de la tonalité. La règle du plus court chemin imposerait le ''sol'' grave pour la partie de basse, mais cela est proche de la limite du chanteur, nous préférons passer au ''sol'' aigu, plus facile à chanter. Nous vérifions qu'il n'y a pas de quinte parallèle : l'intervalle ascendant ''do-sol'' (basse-alto) devient ''sol-si'' (3<sup>ce</sup>), l'intervalle descendant ''do-sol'' (soprano-alto) devient ''ré-si'' (3<sup>ce</sup>).
De la même manière, pour le troisième accord, nous ne pouvons pas passer à un accord de ''la''<sup>5</sup> pour éviter une quinte parallèle. Nous avons le choix entre ''do''<sup>5</sup> ''(do-mi-sol)'' et ''mi''<sup>5</sup> ''(mi-sol-si)''. Nous préférons revenir à l'accord de fondamental, solution très stable (l'enchaînement {{Times New Roman|V}}-{{Times New Roman|I}} formant une cadence parfaite).
Pour le quatrième accord, nous pourrions rester sur l'accord parfait de ''do'' mais cela planterait en quelque sorte la fin du morceau puisque l'on resterait sur la cadence parfaite ; or, nous connaissons le morceau et savons qu'il n'est pas fini. Nous choisissons l'accord de ''la''<sup>5</sup> qui est une sixte ascendante ({{Times New Roman|I}}-{{Times New Roman|VI}}).
Nos aurions pu répartir les voix différemment. Par exemple :
* alto : ''sol''-''si''-''sol''-''do'' ;
* ténor : ''mi''-''ré''-''mi''-''mi''.
{{boîte déroulante/fin}}
[[Fichier:Harmonisation possible de frere jacques.midi|vignette|Fichier son correspondant.]]
{{clear}}
== Annexe ==
=== Accords en musique classique ===
Un accord est un ensemble de notes jouées simultanément. Il peut s'agir :
* de notes jouées par plusieurs instruments ;
* de notes jouées par un même instrument : piano, clavecin, orgue, guitare, harpe (la plupart des instruments à clavier et des instruments à corde).
Pour deux notes jouées simultanément, on parle d'intervalle « harmonique » (par opposition à l'intervalle « mélodique » qui concerne les notes jouées successivement).
Les notes répétées à différentes octaves ne changent pas la nature de l'accord.
La musique classique considère en général des empilements de tierces ; un accord de trois notes sera constitué de deux tierces successives, un accord de quatre notes de trois tierces…
Lorsque tous les intervalles sont des intervalles impairs — tierces, quintes, septièmes, neuvièmes, onzièmes, treizièmes… — alors l'accord est dit « à l'état fondamental » (ou encore « primitif » ou « direct »). La note de la plus grave est appelée « fondamentale » de l'accord. Lorsque l'accord comporte un ou des intervalles pairs, l'accord est dit « renversé » ; la note la plus grave est appelée « basse ».
De manière plus générale, l'accord est dit à l'état fondamental lorsque la basse est aussi la fondamentale. On a donc un état idéal de l'accord (état canonique) — un empilement strict de tierces — et l'état réel de l'accord — l'empilement des notes réellement jouées, avec d'éventuels redoublements, omissions et inversions ; et seule la basse indique si l'accord est à l'état fondamental ou renversé.
Le chiffrage dit de « basse continue » ''({{lang|it|basso continuo}})'' désigne la représentation d'un accord sous la forme d'un ou plusieurs chiffres arabes et éventuellement d'un chiffre romain.
==== Accords de trois notes ====
En musique classique, les seuls accords considérés comme parfaitement consonants, c'est-à-dire sonnant agréablement à l'oreille, sont appelés « accords parfaits ». Si l'on prend une tonalité et un mode donné, alors l'accord construit par superposition es degrés I, III et V de cette gamme porte le nom de la gamme qui l'a généré.
[[fichier:Accord do majeur chiffre.svg|vignette|upright=0.5|Accord parfait de ''do'' majeur chiffré.]]
Par exemple :
* « l'accord parfait de ''do'' majeur » est composé des notes ''do'', ''mi'' et ''sol'' ;
* « l'accord parfait de ''la'' mineur » est composé des notes ''la'', ''do'' et ''mi''.
Un accord parfait majeur est donc composé, en partant de la fondamentale, d'une tierce majeure et d'une quinte juste. Un accord parfait mineur est composé d'une tierce mineure et d'une quinte juste.
L'accord parfait à l'état fondamental est appelé « accord de quinte » et est simplement chiffré « 5 » pour indiquer la quinte.
On peut également commencer un accord sur sa deuxième ou sa troisième note, en faisant monter celle(s) qui précède(nt) à l'octave suivante. On parle alors de « renversement d'accord » ou d'accord « renversé ».
[[Fichier:Accord do majeur renversements chiffre.svg|vignette|upright=0.75|Accord parfait de ''do'' majeur et ses renversements, chiffrés.]]
Par exemple,
* le premier renversement de l'accord parfait de ''do'' majeur est :<br /> ''mi'', ''sol'', ''do'' ;
* le second renversement de l'accord parfait de do majeur est :<br /> ''sol'', ''do'', ''mi''.
Les notes conservent leur nom de « fondamentale », « tierce » et « quinte » malgré le changement d'ordre. La note la plus grave est appelée « basse ».
Dans le cas du premier renversement, le deuxième note est la tierce de la basse (la note la plus grave) et la troisième note est la sixte ; le chiffrage en chiffres arabes est donc « 6 » (puisque l'on omet la tierce) et l'accord est appelé « accord de sixte ». Pour le deuxième renversement, les intervalles sont la quarte et la sixte, le chiffrage est donc « 6-4 » et l'accord est appelé « accord de sixte et de quarte ».
Dans tous les cas, on chiffre le degré on considérant la fondamentale, par exemple {{Times New Roman|I}} si l'accord est construit sur la tonique de la gamme.
Les autres accords de trois notes que l'on rencontre sont :
* l'accord de quinte diminuée, constitué d'une tierce mineure et d'une quinte diminuée ; lorsqu'il est construit sur le septième degré d'une gamme, on considère que c'est un accord de septième de dominante sans fondamentale (voir plus bas), le degré est donc indiqué « “{{Times New Roman|V}}” » (cinq entre guillemets) et non « {{Times New Roman|VII}} » ;
* l'accord de quinte augmenté : il est composé d'une tierce majeure et qu'une quinte augmentée.
Dans le tableau ci-dessous,
* « m » désigne un intervalle mineur ;
* « M » un intervalle majeur ou le mode majeur ;
* « J » un intervalle juste ;
* « d » un intervalle diminué ;
* « A » un intervalle augmenté ;
* « mh » le mode mineur harmonique ;
* « ma » le mode mineur ascendant ;
* « md » le mode mineur descendant.
{| class="wikitable"
|+ Accords de trois notes
! scope="col" rowspan="2" | Nom
! scope="col" rowspan="2" | 3<sup>ce</sup>
! scope="col" rowspan="2" | 5<sup>te</sup>
! scope="col" rowspan="2" | État fondamental
! scope="col" rowspan="2" | 1<sup>er</sup> renversement
! scope="col" rowspan="2" | 2<sup>nd</sup> renversement
! scope="col" colspan="4"| Construit sur les degrés
|-
! scope="col" | M
! scope="col" | mh
! scope="col" | ma
! scope="col" | md
|-
| Accord parfait<br /> majeur || M || J
| accord de quinte || accord de sixte || accord de<br />sixte et de quarte
| {{Times New Roman|I, IV, V}} || {{Times New Roman|V, VI}} || {{Times New Roman|IV, V}} || {{Times New Roman|III, VI, VII}}
|-
| Accord parfait<br /> mineur || m || J
| accord de quinte || accord de sixte || accord de<br />sixte et de quarte
| {{Times New Roman|II, III, VI}} || {{Times New Roman|I, IV}} || {{Times New Roman|I, II}} || {{Times New Roman|I, IV, V}}
|-
| Accord de<br />quinte diminuée || m || d
| accord de<br />quinte diminuée || accord de<br />sixte sensible<br />sans fondamentale || accord de triton<br />sans fondamentale
| {{Times New Roman|VII (“V”)}} || {{Times New Roman|II, VII (“V”)}} || {{Times New Roman|VI, VII (“V”)}} || {{Times New Roman|II}}
|-
| Accord de<br />quinte augmentée || M || A
| accord de<br />quinte augmentée || accord de sixte<br />et de tierce sensible || accord de sixte et de quarte<br />sur sensible
| || {{Times New Roman|III}} || {{Times New Roman|III}} ||
|}
==== Accords de quatre notes ====
Les accords de quatre notes sont des accord composés de trois tierces superposées. La dernière note étant le septième degré de la gamme, on parle aussi d'accords de septième.
Ces accords sont dissonants : ils contiennent un intervalle de septième (soit une octave montante suivie d'une seconde descendante). Ils laissent donc une impression de « tension ».
Il existe sept différents types d'accords, ou « espèces ». Citons l'accord de septième de dominante, l'accord de septième mineure et l'accord de septième majeure.
===== L'accord de septième de dominante =====
[[Fichier:Accord 7e dominante do majeur renversements chiffre.svg|vignette|Accord de septième de dominante de ''do'' majeur et ses renversements, chiffrés.]]
L'accord de septième de dominante est l'empilement de trois tierces à partir de la dominante de la gamme, c'est-à-dire du {{Times New Roman|V}}<sup>e</sup> degré. Par exemple, l'accord de septième de dominante de ''do'' majeur est l'accord ''sol''-''si''-''ré''-''fa'', et l'accord de septième de dominante de ''la'' mineur est ''mi''-''sol''♯-''si''-''ré''. L'accord de septième de dominante dont la fondamentale est ''do'' (''do''-''mi''-''sol''-''si''♭) appartient à la gamme de ''fa'' majeur.
Que le mode soit majeur ou mineur, il est composé d'une tierce majeure, d'une quinte juste et d'une septième mineure (c'est un accord parfait majeur auquel on ajoute une septième mineure). C'est de loin l'accord de septième le plus utilisé ; il apparaît au {{pc|xvii}}<sup>e</sup> en musique classique.
Dans son état fondamental, son chiffrage est {{Times New Roman|V 7/+}} (ou {{Times New Roman|V<sup>7</sup><sub>+</sub>}}). Le signe plus indique la sensible.
Son premier renversement est appelé « accord de quinte diminuée et sixte » et est noté {{Times New Roman|V 6/<s>5</s>}} (ou {{Times New Roman|V<sup>6</sup><sub><s>5</s></sub>}}).
Son deuxième renversement est appelé « accord de sixte sensible », puisque la sixte de l'accord est la sensible de la gamme, et est noté {{Times New Roman|V +6}} (ou {{Times New Roman|V<sup>+6</sup>}}).
Son troisième renversement est appelé « accord de quarte sensible » et est noté {{Times New Roman|V +4}} (ou {{Times New Roman|V<sup>+4</sup>}}).
[[Fichier:Accord 7e dominante sans fondamentale do majeur renversements chiffre.svg|vignette|Accord de septième de dominante sans fondamentale de ''do'' majeur et ses renversements, chiffrés.]]
On utilise aussi l'accord de septième de dominante sans fondamentale ; c'est alors un accord de trois notes.
Dans son état fondamental, c'est un « accord de quinte diminuée » placé sur le {{Times New Roman|VII}}<sup>e</sup> degré (mais c'est bien un accord construit sur le {{Times New Roman|V}}<sup>e</sup> degré), noté {{Times New Roman|“V” <s>5</s>}} (ou {{Times New Roman|“V”<sup><s>5</s></sup>}}). Notez les guillemets qui indiquent que la fondamentale V est absente.
Dans son premier renversement, c'est un « accord de sixte sensible sans fondamentale » noté {{Times New Roman|“V” +6/3}} (ou {{Times New Roman|“V”<sup>+6</sup><sub>3</sub>}}).
Dans son second renversement, c'est un « accord de triton sans fondamentale » (puisque le premier intervalle est une quarte augmentée qui comporte trois tons) noté {{Times New Roman|“V” 6/+4}} (ou {{Times New Roman|“V”<sup>6</sup><sub>+4</sub>}}).
Notons qu'un accord de septième de dominante n'a pas toujours la dominante pour fondamentale : tout accord composé d'une tierce majeure, d'une quinte juste et d'une septième mineure est un accord de septième de dominante et est chiffré {{Times New Roman|<sup>7</sup><sub>+</sub>}}, quel que soit le degré sur lequel il est bâti (certaines notes peuvent avoir une altération accidentelle).
===== Les accords de septième d'espèce =====
Les autres accords de septièmes sont dits « d'espèce ».
L'accord de septième mineure est l'accord de septième formé sur la fondamentale d'une gamme mineure ''naturelle''. Par exemple, l'accord de septième mineure de ''la'' est ''la''-''do''-''mi''-''sol''. Il est composé d'une tierce mineure, d'une quinte juste et d'une septième mineure (c'est un accord parfait mineur auquel on ajoute une septième mineure).
L'accord de septième majeure est l'accord de septième formé sur la fondamentale d'une gamme majeure. Par exemple, L'accord de septième majeure de ''do'' est ''do''-''mi''-''sol''-''si''. Il est composé d'une tierce majeure, d'une quinte juste et d'une septième majeure (c'est un accord parfait majeur auquel on ajoute une septième majeure).
==== Utilisation du chiffrage ====
Le chiffrage est utilisé de deux manières.
La première manière, c'est la notation de la basse continue. La basse continue est une technique d'improvisation utilisée dans le baroque pour l'accompagnement d'instruments solistes. Sur la partition, on indique en général la note de basse de l'accord et le chiffrage en chiffres arabes.
La seconde manière, c'est pour l'analyse d'une partition. Le fait de chiffrer les accords permet de mieux en comprendre la structure.
De manière générale, on peut retenir que :
* le chiffrage « 5 » indique un accord parfait, superposition d'une tierce (majeure ou mineure) et d'une quinte juste ;
* le chiffrage « 6 » indique le premier renversement d'un accord parfait ;
* le chiffrage « 6/4 » indique le second renversement d'un accord parfait ;
* chiffrage « 7/+ » indique un accord de septième de dominante ;
* le signe « + » indique en général que la note de l'intervalle est la sensible ;
* un intervalle barré désigne un intervalle diminué.
[[fichier:Accords gamme do majeur la mineur.svg|class=transparent| center | Principaux accords construits sur les gammes de ''do'' majeur et de ''la'' mineur harmonique.]]
=== Notation « jazz » ===
En jazz et de manière générale en musique rock et populaire, la base d'un accord est la triade composée d'une tierce (majeure ou mineure) et d'une quinte juste. Pour désigner un accord, on utilise la note fondamentale, éventuellement désigné par une lettre dans le système anglo-saxon (A pour ''la'' etc.), suivi d'une qualité (comme « m », « + »…).
Les renversements ne sont pas notés de manière particulière, ils sont notés comme les formes fondamentales.
Dans les deux tableaux suivants, la fondamentale est notée X (remplace le C pour un accord de ''do'', le D pour un accord de ''ré''…). La construction des accords est décrite par la suite.
[[Fichier:Arbre accords triades 5d5J5A.svg|vignette|upright=1.5|Formation des triades présentée sous forme d'arbre.]]
{| class="wikitable"
|+ Notation des principales triades
|-
|
! scope="col" | Tierce<br />mineure (3m)
! scope="col" | Tierce<br />majeure (3M)
|-
! scope="row" | Quinte diminuée (5d)
| X<sup>o</sup>, Xm<sup>♭5</sup>, X–<sup>♭5</sup> ||
|-
! scope="row" | Quinte juste (5J)
| Xm, X– || X
|-
! scope="row" | Quinte augmentée (5A)
| || X+, X<sup>♯5</sup>
|}
[[Fichier:Triades do.svg|class=transparent|center|Triades de do.]]
{| class="wikitable"
|+ Notation des principaux accords de septième
|-
| colspan="2" |
! scope="col" | Tierce<br />mineure (3m)
! scope="col" | Tierce<br />majeure (3M)
|-
! scope="row" rowspan="2" | Quinte<br />diminuée (5d)
! scope="row" | Septième diminuée (7d)
| X<sup>o7</sup> ||
|-
! scope="row" | Septième mineure (7m)
| Xm<sup>7(♭5)</sup>, X–<sup>7(♭5)</sup>, X<sup>Ø</sup> ||
|-
! scope="row" rowspan="3" | Quinte<br />juste (5J)
! scope="row" | Sixte majeure (6M)
| Xm<sup>6</sup> || X<sup>6</sup>
|-
! scope="row" | Septième mineure (7m)
| Xm<sup>7</sup>, X–<sup>7</sup> || X<sup>7</sup>
|-
! scope="row" | Septième majeure (7M)
| Xm<sup>maj7</sup>, X–<sup>maj7</sup>, Xm<sup>Δ</sup>, X–<sup>Δ</sup> || X<sup>maj7</sup>, X<sup>Δ</sup>
|-
! scope="row" rowspan="2" | Quinte<br />augmentée (5A)
! scope="row" | Septième mineure (7m)
| || X+<sup>7</sup>
|-
! scope="row" | Septième majeure (7M)
| || X+<sup>maj7</sup>
|}
[[Fichier:Arbre accords septieme.svg|class=transparent|center|Formation des accords de septième présentée sous forme d'arbre.]]
[[Fichier:Accords do septieme.svg|class=transparent|center|Accord de do septième.]]
On notera que l'intervalle de sixte majeure est l'enharmonique de celui de septième diminuée (6M = 7d).
[[File:Principaux accords do.svg|class=transparent|center|Principaux accords de do.]]
==== Triades ====
; Accords fondés sur une tierce majeure
* accord parfait majeur : pas de notation
*: p. ex. « ''do'' » ou « C » pour l'accord parfait de ''do'' majeur (''do'' - ''mi'' - ''sol'')
; Accords fondés sur une tierce mineure
* accord parfait mineur : « m », « min » ou « – »
*: « ''do'' m », « ''do'' – », « Cm », « C– »… pour l'accord parfait de ''do'' mineur (''do'' - ''mi''♭ - ''sol'')
==== Triades modifiées ====
; Accords fondés sur une tierce majeure
* accord augmenté (la quinte est augmentée) : aug, +, ♯5
*: « ''do'' aug », « ''do'' + », « ''do''<sup>♯5</sup> » « Caug », « C+ » ou « C<sup>♯5</sup> » pour l'accord de ''do'' augmenté (''do'' - ''mi'' - ''sol''♯)
: L'accord augmenté est un empilement de tierces majeures. Ainsi, un accord augmenté a deux notes communes avec deux autres accords augmentés : C+ (''do'' - ''mi'' - ''sol''♯) a deux notes communes avec A♭+ (''la''♭ - ''do'' - ''mi'') et avec E+ (''mi'' - ''sol''♯ - ''si''♯) ; et on remarque que ces trois accords sont en fait enharmoniques (avec les enharmonies ''la''♭ = ''sol''♯ et ''si''♯ = ''do''). En effet, l'octave comporte six tons (sous la forme de cinq tons et deux demi-tons), et une tierce majeure comporte deux tons, on arrive donc à l'octave en ajoutant une tierce majeure à la dernière note de l'accord.
; Accords fondés sur une tierce mineure
* accord diminué (la quinte est diminuée) : dim, o, ♭5
*: « ''do'' dim », « ''do''<sup>o</sup> », « ''do''<sup>♭5</sup> », « Cdim », « C<sup>o</sup> » ou « C<sup>♭5</sup> » pour l'accord de ''do'' diminuné (''do'' - ''mi''♭ - ''sol''♭)
: On remarque que la quinte diminuée est l'enharmonique de la quarte augmentée et est l'intervalle appelé « triton » (car composé de trois tons).
; Accords fondés sur une tierce majeure ou mineure
* accord suspendu de seconde : la tierce est remplacée par une seconde majeure : sus2
*: « ''do''<sup>sus2</sup> » ou « C<sup>sus2</sup> » pour l'accord de ''do'' majeur suspendu de seconde (''do''-''ré''-''sol'')
* accord suspendu de quarte : la tierce est remplacée par une quarte juste : sus4
*: « ''do''<sup>sus4</sup> » ou « C<sup>sus4</sup> » pour l'accord de ''do'' majeur suspendu de quarte (''do''-''fa''-''sol'')
==== Triades appauvries ====
; Accords fondés sur une tierce majeure ou mineure
* accord de puissance : la tierce est omise, l'accord n'est constitué que de la fondamentale et de la quinte juste : 5
*: « ''do''<sup>5</sup> », « C<sup>5</sup> » pour l'accord de puissance de ''do'' (''do'' - ''la'')
{{note|Très utilisé dans les musiques rock, hard rock et heavy metal, il est souvent joué renversé (''la'' - ''do'') ou bien avec l'ajout de l'octave (''do'' - ''la'' - ''do'').}}
==== Triades enrichies ====
; Accords fondés sur une tierce majeure
* accord de septième (la 7<sup>e</sup> est mineure) : 7
*: « ''do''<sup>7</sup> », « C<sup>7</sup> » pour l'accord de ''do'' septième, appelé « accord de septième de dominante de ''fa'' majeur » en musique classique (''do'' - ''mi'' - ''sol'' - ''si''♭)
* accord de septième majeure : Δ, 7M ou maj7
*: « ''do'' <sup>Δ</sup> », « ''do'' <sup>maj7</sup> », « C<sup>Δ</sup> », « C<sup>7M</sup> »… pour l'accord de ''do'' septième majeure (''do'' - ''mi'' - ''sol'' - ''si'')
; Accords fondés sur une tierce mineure
* accord de mineur septième (la tierce et la 7<sup>e</sup> sont mineures) : m7, min7 ou –7
*: « ''do'' m<sup>7</sup> », « ''do'' –<sup>7</sup> », « Cm<sup>7</sup> », « C–<sup>7</sup> »… pour l'accord de ''do'' mineur septième, appelé « accord de septième de dominante de ''fa'' mineur » en musique classique (''do'' - ''mi''♭ - ''sol'' - ''si''♭)
* accord mineure septième majeure : m7M, m7maj, mΔ, –7M, –7maj, –Δ
*: « ''do'' m<sup>7M</sup> », « ''do'' m<sup>maj7</sup> », « ''do'' –<sup>Δ</sup> », « Cm<sup>7M</sup> », « Cm<sup>maj7</sup> », « C–<sup>Δ</sup> »… pour l'accord de ''do'' mineur septième majeure (''do'' - ''mi''♭ - ''sol'' - ''si'')
* accord de septième diminué (la quinte et la septième sont diminuée) : dim 7 ou o7
*: « ''do'' dim<sup>7</sup> », « ''do''<sup>o7</sup> », « Cdim<sup>7</sup> » ou « C<sup>o7</sup> » pour l'accord de ''do'' septième diminué (''do'' - ''mi''♭ - ''sol''♭ - ''si''♭)
* accord demi-diminué (seule la quinte est diminuée, la septième est mineure) : Ø ou –7(♭5)
*: « ''do''<sup>Ø</sup> », « ''do''<sup>7(♭5)</sup> », « C<sup>Ø</sup> » ou « C<sup>7♭5</sup> » pour l'accord de ''do'' demi-diminué (''do'' - ''mi''♭ - ''sol''♭ - ''si'')
=== Construction pythagoricienne des accords ===
Nous avons vu au débuts que lorsque l'on joue deux notes en même temps, leurs vibrations se superposent. Certaines superpositions créent un phénomène de battement désagréable, c'est le cas des secondes.
Dans le cas d'une tierce majeure, les fréquences des notes quadruple et quintuple d'une même base : les fréquences s'écrivent 4׃<sub>0</sub> et 5׃<sub>0</sub>. Cette superposition de vibrations est agréable à l'oreille. Nous avons également vu que dans le cas d'une quinte juste, les fréquences sont le double et le triple d'une même base, ou encore le quadruple et sextuple si l'on considère la moitié de cette base.
Ainsi, dans un accord parfait majeur, les fréquences des fondamentales des notes sont dans un rapport 4, 5, 6. De même, dans le cas d'un accord parfait mineur, les proportions sont de 1/6, 1/5 et 1/4.
{{voir|[[../Caractéristiques_et_notation_des_sons_musicaux#Construction_pythagoricienne_et_gamme_de_sept_tons|Caractéristiques et notation des sons musicaux > Construction pythagoricienne et gamme de sept tons]]}}
=== Un peu de physique : interférences ===
Les sons sont des vibrations. Lorsque l'on émet deux sons ou plus simultanément, les vibrations se superposent, on parle en physique « d'interférences ».
Le modèle le plus simple pour décrire une vibration est la [[w:fr:Fonction sinus|fonction sinus]] : la pression de l'air P varie en fonction du temps ''t'' (en secondes, s), et l'on a pour un son « pur » :
: P(''t'') ≈ sin(2π⋅ƒ⋅''t'')
où ƒ est la fréquence (en hertz, Hz) du son.
Si l'on émet deux sons de fréquence respective ƒ<sub>1</sub> et ƒ<sub>2</sub>, alors la pression vaut :
: P(''t'') ≈ sin(2π⋅ƒ<sub>1</sub>⋅''t'') + sin(2π⋅ƒ<sub>2</sub>⋅''t'').
Nous avons ici une [[w:fr:Identité trigonométrique#Transformation_de_sommes_en_produits,_ou_antilinéarisation|identité trigonométrique]] dite « antilinéarisation » :
: <math>\mathrm{P}(t) = 2 \cdot \sin \left ( 2\pi \frac{f_1 + f_2}{2}t \right ) \cdot \sin \left ( 2\pi \frac{f_1 - f_2}{2}t \right ).</math>
On peut étudier simplement deux situations simples.
[[Fichier:Battements interferentiels.png|vignette|Deux sons de fréquences proches créent des battements : la superposition d'une fréquence et d'une enveloppe.]]
La première, c'est quand les fréquences ƒ<sub>1</sub> et ƒ<sub>2</sub> sont très proches. Alors, la moyenne (ƒ<sub>1</sub> + ƒ<sub>2</sub>)/2 est très proche de ƒ<sub>1</sub> et ƒ<sub>2</sub> ; et la demie différence (ƒ<sub>1</sub> – ƒ<sub>2</sub>)/2 est très proche de zéro. On a donc une enveloppe de fréquence très faible, (ƒ<sub>1</sub> – ƒ<sub>2</sub>)/2, dans laquelle s'inscrit un son de fréquence moyenne, (ƒ<sub>1</sub> + ƒ<sub>2</sub>)/2. C'est cette enveloppe de fréquence très faible qui crée les battements, désagréables à l'oreille.
Sur l'image ci-contre, le premier trait rouge montre un instant où les vibrations sont opposées ; elles s'annulent, le son s'éteint. Le second trait rouge montre un instant où les vibrations sont en phase : elle s'ajoutent, le son est au plus fort.
{{clear}}
La seconde, c'est lorsque les deux fréquences sont des multiples entiers d'une même fréquence fondamentale ƒ<sub>0</sub> : ƒ<sub>1</sub> = ''n''<sub>1</sub>⋅ƒ<sub>0</sub> et ƒ<sub>0</sub> = ''n''<sub>0</sub>⋅ƒ<sub>0</sub>. On a alors :
: <math>\mathrm{P}(t) = 2 \cdot \sin \left ( 2\pi \frac{n_1 + n_2}{2}f_0 \cdot t \right ) \cdot \sin \left ( 2\pi \frac{n_1 - n_2}{2}f_0 \cdot t \right ).</math>
On multiplie donc deux fonctions qui ont des fréquences multiples de ƒ<sub>0</sub>. La différence minimale entre ''n''<sub>1</sub> et ''n''<sub>2</sub> vaut 1 ; on a donc une enveloppe dont la fréquence est au minimum la moitié de ƒ<sub>0</sub>, c'est-à-dire un son une octave en dessous de ƒ<sub>0</sub>. Donc, cette enveloppe ne crée pas d'effet de battement, ou plutôt, le battement est trop rapide pour être perçu comme tel. Dans cette enveloppe, on a une fonction sinus dont la fréquence est également un multiple de ƒ<sub>0</sub> ; l'enveloppe et la fonction qui y est inscrite ont donc de nombreux « points communs », d'où l'effet harmonieux.
=== Le tonnetz ===
[[File:Speculum musicae.png|thumb|right|225px|Euler, ''De harmoniæ veris principiis'', 1774, p. 350.]]
En allemand, le terme ''Tonnetz'' (se prononce « tône-netz ») signifie « réseau tonal ». C'est une représentation graphique des notes qui a été imaginée par [[w:Leonhard Euler|Leonhard Euler]] en 1739.
Cette représentation graphique peut aider à la mémorisation de certains concepts de l'harmonie. Cependant, son application est très limitée : elle ne concerne que l'intonation juste d'une part, et que les accords parfait des tonalités majeures et mineures naturelles d'autre part. La représentation contenant les douze notes de la musique savante occidentale, on peut bien sûr représenter d'autres objets, comme les accords de septième ou les accords diminués, mais la représentation graphique est alors compliquée et perd son intérêt pédagogique.
On part d'une note, par exemple le ''do''. Si on progresse vers la droite, on monte d'une quinte juste, donc ''sol'' ; vers la gauche, on descend d'une quinte juste, donc ''fa''. Si on va vers le bas, on monte d'une tierce majeure, donc ''mi'' ; si on va vers le haut, on descend d'une tierce majeure, donc ''la''♭ ou ''sol''♯
fa — do — sol — ré
| | | |
la — mi — si — fa♯
| | | |
do♯ — sol♯ — ré♯ — si♭
La figure forme donc un filet, un réseau. On voit que ce réseau « boucle » : si on descend depuis le ''do''♯, on monte d'une tierce majeure, on obtient un ''mi''♯ qui est l'enharmonique du ''fa'' qui est en haut de la colonne. Si on va vers la droite à partir du ''ré'', on obtient le ''la'' qui est au début de la ligne suivante.
Si on ajoute des diagonales allant vers la droite et le haut « / », on met en évidence des tierces mineures : ''la'' - ''do'', ''mi'' - ''sol'', ''si'' - ''ré'', ''do''♯ - ''mi''…
fa — do — sol — ré
| / | / | / |
la — mi — si — fa♯
| / | / | / |
do♯ — sol♯ — ré♯ — si♭
Donc les liens représentent :
* | : tierce majeure ;
* — : quinte juste ;
* / : tierce mineure.
[[Fichier:Tonnetz carre accords fr.svg|thumb|Tonnetz avec les accords parfaits. Les notes sont en notation italienne et les accords en notation jazz.]]
On met ainsi en évidence des triangles dont un côté est une quinte juste, un côté une tierce majeure et un côté une tierce mineure ; c'est-à-dire que les notes aux sommets du triangle forment un accord parfait majeur (par exemple ''do'' - ''mi'' - ''sol'') :
<div style="font-family:courier; background-color:#fafafa">
fa — '''do — sol''' — ré<br />
| / '''| /''' | / |<br />
la — '''mi''' — si — fa♯<br />
| / | / | / |<br />
do♯ — sol♯ — ré♯ — si♭
</div>
ou un accord parfait mineur (''la'' - ''do'' - ''mi'').
<div style="font-family:courier; background-color:#fafafa">
fa — '''do''' — sol — ré<br />
| '''/ |''' / | / |<br />
'''la — mi''' — si — fa♯<br />
| / | / | / |<br />
do♯ — sol♯ — ré♯ — si♭
</div>
Un triangle représente donc un accord, et un sommet représente une note. Si on passe d'un triangle à un triangle voisin, alors on passe d'un accord à un autre accord, les deux accords ayant deux notes en commun. Ceci illustre la notion de « plus court chemin » en harmonie : si on passe d'un accord à un autre en gardant un côté commun, alors on a un mouvement conjoint sur une seule des trois voix.
Par rapport à l'harmonie fonctionnelle : les accords sont contigus à leur fonction, par exemple en ''do'' majeur :
* fonction de tonique ({{Times New Roman|I}}) : C, A– et E– sont contigus ;
* fonction de sous-dominante ({{Times New Roman|IV}}) : F et D– sont contigus ;
* fonction de dominante ({{Times New Roman|V}}) : G et B<sup>o</sup> sont contigus.
On notera que les triangles d'un schéma ''tonnetz'' ne représentent que des accords parfaits. Pour représenter un accord de quinte diminuée (''si'' - ''ré'' - ''fa'') ou les accords de septième, en particulier l'accord de septième de dominante, il faut étendre le ''tonnetz'' et l'on obtient des figures différentes. Par ailleurs, il est adapté à ce que l'on appelle « l'intonation juste », puisque tous les intervalles sont idéaux.
[[Fichier:Tonnetz carre accords etendu fr.svg|vignette|Tonnetz étendu.]]
[[Fichier:Tonnetz carre do majeur accords fr.svg|vignette|Tonnetz de la tonalité de ''do'' majeur. La représentation de l'accord de quinte diminuée sur ''si'' (B<sup>o</sup>) est une ligne et non un triangle.]]
[[Fichier:Tonnetz carre do mineur accords fr.svg|vignette|Tonnetz des tonalités de ''do'' mineur naturel (haut) et ''do'' mineur harmonique (bas).]]
Si l'on étend un peu le réseau :
ré♭ — la♭ — mi♭ — si♭ — fa
| / | / | / | / |
fa — do — sol — ré — la
| / | / | / | / |
la — mi — si — fa♯ — do♯
| / | / | / | / |
do♯ — sol♯ — ré♯ — la♯ — mi♯
| / | / | / | / |
mi♯ — do — sol — ré — la
on peut donc trouver des chemins permettant de représenter les accords de septième de dominante (par exemple en ''do'' majeur, G<sup>7</sup>)
fa
/
sol — ré
| /
si
et des accords de quinte diminuée (en ''do'' majeur : B<sup>o</sup>)
fa
/
ré
/
si
Une gamme majeure ou mineure naturelle peut se représenter par un trapèze rectangle : ''do'' majeur
fa — do — sol — ré
| /
la — mi — si
et ''do'' mineur
la♭ — mi♭ — si♭
/ |
fa — do — sol — ré
En revanche, la représentation d'une tonalité nécessite d'étendre le réseau afin de pouvoir faire figurer tous les accords, deux notes sont représentées deux fois. La représentation des tonalités mineures harmoniques prend une forme biscornue, ce qui nuit à l'intérêt pédagogique de la représentation.
[[Fichier:Neo-Riemannian Tonnetz.svg|vignette|upright=2|Tonnetz avec des triangles équilatéraux.]]
On peut réorganiser le schéma en décalant les lignes, afin d'avoir des triangles équilatéraux. Sur la figure ci-contre (en notation anglo-saxonne) :
* si on monte en allant vers la droite « / », on a une tierce mineure ;
* si on descend en allant vers la droite « \ », on a une tierce majeure ;
* les liens horizontaux « — » représentent toujours des quintes justes
* les triangles pointe en haut sont des accords parfaits mineurs ;
* les triangles pointe en bas sont des accords parfaits majeurs.
On a alors les accords de septième de dominante
F
/
G — D
\ /
B
et de quinte diminuée
F
/
D
/
B
les tonalités majeures
F — C — G — D
\ /
A — E — B
et les tonalités mineures naturelles
A♭ — E♭ — B♭
/ \
F — C — G — D
== Notes et références ==
{{références}}
== Voir aussi ==
=== Liens externes ===
{{wikipédia|Consonance (harmonie tonale)}}
{{wikipédia|Disposition de l'accord}}
{{wikisource|Petit Manuel d’harmonie}}
* {{lien web
| url = https://www.apprendrelesolfege.com/chiffrage-d-accords
| titre = Chiffrage d'accords (classique)
| site = Apprendrelesolfege.com
| consulté le = 2020-12-03
}}
* {{lien web
| url = https://www.coursd-harmonie.fr/introduction/introduction2_le_chiffrage_d_accords.php
| titre = Introduction II : Le chiffrage d'accords
| site = Cours d'harmonie.fr
| consulté le = 2021-12-14
}}
* {{lien web
| url=https://www.coursd-harmonie.fr/
| titre = Cours d'harmonie en ligne
| auteur = Jean-Baptiste Voinet
| site=coursd-harmonie.fr
| consulté le = 2021-12-20
}}
* {{lien web
| url=http://e-harmonie.e-monsite.com/
| titre = Cours d'harmonie classique en ligne
| auteur = Olivier Miquel
| site=e-harmonie
| consulté le = 2021-12-24
}}
* {{lien web
| url=https://fr.audiofanzine.com/theorie-musicale/editorial/dossiers/les-gammes-et-les-modes.html
| titre = Les bases de l’harmonie
| site = AudioFanzine
| date = 2013-07-23
| consulté le = 2024-01-12
}}
* {{lien web
| url=https://www.radiofrance.fr/francemusique/podcasts/maxxi-classique/l-accord-de-tristan-dechiffre-et-desacralise-2481605
| titre = L’Accord de Tristan déchiffré et désacralisé !
| site = France Musique
| date = 2025-10-22
| consulté le = 2025-10-23
}}
----
''[[../Mélodie|Mélodie]]'' < [[../|↑]] > ''[[../Représentation musicale|Représentation musicale]]''
[[Catégorie:Formation musicale (livre)|Harmonie]]
5zi6nqfecugwgtebf4q50aby7223w1x
Fonctionnement d'un ordinateur/L'unité de chargement et le program counter
0
80691
765081
764069
2026-04-25T21:04:16Z
Mewtow
31375
/* Les optimisations du code automodifiant */
765081
wikitext
text/x-wiki
L'unité de contrôle s'occupe du chargement des instructions et de leur interprétation, leur décodage. Elle contient deux circuits : l''''unité de chargement''' qui charge l'instruction depuis la mémoire, et le '''séquenceur''' qui commande le chemin de données. Les deux circuits sont séparés, mais ils communiquent entre eux, notamment pour gérer les branchements. Dans ce chapitre, nous allons nous intéresser au chargement d'une instruction depuis la RAM/ROM, nous verrons l'étape de décodage de l'instruction au prochain chapitre.
L'unité de chargement a pour cœur le ''program counter'', le registre qui mémorise l'adresse de l'instruction à charger. Il s'agit précisément d'un compteur, vu que le contenu du registre est incrémenté à chaque fois qu'une instruction est chargée. Le ''program counter'' est remis à zéro lors du démarrage du processeur, mais est aussi modifié par les instructions de branchement qui écrivent une adresse dedans.
Son interface est la suivante : une entrée d'horloge, une entrée de ''Reset'', une entrée ''Enable'' qui indique quand l'incrémenter (renommée ''Instruction Fetch''), et deux entrées pour les branchements. Pour les branchements, il y a une entrée pour l'adresse de destination, une autre pour autoriser l'écriture de celle-ci dans le ''program counter''. La sortie du ''program counter'' est reliée au bus d'adresse mémoire, plus ou moins directement.
[[File:Program counter.jpg|centre|vignette|upright=2|Program counter]]
==Les interconnexions entre séquenceur et bus mémoire==
Pour lire une instruction, le processeur envoie le ''program counter'' sur le bus d'adresse et récupère l'instruction sur le bus de données. L'instruction lue est alors envoyée au séquenceur. Et cela demande de connecter le séquenceur au bus mémoire, à la fois sur le bus d'adresse et le bus de données. Et sur ce point, la situation est différente selon que l'on parler d'une architecture Harvard ou Von Neumann.
===Les architectures Harvard : des bus mémoire séparés pour la RAM et la ROM===
Sur les architectures Harvard, le séquenceur et le chemin de donnée utilisent des interfaces mémoire séparées. Le séquenceur est directement relié au bus mémoire de la ROM, alors que le chemin de données est connecté à la RAM.
[[File:Microarchitecture de l'interface mémoire d'une architecture Harvard.png|centre|vignette|upright=2|Microarchitecture de l'interface mémoire d'une architecture Harvard]]
Le ''program counter'' est envoyé sur le bus d'adresse de la ROM, l'instruction est récupérée sur le bus de données de la ROM. Pour la mémoire RAM, elle échange des données avec le chemin de données, notamment avec les registres généraux. Les adresses utilisées pour la RAM viennent elles soit du chemin de données, soit de l'unité de contrôle, tout dépend du mode d'adressage. Mais le ''program counter'' n'est pas impliqué.
[[File:Architecture Harvard - échanges de données.png|centre|vignette|upright=2|Architecture Harvard - échanges de données]]
Les architectures Harvard modifiées doivent cependant rajouter une connexion entre le bus ROM et les registres généraux. C'est nécessaire pour charger une donnée constante depuis la mémoire ROM. Rappelons que la donnée constante est copiée dans un registre général, donc dans le chemin de données.
[[File:Architecture Harvard modifiée - implémentation du processeur.png|centre|vignette|upright=2|Architecture Harvard modifiée - implémentation du processeur]]
===Les architectures Von-Neumann : un bus mémoire unique===
Sur les architectures Von-Neumann et affiliées, le séquenceur et le chemin de donnée partagent la même interface mémoire. Et cela pose deux problèmes.
Le premier problème est que le bus mémoire doit être libéré une fois l'instruction chargée, pour un éventuel accès mémoire. Et le séquenceur doit conserver une copie de l'instruction chargée, sans quoi il ne peut pas décoder l'instruction correctement. Par exemple, si l'instruction met plusieurs cycles à s'exécuter, le séquenceur doit conserver une copie de l'instruction durant ces plusieurs cycles. Pour ça, le processeur intègre un '''registre d'instruction''' situé juste avant le séquenceur, qui mémorise l'instruction chargée.
[[File:Registre d'instruction.png|centre|vignette|upright=2|Registre d'instruction.]]
Le second problème est de gérer le flot des instructions/données entre le bus mémoire, le chemin de données et le séquenceur. Si le processeur lit une instruction, le bus doit être relié à l'unité de contrôle. Par contre, s'il accède à une donnée, il doit être relié au chemin de données. Le processeur doit connecter l'interface mémoire soit au séquenceur, soit au chemin de données et cela complique le réseau d'interconnexion interne au processeur.
[[File:Architecture Von Neumann - implémentation du processeur.png|centre|vignette|upright=2|Architecture Von Neumann - implémentation du processeur]]
Une première solution utilise un bus unique qui relie l'interface mémoire, le séquenceur et le chemin de données. Pour charger une instruction, le séquenceur copie le ''program counter'' sur le bus d'adresse, attend que l'instruction lue soit disponible sur le bus de données, puis la copie dans le registre d'instruction. Le bus mémoire est alors libre et peut être utilisé pour lire ou écrire des données, si le besoin s'en fait sentir.
: Il faut noter que cette solution implique d'utiliser des registres d’interfaçage avec la mémoire.
[[File:Microarchitecture de l'interface mémoire d'une architecture von neumann.png|centre|vignette|upright=2|Microarchitecture de l'interface mémoire d'une architecture von neumann]]
Une autre solution utilise deux bus interne séparés : un connecté au bus d'adresse, l'autre au bus de données. Le ''program counter'' est alors connecté au bus interne d'adresse, le séquenceur est relié au bus interne de données. Notons que la technique marche bien si le ''program counter'' est dans le banc de registre : les interconnexions utilisées pour gérer l'adressage indirect permettent d'envoyer le ''program counter'' sur le bus d'adresse sans ajout de circuit.
Le tout peut être amélioré en remplaçant les deux bus par des multiplexeurs et démultiplexeurs. Le bus d'adresse est précédé par un multiplexeur, qui permet de faire le choix entre ''Program Counter'', adresse venant du chemin de données, ou adresse provenant du séquenceur (adressage absolu). De même, le bus de données est suivi par un démultiplexeur qui envoie la donnée/instruction lue soit au registre d'instruction, soit au chemin de données. Le tout se marie très bien avec les chemins de donnée vu dans le chapitre précédent. Au passage, il faut noter que cette solution nécessite un banc de registre multi-port.
[[File:Connexion du program counter sur les bus avec PC isolé.png|centre|vignette|upright=2|Connexion du program counter sur les bus avec PC isolé]]
==Le chargement d'une instruction==
[[File:Étape de chargement.png|vignette|upright=1|Étape de chargement.]]
L'étape de chargement (ou ''fetch'') doit faire deux choses : mettre à jour le ''program counter'' et lire l'instruction en mémoire RAM ou en ROM. Les deux étapes peuvent être faites en parallèle, dans des circuits séparés. Pendant que l'instruction est lue depuis la mémoire RAM/ROM, le ''program counter'' est incrémenté et/ou altéré par un branchement. Pour lire l'instruction, on envoie le ''program counter'' sur le bus d'adresse et on récupère l'instruction sur le bus de données pour l'envoyer sur l'entrée du séquenceur.
===Le chargement des instructions de longueur variable===
Le chargement des instructions de longueur variable pose de nombreux problèmes. Le premier est que mettre à jour le ''program counter'' demande de connaitre la longueur de l'instruction chargée, pour l'ajouter au ''program counter''. Si la longueur d'une instruction est variable, on doit connaitre cette longueur d'une manière où d'une autre. La solution la plus simple indique la longueur de l'instruction dans une partie de l'opcode ou de la représentation en binaire de l'instruction. Mais les processeurs haute performance de nos PC utilisent d'autres solutions, qui n'encodent pas explicitement la taille de l'instruction.
Les processeurs récents utilisent un registre d'instruction de grande taille, capable de mémoriser l'instruction la plus longue du processeur. Par exemple, si un processeur supporte des instructions allant de 1 à 8 octets, comme les CPU x86, le registre d'instruction fera 8 octets. Le décodeur d'instruction vérifie à chaque cycle le contenu du registre d'instruction. Si une instruction est détectée dedans, son décodage commence, peu importe la taille de l'instruction. Une fois l'instruction exécutée, elle est retirée du registre d'instruction. Reste à alimenter le registre d'instruction, à charger des instructions dedans. Et pour cela deux solutions : soit on charge l'instruction en plusieurs fois, soit d'un seul coup.
La solution la plus simple charge les instructions par mots de 8, 16, 32, 64 bits. Ils sont accumulés dans le registre d'instruction jusqu'à détecter une instruction complète. La technique marche nettement mieux si les instructions sont très longues. Par exemple, les CPU x86 ont des instructions qui vont de 1 à 15 octets, ce qui fait qu'ils utilisent cette technique. Précisément, elle marche si les instructions les plus longues sont plus grandes que le bus mémoire.
Une autre solution charge un bloc de mots mémoire aussi grand que la plus grande instruction. Par exemple, si le processeur gère des instructions allant de 1 à 4 octets, il charge 4 octets d'un seul coup dans le registre d'instruction. Il va de soit que cette solution ne marche que si les instructions du processeur sont assez courtes, au plus aussi courtes que le bus mémoire. Ainsi, on est sûr de charger obligatoirement au moins une instruction complète, et peut-être même plusieurs. Le contenu du registre d'instruction est alors découpé en instructions au fil de l'eau.
Utiliser un registre d'instruction large pose problème avec des instructions à cheval entre deux blocs. Il se peut qu'on n'ait pas une instruction complète lorsque l'on arrive à la fin du bloc, mais seulement un morceau. Le problème se manifeste peu importe que l'instruction soit chargée d'un seul coup ou bien en plusieurs fois.
[[File:Instructions non alignées.png|centre|vignette|upright=2|Instructions non alignées.]]
Dans ce cas, on doit décaler le morceau de bloc pour le mettre au bon endroit (au début du registre d'instruction), et charger le prochain bloc juste à côté. On a donc besoin d'un circuit qui décale tous les bits du registre d'instruction, couplé à un circuit qui décide où placer dans le registre d'instruction ce qui a été chargé, avec quelques circuits autour pour configurer les deux circuits précédents.
[[File:Décaleur d’instruction.png|centre|vignette|upright=2|Décaleur d’instruction.]]
Une autre solution se passe de registre d'instruction en utilisant à la place l'état interne du séquenceur. Là encore, elle charge l'instruction morceau par morceau, typiquement par blocs de 8, 16 ou 32 bits. Les morceaux ne sont pas accumulés dans le registre d'instruction, la solution utilise à la place l'état interne du séquenceur. Les mots mémoire de l'instruction sont chargés à chaque cycle, faisant passer le séquenceur d'un état interne à un autre à chaque mot mémoire. Tant qu'il n'a pas reçu tous les mots mémoire de l'instruction, chaque mot mémoire non terminal le fera passer d'un état interne à un autre, chaque état interne encodant les mots mémoire chargés auparavant. S'il tombe sur le dernier mot mémoire d'une instruction, il rentre dans un état de décodage.
===Le chargement avec les jeux d'instruction compacts===
Pour finir, il faut parler du cas particulier des jeux d'instruction compacts. Pour rappel, ces jeux d'instruction sont présents sur certains CPU RISC 32 bits. De tels processeurs gèrent un jeu d'instruction 32 bits normal, qui encode ses instructions sur 32 bits, et un jeu d'instruction plus compact qui encode ses instructions sur 16 bits. Nous allons prendre l'exemple du jeu d'instruction emblématique de cette catégorie : l'ARM ''thumb'', qui est le jeu d'instruction compact associé au jeu d'instruction ARM 32 bits.
Les deux jeux d'instruction ont un mode d'exécution chacun, ce qui veut dire que le processeur est configuré pour fonctionner en mode ''thumb'' ou en mode ARM 32 bits. En clair, on ne peut pas mélanger les deux jeu d'instructions en même temps. La raison est qu'une même suite de bit correspondait soit à une instruction ARM normale, soit à deux instructions thumbs. Pour faire la différence, il faut préciser dans quel mode d'exécution le CPU est : mode ARM ou mode thumb. Le processeur interpréte les instructions correctement en tenant compte de ce mode.
Intuitivement, on se dirait qu'il y a deux décodeurs séparés : un utilisé en mode ARM, un autre utilisé en mode ''thumb''. Sauf que ce n'est pas la solution retenue. A la place, les ingénieurs d'ARM profitent d'une propriété du ''thumb'' : ''thumb'' est un sous-ensemble du jeu d’instruction 32 bits. Par exemple, une instruction ''thumb'' a un équivalent en RAM 32 bits, bien que l'encodage entre les deux est différent. Et cette propriété est utilisée pour faciliter l'implémentation au niveau du décodeur. Le processeur contient simplement un circuit qui convertit les instructions ''thumb'' en leur équivalent ARM 32 bits. Le circuit de conversion se situe en aval de l'unité de chargement, juste avant le décodeur d'instruction. Le circuit est désactivé quand le processeur fonctionne en mode ARM, mais est active en mode ''thumb''.
===Les optimisations du code automodifiant===
Précédemment dans ce cours, nous avons parlé du code automodifiant, à savoir le fait qu'un programme modifie ses propres instructions à la volée. Il était utilisé pour avoir des tableaux, sur des processeurs qui ne supportaient que le mode d'adressage direct. L'idée était que les instructions d'accès mémoire incorporaient une adresse, qui était incrémentée/décrémentée par code auto-modifiant. Les branchements indirects étaient eux aussi gérés de la même manière : l'adresse de destination, incorporée dans l'instruction via adressage absolu, était changée via code automodifiant.
Quelques rares processeurs ont incorporé des optimisations pour simplifier l'usage du code automodifiant. Elles agissaient toutes sur le registre d'instruction, en permettant de modifier son contenu. Les instructions étaient chargées dans le registre d'instruction et étaient modifiées dans ce registre, avant d'être décodées. La modification était généralement assez simple : appliquer un masque, additionner une constante, guère plus. Les processeurs de ce type sont très rares, j'en connais deux exemples : le Burroughs B1700 et l'Apollo Guidance Computer.
Le Burroughs B1700 permettait d'appliquer un masque sur l'instruction lue. Pour cela, il permettait de faire un OU logique entre l'instruction lue et un registre du processeur, le résultat étant mémorisé dans le registre d'instruction. Cela permettait par exemple de remplacer une adresse dans une micro-opération. L'adresse est alors surimposée avec un OU dans le champ d'adresse, alors que le reste de l'instruction n'est pas modifié.
Un autre exemple est celui de l'Apollo Guidance Computer, qui permettait d'altérer le registre d'instruction avec une instruction dédiée, l'instruction ''Index next instruction'', que nous appellerons INI. Nous avons déjà vu cette instruction INI, dans le chapitre sur les modes d'adressage, mais nous pouvons maintenant expliquer comment elle est implémentée. Elle additionne une constante à l'instruction suivante. Elle était utilisée pour ajouter un décalage à une adresse, dans une instruction LOAD/STORE, ou un branchement direct. L'addition était vraisemblablement réalisée par l'ALU du processeur. La conséquence est que le registre d'instruction était un registre architectural, qui était adressé implicitement, avec un mode d'adressage implicite.
Un dernier exemple, plus subtil, est celui du coprocesseur d'entrées-sortie PIO présent sur les Rasberry Pi. Son instruction MOV peut copier une donnée d'une source vers une destination, source et destination étant très variées. Elle pouvait écrire dans les registres, mais aussi dans le ''Program Counter'' et le registre d'instruction. Écrire dans le ''Program Counter'' permettait de faire des branchements inconditionnels, écrire dans le registre d'instruction permettait d'exécuter le contenu d'un registre comme si c'était une instruction. Cela permet d'ajouter des instructions à un programme, sans modifier le programme en mémoire RAM. La possibilité n'est sans doute pas beaucoup utilisée, mais elle existe !
==L'incrémentation du ''program counter''==
À chaque chargement, le ''program counter'' est mis à jour afin de pointer sur la prochaine instruction à charger. Sur la quasi-totalité des processeurs, les instructions sont placées dans l'ordre d’exécution dans la RAM. En faisant ainsi, on peut mettre à jour le ''program counter'' en lui ajoutant la longueur de l'instruction courante. Déterminer la longueur de l'instruction est simple quand les instructions ont toutes la même taille, mais certains processeurs ont des instructions de taille variable, ce qui complique le calcul. Dans ce qui va suivre, nous allons supposer que les instructions sont de taille fixe, ce qui fait que le ''program counter'' est toujours incrémenté de la même valeur.
Il existe deux méthodes principales pour incrémenter le ''program counter'' : soit le ''program counter'' a son propre additionneur, soit le ''program counter'' est mis à jour par l'ALU. Pour ce qui est de l'organisation des registres, soit le ''program counter'' est un registre séparé des autres, soit il est regroupé avec d'autres registres dans un banc de registre. En tout, cela donne quatre organisations possibles.
* Un ''program counter'' séparé relié à un incrémenteur séparé.
* Un ''program counter'' séparé des autres registres, incrémenté par l'ALU.
* Un ''program counter'' intégré au banc de registre, relié à un incrémenteur séparé.
* Un ''program counter'' intégré au banc de registre, incrémenté par l'ALU.
[[File:Calcul du program counter.png|centre|vignette|upright=2|les différentes méthodes de calcul du program counter.]]
Les processeurs haute performance modernes utilisent tous la première méthode. Les autres méthodes étaient surtout utilisées sur les processeurs 8 ou 16 bits, elles sont encore utilisées sur quelques microcontrôleurs de faible puissance. Nous auront l'occasion de donner des exemples quand nous parlerons des processeurs 8 bits anciens, dans le chapitre sur les architectures à accumulateur et affiliées.
===Le ''program counter'' mis à jour par l'ALU===
Sur certains processeurs, le calcul de l'adresse de la prochaine instruction est effectué par l'ALU. L'avantage de cette méthode est qu'elle économise un incrémenteur dédié au ''program counter''. Ce qui explique que cette méthode était utilisée sur les processeurs assez anciens, à une époque où un additionneur pouvait facilement prendre 10 à 20% des transistors disponibles. Le désavantage principal est une augmentation de la complexité du séquenceur, qui doit gérer la mise à jour du ''program counter''. De plus, la mise à jour du ''program counter'' ne peut pas se faire en même temps qu'une opération arithmétique, ce qui réduit les performances.
Si on incrémente le ''program counter'' avec l'ALU, il est intéressant de le placer dans le banc de registres. Un désavantage est qu'on perd un registre. Par exemple, avec un banc de registre de 16 registres, on ne peut adresser que 15 registres généraux. De plus ce n'est pas l'idéal pour le décodage des instructions et pour le séquenceur. Si le processeur dispose de plusieurs bancs de registres, le ''program counter'' est généralement placé dans le banc de registre dédié aux adresses. Sinon, il est placé avec les nombres entiers/adresses.
D'anciens processeurs incrémentaient le ''program counter'' avec l'ALU, mais utilisaient bien un registre séparé pour le ''program counter''. Cette méthode est relativement simple à implémenter : il suffit de connecter/déconnecter le ''program counter'' du bus interne suivant les besoins. Le ''program counter'' est déconnecté pendant l’exécution d'une instruction, il est connecté au bus interne pour l'incrémenter. C'est le séquenceur qui gère le tout. L'avantage de cette séparation est qu'elle est plus facile à gérer pour le séquenceur. De plus, on gagne un registre général/entier dans le banc de registre.
===Le compteur programme===
Dans la quasi-totalité des processeurs modernes, le ''program counter'' est un vulgaire compteur comme on en a vu dans les chapitres sur les circuits, ce qui fait qu'il passe automatiquement d'une adresse à la suivante. Dans ce qui suit, nous allons appeler ce registre compteur : le '''compteur ordinal'''. L'usage d'un compteur simplifie fortement la conception du séquenceur. Le séquenceur n'a pas à gérer la mise à jour du ''program counter'', sauf en cas de branchements. De plus, il est possible d'incrémenter le ''program counter'' pendant que l'unité de calcul effectue une opération arithmétique, ce qui améliore grandement les performances. Le seul désavantage est qu'elle demande d'ajouter un incrémenteur dédié au ''program counter''.
Sur les processeurs très anciens, les instructions faisaient toutes un seul mot mémoire et le compteur ordinal était un circuit incrémenteur des plus basique. Sur les processeurs modernes, le compteur est incrémenté par pas de 4 si les instructions sont codées sur 4 octets, 8 si les instructions sont codées sur 8 octets, etc. Concrètement, le compteur est un circuit incrémenteur auquel on aurait retiré quelques bits de poids faible. Par exemple, si les instructions sont codées sur 4 octets, on coupe les 2 derniers bits du compteur. Si les instructions sont codées sur 8 octets, on coupe les 3 derniers bits du compteur. Et ainsi de suite.
Une amélioration de la solution précédente utilise un circuit incrémenteur partagé entre le ''program counter'' et d'autres registres. L'incrémenteur est utilisé pour incrémenter le ''program counter'', mais aussi pour effectuer d'autres calculs d'adresse. Par exemple, sur les architectures avec une pile d'adresse de retour, il est possible de partager l'incrémenteur/décrémenteur avec le pointeur de pile ( la technique ne marche pas avec une pile d'appel). Un autre exemple est celui des processeurs qui gèrent automatiquement le rafraichissement mémoire, grâce à, un compteur intégré dans le processeur. Il est possible de partager l'incrémenteur du ''program counter'' avec le compteur de rafraichissement mémoire, qui mémorise la prochaine adresse mémoire à rafraichir. Nous avions déjà abordé ce genre de partage dans le chapitre sur le chemin de données, dans l'annexe sur le pointeur de pile, mais nous verrons d'autres exemples dans le chapitre sur les architectures hybrides accumulateur-registre 8/16 bits.
Il a existé quelques processeurs pour lesquelles le ''program counter'' était non pas un compteur binaire classique, mais un ''linear feedback shift register''. L'avantage est que le circuit d'incrémentation utilisait bien moins de portes logiques, l'économie était substantielle. Mais un défaut est que des instructions consécutives dans le programme n'étaient pas consécutives en mémoire. Il existait cependant une table de correspondance pour dire : la première instruction est à telle adresse, la seconde à telle autre, etc. Un exemple de processeur de ce type est le TMS 1000 de Texas Instrument, un des premiers microcontrôleur 4 bits datant des années 70.
===Quand est mis à jour le ''program counter'' ?===
Le ''program counter'' est mis à jour quand il faut charger une nouvelle instruction. Reste qu'il faut savoir quand le mettre à jour. Incrémenter le ''program counter'' à intervalle régulier, par exemple à chaque cycle d’horloge, fonctionne sur les processeurs où toutes les instructions mettent le même temps pour s’exécuter. Mais de tels processeurs sont très rares. Sur la quasi-totalité des processeurs, les instructions ont une durée d’exécution variable, elles ne prennent pas le même nombre de cycle d'horloge pour s’exécuter. Le temps d’exécution d'une instruction varie selon l'instruction, certaines sont plus longues que d'autres. Tout cela amène un problème : comment incrémenter le ''program counter'' avec des instructions avec des temps d’exécution variables ?
La réponse est que la mise à jour du ''program counter'' démarre quand l'instruction précédente a terminée de s’exécuter, plus précisément un cycle avant. C'est un cycle avant pour que l'instruction chargée soit disponible au prochain cycle pour le décodeur. Pour cela, le séquenceur doit déterminer quand l'instruction est terminée et prévenir le ''program counter'' au bon moment. Il faut donc une interaction entre séquenceur et circuit de chargement. Le circuit de chargement contient une entrée Enable, qui autorise la mise à jour du ''program counter''. Le séquenceur met à 1 cette entrée pour prévenir au ''program counter'' qu'il doit être incrémenté au cycle suivant ou lors du cycle courant. Cela permet de gérer simplement le cas des instructions multicycles.
[[File:Commande de la mise à jour du program counter.png|centre|vignette|upright=2|Commande de la mise à jour du program counter.]]
Toute la difficulté est alors reportée dans le séquenceur, qui doit déterminer la durée d'une instruction. Pour gérer la mise à jour du ''program counter'', le séquenceur doit déterminer la durée d'une instruction. Cela est simple pour les instructions arithmétiques et logiques, qui ont un nombre de cycles fixe, toujours le même. Une fois l'instruction identifiée par le séquenceur, il connait son nombre de cycles et peut programmer un compteur interne au séquenceur, qui compte le nombre de cycles de l'instruction, et fournit le signal Enable au ''program counter''. Mais cette technique ne marche pas vraiment pour les accès mémoire, dont la durée n'est pas connue à l'avance, surtout sur les processeurs avec des mémoires caches. Pour cela, le séquenceur détermine quand l'instruction mémoire est finie et prévient le ''program counter'' quand c'est le cas.
Il existe quelques processeurs pour lesquels le temps de calcul dépend des opérandes de l'instruction. On peut par exemple avoir une division qui prend 10 cycles avec certaines opérandes, mais 40 cycles avec d'autres opérandes. Mais ces processeurs sont rares et cela est surtout valable pour les opérations de multiplication/division, guère plus. Le problème est alors le même qu'avec les accès mémoire et la solution est la même : l'ALU prévient le séquenceur quand le résultat est disponible.
==Les branchements et le ''program counter''==
Un branchement consiste juste à écrire l'adresse de destination dans le ''program counter''. L'implémentation des branchements demande d'extraire l'adresse de destination et d'altérer le ''program counter'' quand un branchement est détecté. Pour cela, le décodeur d'instruction détecte si l'instruction exécutée est un branchement ou non, et il en déduit où trouver l'adresse de destination.
L'adresse de destination se trouve à un endroit qui dépend du mode d'adressage du branchement. Pour rappel, on distingue quatre modes d'adressage pour les branchements : direct, indirect, relatif et implicite. Pour les branchements directs, l'adresse est intégrée dans l'instruction de branchement elle-même et est extraite par le séquenceur. Pour les branchements indirects, l'adresse de destination est dans le banc de registre. Pour les branchements relatifs, il faut ajouter un décalage au ''program counter'', décalage extrait de l'instruction par le séquenceur. Enfin, les instructions de retour de fonction lisent l'adresse de destination depuis la pile. L'implémentation de ces quatre types de branchements est très différente.
L'altération du ''program counter'' dépend de si le ''program counter'' est dans un compteur séparé ou s'il est dans le banc de registre. Nous avons vu plus haut qu'il y a quatre cas différents, mais nous n'allons voir que deux cas : celui où le ''program counter'' est dans le banc de registre et est incrémenté par l'unité de calcul, celui avec un ''program counter'' séparé avec son propre incrémenteur. Les deux autres cas ne sont utilisés que sur des architectures à accumulateur ou à pile spécifiques, que nous n'avons pas encore vu à ce stade du cours et que nous verrons en temps voulu dans le chapitre sur ces architectures.
===L’implémentation des branchements avec un ''program counter'' intégré au banc de registres===
Le cas le plus simple est celui où le ''program counter'' est intégré au banc de registre, avec une incrémentation faite par l'unité de calcul. Charger une instruction revient alors à effectuer une instruction LOAD en adressage indirect, à deux différences près : le registre sélectionné est le ''program counter'', l’instruction est copiée dans le registre d'instruction et non dans le banc de registre. L'incrémentation du ''porgram counter'' est implémenté avec des micro-opérations qui agissent sur le chemin de données, au même titre que les branchements indirects, relatifs et directs.
* Les branchements indirects copient un registre dans le ''program counter'', ce qui revient simplement à faire une opération MOV entre deux registres, dont le ''program counter'' est la destination.
* L'opération inverse d'un branchement indirect, qui copie le ''program counter'' dans un registre général, est utile pour sauvegarder l'adresse de retour d'une fonction.
* Les branchements directs copient une adresse dans le ''program counter'', ce qui les rend équivalents à une opération MOV avec une constante immédiate, dont le ''program counter'' est la destination.
* Les branchements relatifs sont une opération arithmétique entre le ''program counter'' et un opérande en adressage immédiat.
En clair, à partir du moment où le chemin de données supporte les instructions MOV et l'addition, avec les modes d'adressage adéquat, il supporte les branchements. Aucune modification du chemin de données n'est nécessaire, le séquenceur gére le chargement d'une instruction avec les micro-instructions adéquates : une micro-opération ADD pour incrémenter le ''program counter'', une micro-opération LOAD pour le chargement de l'instruction.
Notons que sur certaines architectures, le ''program counter'' est adressable au même titre que les autres registres du banc de registre. Les instructions de branchement sont alors remplacées par des instructions MOV ou des instructions arithmétique équivalentes, comme décrit plus haut.
===L’implémentation des branchements avec un ''program counter'' séparé===
Étudions maintenant le cas où le ''program counter'' est dans un registre/compteur séparé. Rappelons que tout compteur digne de ce nom possède une entrée de réinitialisation, qui remet le compteur à zéro. De plus, on peut préciser à quelle valeur il doit être réinitialisé. Ici, la valeur à laquelle on veut réinitialiser le compteur n'est autre que l'adresse de destination du branchement. Implémenter un branchement est donc simple : l'entrée de réinitialisation est commandée par le circuit de détection des branchements, alors que la valeur de réinitialisation est envoyée sur l'entrée adéquate. En clair, nous partons du principe que le ''program counter'' est implémenté avec ce type de compteur :
[[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=1.5|Fonctionnement d'un compteur (décompteur), schématique]]
Toute la difficulté est de présenter l'adresse de destination au ''program counter''. Pour les branchements directs, l'adresse de destination est fournie par le séquenceur. L'adresse de destination du branchement sort du séquenceur et est présentée au ''program counter'' sur l'entrée adéquate. Voici donc comment sont implémentés les branchements directs avec un ''program counter'' séparé du banc de registres. Le schéma ci-dessous marche peu importe que le ''program counter'' soit incrémenté par l'ALU ou par un additionneur dédié.
[[File:Unité de détection des branchements dans le décodeur.png|centre|vignette|upright=2|Unité de détection des branchements dans le décodeur]]
Les branchements relatifs sont ceux qui font sauter X instructions plus loin dans le programme. Leur implémentation demande d'ajouter une constante au ''program counter'', la constante étant fournie dans l’instruction. Là encore, deux solutions sont possibles : réutiliser l'ALU pour calculer l'adresse, ou utiliser un additionneur séparé. L'additionneur séparé peut être fusionné avec l'additionneur qui incrémente le ''program counter'' pour passer à l’instruction suivante.
[[File:Unité de chargement qui gère les branchements relatifs.png|centre|vignette|upright=2|Unité de chargement qui gère les branchements relatifs.]]
Pour les branchements indirects, il suffit de lire le registre voulu et d'envoyer le tout sur l'entrée adéquate du ''program counter''. Il faut alors rajouter un multiplexeur pour que l'entrée de réinitialisationr ecoive la bonne adresse de destination.
[[File:Unité de chargement qui gère les branchements directs.png|centre|vignette|upright=2|Unité de chargement qui gère les branchements directs et indirects.]]
Toute la difficulté de l'implémentation des branchements est de configurer les multiplexeurs, ce qui est réalisé par le séquenceur en fonction du mode d'adressage du branchement.
==Les optimisations du chargement des instructions==
Charger une instruction est techniquement une forme d'accès mémoire un peu particulier. En clair, charger une instruction prend au minimum un cycle d'horloge, et cela peut rapidement monter à 3-5 cycles, si ce n'est plus. L'exécution des instructions est alors fortement ralentit par la mémoire. Par exemple, imaginez que la mémoire mette 3 cycles d'horloges pour charger une instruction, alors qu'une instruction s’exécute en 1 cycle (si les opérandes sont dans les registres). La perte de performance liée au chargement des instructions est alors substantielle. Heureusement, il est possible de limiter la casse en utilisant des mémoires caches, ainsi que d'autres optimisations, que nous allons voir dans ce qui suit.
===Le tampon de préchargement===
La technique dite du '''préchargement''' est utilisée dans le cas où la mémoire a un temps d'accès important. Mais si la latence de la RAM est un problème, le débit ne l'est pas. Il est possible d'avoir une RAM lente, mais à fort débit. Par exemple, supposons que la mémoire puisse charger 4 instructions (de taille fixe) en 3 cycles. Le processeur peut alors charger 4 instructions en un seul accès mémoire, et les exécuter l'une après l'autre, une par cycle d'horloge. Les temps d'attente sont éliminés : le processeur peut décoder une nouvelle instruction à chaque cycle. Et quand la dernière instruction préchargée est exécutée, la mémoire est de nouveau libre, ce qui masque la latence des accès mémoire.
[[File:Tampon de préchargement d'instruction.png|vignette|Tampon de préchargement d'instruction]]
La seule contrainte est de mettre les instructions préchargées en attente. La solution pour cela est d'utiliser un registre d'instruction très large, capable de mémoriser plusieurs instructions à la fois. Ce registre est de plus connecté à un multiplexeur qui permet de sélectionner l'instruction adéquate dans ce registre. Ce multiplexeur est commandé par le ''program counter'' et quelques circuits annexes. Ce super-registre d'instruction est appelé un '''tampon de préchargement'''.
La méthode a une implémentation nettement plus simple avec des instructions de taille fixe, alignées en mémoire. La commande du multiplexeur de sélection de l'instruction est alors beaucoup plus simple : il suffit d'utiliser les bits de poids fort du ''program counter''. Par exemple, prenons le cas d'un registre d'instruction de 32 octets pour des instructions de 4 octets, soit 8 instructions. Le choix de l'instruction à sélectionner se fait en utilisant les 3 bits de poids faible du ''program counter''.
Mais cette méthode ajoute de nouvelles contraintes d'alignement, similaires à celles vues dans le chapitre sur l'alignement et le boutisme, sauf que l'alignement porte ici sur des blocs d'instructions de même taille que le tampon de préchargement. Si on prend l'exemple d'un tampon de préchargement de 128 bits, les instructions devront être alignées par blocs de 128 bits. C'est à dire qu'idéalement, les fonctions et autres blocs de code isolés doivent commencer à des adresses multiples de 128, pour pouvoir charger un bloc d'instruction en une seule fois. Sans cela, les performances seront sous-optimales.
: Il arrive que le tampon de préchargement ait la même taille qu'une ligne de cache.
Lorsque l'on passe d'un bloc d'instruction à un autre, le tampon de préchargement est mis à jour. Par exemple, si on prend un tampon de préchargement de 4 instructions, on doit changer son contenu toutes les 4 instructions. La seule exception est l'exécution d'un branchement. En effet, lors d'un branchement, la destination du branchement n'est pas dans le tampon de préchargement et elle doit être chargée dedans (sauf si le branchement pointe vers une instruction très proche, ce qui est improbable). Pour cela, le tampon de préchargement est mis à jour précocement quand le processeur détecte un branchement.
Le même problème survient avec du code auto-modifiant. Un code auto-modifiant est un programme qui se modifie lui-même, en remplaçant certaines instructions par d'autres, en en retirant, en en ajoutant, lors de sa propre exécution. De tels programmes sont rares, mais la technique était utilisée dans quelques cas au tout début de l'informatique sur des ordinateurs rudimentaires. Ceux-ci avaient des modes d'adressages tellement limités que gérer des tableaux de taille variable demandait d'utiliser du code auto-modifiant pour écrire des boucles. Le problème survient quand des instructions sont modifiées immédiatement après avoir été préchargées. Les instructions dans le tampon de préchargement sont l'ancienne version, alors que la mémoire RAM contient les instructions modifiées. Gérer ce genre de cas demande de vider le tampon de préchargement si le cas arrive, mais ça ne vaut que très rarement le coup, aussi les ingénieurs ne s’embêtent pas à mettre ce correctif en place. Le code automodifiant est alors buggé.
===La ''prefetch input queue''===
La ''prefetch input queue'' est une sorte de cousine du tampon de préchargement, qui a été utilisée sur les processeurs Intel 8 et 16 bits, ainsi que sur le 286 et le 386. L'idée est là encore de précharger des instructions en avance. Sauf que cette fois-ci, on ne charge pas plusieurs instructions à la fois. Au contraire, les instructions sont préchargées séquentiellement, un ou deux octet à la fois. En conséquence, le tampon de préchargement est remplacé par une mémoire FIFO appelée la '''''Prefetch Input Queue''''', terme abrévié en PIQ. Les instructions sont accumulées une par une dans la PIQ, elles en sortent une par une au fur et à mesure pour alimenter le décodeur d'instruction.
Pendant que le processeur exécute une instruction, on précharge la suivante. Sans ''prefetch input queue'', le processeur chargeait une instruction, la décodait et l'exécutait, puis chargeait la suivante, et ainsi de suite. Avec un tampon de préchargement, le processeur chargeait plusieurs instruction en une seule fois, puis les exécutait les unes après les autres. Avec la ''prefetch input queue'', pendant qu'une instruction est en cours de décodage/exécution, le processeur précharge l'instruction suivante. Si une instruction prend vraiment beaucoup de temps pour s'exécuter, le processeur peut en profiter pour précharger l'instruction encore suivante, et ainsi de suite, jusqu'à une limite de 4/6 instructions (la limite dépend du processeur).
La ''prefetch input queue'' permet de précharger l'instruction suivante à condition qu'aucun autre accès mémoire n'ait lieu. Si l'instruction en cours d'exécution effectue des accès mémoire, ceux-ci sont prioritaires sur tout le reste, le préchargement de l'instruction suivante est alors mis en pause ou inhibé. Par contre, si la mémoire n'est pas utilisée par l'instruction en cours d'exécution, le processeur lit l'instruction suivante en RAM et la copie dans la ''prefetch input queue''. En conséquence, il arrive que la ''prefetch input queue'' n'ait pas préchargé l'instruction suivante, alors que le décodeur d'instruction est prêt pour la décoder. Dans ce cas, le décodeur doit attendre que l'instruction soit chargée.
Les instructions préchargées dans la ''Prefetch input queue'' y attendent que le processeur les lise et les décode. Les instructions préchargées sont conservées dans leur ordre d'arrivée, afin qu'elles soient exécutées dans le bon ordre, ce qui fait que la ''Prefetch input queue'' est une mémoire de type FIFO. L'étape de décodage pioche l'instruction à décoder dans la ''Prefetch input queue'', cette instruction étant par définition la plus ancienne, puis la retire de la file.
Le premier processeur commercial grand public à utiliser une ''prefetch input queue'' était le 8086. Il pouvait précharger à l'avance 6 octets d’instruction. L'Intel 8088 avait lui aussi une ''Prefetch input queue'', mais qui ne permettait que de précharger 4 instructions. Le 386 avait une ''prefetch input queue'' de 16 octets. La taille idéale de la FIFO dépend de nombreux paramètres. On pourrait croire que plus elle peut contenir d'instructions, mieux c'est, mais ce n'est pas le cas, pour des raisons que nous allons expliquer dans quelques paragraphes.
[[File:80186 arch.png|centre|vignette|700px|upright=2|Architecture du 8086, du 80186 et de ses variantes.]]
Vous remarquerez que j'ai exprimé la capacité de la ''prefetch input queue'' en octets et non en instructions. La raison est que sur les processeurs x86, les instructions sont de taille variable, avec une taille qui varie entre un octet et 6 octets. Cependant, le décodage des instructions se fait un octet à la fois : le décodeur lit un octet, puis éventuellement le suivant, et ainsi de suite jusqu'à atteindre la fin de l'instruction. En clair, le décodeur lit les instructions longues octet par octet dans la ''Prefetch input queue''.
Les instructions varient entre 1 et 6 octets, mais tous ne sont pas utiles au décodeur d'instruction. Par exemple, le décodeur d'instruction n'a pas besoin d'analyser les constantes immédiates intégrées dans une instruction, ni les adresses mémoires en adressage absolu. Il n'a besoin que de deux octets : l'opcode et l'octet Mod/RM qui précise le mode d'adressage. Le second est facultatif. En clair, le décodeur a besoin de lire deux octets maximum depuis la ''prefetch input queue'', avant de passer à l’instruction suivante. Les autres octets étaient envoyés ailleurs, typiquement dans le chemin de données.
Par exemple, prenons le cas d'une addition entre le registre AX et une constante immédiate. L'instruction fait trois octets : un opcode suivie par une constante immédiate codée sur deux octets. L'opcode était envoyé au décodeur, mais pas la constante immédiate. Elle était lue octet par octet et mémorisée dans un registre temporaire placé en entrée de l'ALU. Idem avec les adresses immédiates, qui étaient envoyées dans un registre d’interfaçage mémoire sans passer par le décodeur d'instruction. Pour cela, la ''prefetch input queue'' était connectée au bus interne du processeur ! Le décodeur dispose d'une micro-opération pour lire un octet depuis la ''prefetch input queue'' et le copier ailleurs dans le chemin de données. Par exemple, l'instruction d'addition entre le registre AX et une constante immédiate était composée de quatre micro-opérations : une qui lisait le premier octet de la constante immédiate, une seconde pour le second, une troisième micro-opération qui commande l'ALU et fait le calcul.
Le décodeur devait attendre que qu'un moins un octet soit disponible dans la ''Prefetch input queue'', pour le lire. Il lisait alors cet octet et déterminait s'il contenait une instruction complète ou non. Si c'est une instruction complète, il la décodait et l''exécutait, puis passait à l'instruction suivante. Sinon, il lit un second octet depuis la ''Prefetch input queue'' et relance le décodage. Là encore, le décodeur vérifie s'il a une instruction complète, et lit un troisième octet si besoin, puis rebelote avec un quatrième octet lu, etc.
Un circuit appelé le ''loader'' synchronisait le décodeur d'instruction et la ''Prefetch input queue''. Il fournissait deux bits : un premier bit pour indiquer que le premier octet d'une instruction était disponible dans la ''Prefetch input queue'', un second bit pour le second octet. Le ''loader'' recevait aussi des signaux de la part du décodeur d'instruction. Le signal ''Run Next Instruction'' entrainait la lecture d'une nouvelle instruction, d'un premier octet, qui était alors dépilé de la ''Prefetch input queue''. Le décodeur d'instruction pouvait aussi envoyer un signal ''Next-to-last (NXT)'', un cycle avant que l'instruction en cours ne termine. Le ''loader'' réagissait en préchargeant l'octet suivant. En clair, ce signal permettait de précharger l'instruction suivante avec un cycle d'avance, si celle-ci n'était pas déjà dans la ''Prefetch input queue''.
Le bus de données du 8086 faisait 16 bits, alors que celui du 8088 ne permettait que de lire un octet à la fois. Et cela avait un impact sur la ''prefetch input queue''. La ''prefetch input queue'' du 8088 était composée de 4 registres de 8 bits, avec un port d'écriture de 8 bits pour précharger les instructions octet par octet, et un port de lecture de 8 bits pour alimenter le décodeur. En clair, tout faisait 8 bits. Le 8086, lui utilisait des registres de 16 bits et un port d'écriture de 16 bits. le port de lecture restait de 8 bits, grâce à un multiplexeur sélectionnait l'octet adéquat dans un registre 16 bits. Sa ''prefetch input queue'' préchargeait les instructions par paquets de 2 octets, non octet par octet, alors que le décodeur consommait les instructions octet par octet. Il s’agissait donc d'une sorte d'intermédiaire entre ''prefetch input queue'' à la 8088 et tampon de préchargement.
Le 386 était dans un cas à part. C'était un processeur 32 bits, sa ''prefetch input queue'' contenait 4 registres de 32 bits, un port d'écriture de 32 bits. Mais il ne lisait pas les instructions octet par cotet. A la place, son décodeur d'instruction avait une entrée de 32 bits. Cependant, il gérait des instructions de 8 et 16 bits. Il fallait alors dépiler des instructions de 8, 16 et 32 bits dans la ''prefetch input queue''. De plus, les instructions préchargées n'étaient pas parfaitement alignées sur 32 bits : une instruction pouvait être à cheval sur deux registres 32 bits. Le processeur incorporait donc des circuits d'alignement, semblables à ceux utilisés pour gérer des instructions de longueur variable avec un registre d'instruction.
Les branchements posent des problèmes avec la ''prefetch input queue'' : à cause d'eux, on peut charger à l'avance des instructions qui sont zappées par un branchement et ne sont pas censées être exécutées. Si un branchement est chargé, toutes les instructions préchargées après sont potentiellement invalides. Si le branchement est non-pris, les instructions chargées sont valides, elles sont censées s’exécuter. Mais si le branchement est pris, elles ont été chargées à tort et ne doivent pas s’exécuter.
Pour éviter cela, la ''prefetch input queue'' est vidée quand le processeur détecte un branchement. Pour cela, le décodeur d'instruction dispose d'une micro-opération qui vide la ''Prefetch input queue'', elle invalide les instructions préchargées. Cette détection ne peut se faire qu'une fois le branchement décodé, qu'une fois que l'on sait que l'instruction décodée est un branchement. En clair, le décodeur invalide la ''Prefetch input queue'' quand il détecte un branchement. Les interruptions posent le même genre de problèmes. Il faut impérativement vider la ''Prefetch input queue'' quand une interruption survient, avant de la traiter.
Il faut noter qu'une ''Prefetch input queue'' interagit assez mal avec le ''program counter''. En effet, la ''Prefetch input queue'' précharge les instructions séquentiellement. Pour savoir où elle en est rendue, elle mémorise l'adresse de la prochaine instruction à charger dans un '''registre de préchargement''' dédié. Il serait possible d'utiliser un ''program counter'' en plus du registre de préchargement, mais ce n'est pas la solution qui a été utilisée. Les processeurs Intel anciens ont préféré n'utiliser qu'un seul registre de préchargement en remplacement du ''program counter''. Après tout, le registre de préchargement n'est qu'un ''program counter'' ayant pris une avance de quelques cycles d'horloge, qui a été incrémenté en avance.
Et cela ne pose pas de problèmes, sauf avec certains branchements. Par exemple, certains branchements relatifs demandent de connaitre la véritable valeur du ''program counter'', pas celle calculée en avance. Idem avec les instructions d'appel de fonction, qui demandent de sauvegarder l'adresse de retour exacte, donc le vrai ''program counter''. De telles situations demandent de connaitre la valeur réelle du ''program counter'', celle sans préchargement. Pour cela, le décodeur d'instruction dispose d'une instruction pour reconstituer le ''program counter'', à savoir corriger le ''program coutner'' et éliminer l'effet du préchargement.
La micro-opération de correction se contente de soustraire le nombre d'octets préchargés au registre de préchargement. Le nombre d'octets préchargés est déduit à partir des deux pointeurs intégré à la FIFO, qui indiquent la position du premier et du dernier octet préchargé. Le bit qui indique si la FIFO est vide était aussi utilisé. Les deux pointeurs sont lus depuis la FIFO, et sont envoyés à un circuit qui détermine le nombre d'octets préchargés. Sur le 8086, ce circuit était implémenté non pas par un circuit combinatoire, mais par une mémoire ROM équivalente. La petite taille de la FIFO faisait que les pointeurs étaient très petits et la ROM l'était aussi.
Un autre défaut est que la ''Prefetch input queue'' se marie assez mal avec du code auto-modifiant. Un code auto-modifiant est un programme qui se modifie lui-même, en remplaçant certaines instructions par d'autres, en en retirant, en en ajoutant, lors de sa propre exécution. De tels programmes sont rares, mais la technique était utilisée dans quelques cas au tout début de l'informatique sur des ordinateurs rudimentaires. Ceux-ci avaient des modes d'adressages tellement limités que gérer des tableaux de taille variable demandait d'utiliser du code auto-modifiant pour écrire des boucles.
Le problème avec la ''Prefetch input queue'' survient quand des instructions sont modifiées immédiatement après avoir été préchargées. Les instructions dans la ''Prefetch input queue'' sont l'ancienne version, alors que la mémoire RAM contient les instructions modifiées. Gérer ce genre de cas est quelque peu complexe. Il faut en effet vider la ''Prefetch input queue'' si le cas arrive, ce qui demande d'identifier les écritures qui écrasent des instructions préchargées. C'est parfaitement possible, mais demande de transformer la ''Prefetch input queue'' en une mémoire hybride, à la fois mémoire associative et mémoire FIFO. Cela ne vaut que très rarement le coup, aussi les ingénieurs ne s’embêtent pas à mettre ce correctif en place, le code automodifiant est alors buggé.
Le décodeur d'instruction dispose aussi d'une micro-opération qui stoppe le préchargement des instructions dans la ''Prefetch input queue''.
: Pour ceux qui ont déjà lu un cours d'architecture des ordinateurs, la relation entre ''prefetch input queue'' et pipeline est quelque peu complexe. En apparence, la ''prefetch input queue'' permet une certaines forme de pipeline, en chargeant une instruction pendant que la précédente s'exécute. Les problématiques liées aux branchements ressemblent beaucoup à celles de la prédiction de branchement. Cependant, il est possible de dire qu'il s'agit plus d'une technique de préchargement que de pipeline. La différence entre les deux est assez subtile et les frontières sont assez floues, mais le fait est que l'instruction en cours d'exécution et le préchargement peuvent tout deux faire des accès mémoire et que l'instruction en cours a la priorité. Un vrai pipeline se débrouillerait avec une architecture Harvard, non avec un bus mémoire unique pour le chargement des instruction et la lecture/écriture des données.
===Le ''Zero-overhead looping''===
Nous avions vu dans le chapitre sur les instructions machines, qu'il existe des instructions qui permettent de grandement faciliter l'implémentation des boucles. Il s'agit de l'instruction REPEAT, utilisée sur certains processeurs de traitement de signal. Elle répète l'instruction suivante, voire une série d'instructions, un certain nombre de fois. Le nombre de répétitions est mémorisé dans un registre décrémenté à chaque itération de la boucle. Elle permet donc d'implémenter une boucle FOR facilement, sans recourir à des branchements ou des conditions.
Une technique en lien avec cette instruction permet de grandement améliorer les performances et la consommation d'énergie. L'idée est de mémoriser la boucle, les instructions à répéter, dans une petite mémoire cache située entre l'unité de chargement et le séquenceur. Le cache en question s'appelle un '''tampon de boucle''', ou encore un ''hardware loop buffer''. Grâce à lui, il n'y a pas besoin de charger les instructions à chaque fois qu'on les exécute, on les charge une bonne fois pour toute : c'est plus rapide. Bien sûr, il ne fonctionne que pour de petites boucles, mais il en est de même avec l'instruction REPEAT.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Le chemin de données
| prevText=Le chemin de données
| next=L'unité de contrôle
| nextText=L'unité de contrôle
}}
</noinclude>
kfzg3glzx2sdiqgi7c8ipi7vey2w98e
Fonctionnement d'un ordinateur/Les architectures tolérantes aux pannes
0
81465
765076
730376
2026-04-25T20:39:12Z
EmausBot
70429
Robot : Correction d’une double redirection depuis [[Fonctionnement d'un ordinateur/Le parallélisme mémoire au niveau du cache]] vers [[Fonctionnement d'un ordinateur/Le parallélisme mémoire]]
765076
wikitext
text/x-wiki
#REDIRECTION [[Fonctionnement d'un ordinateur/Le parallélisme mémoire]]
mwgp3tyo4nz5vwietrgqp3puyz825v3
Fonctionnement d'un ordinateur/Les caches non-bloquants
0
81906
765077
730377
2026-04-25T20:39:22Z
EmausBot
70429
Robot : Correction d’une double redirection depuis [[Fonctionnement d'un ordinateur/Le parallélisme mémoire au niveau du cache]] vers [[Fonctionnement d'un ordinateur/Le parallélisme mémoire]]
765077
wikitext
text/x-wiki
#REDIRECTION [[Fonctionnement d'un ordinateur/Le parallélisme mémoire]]
mwgp3tyo4nz5vwietrgqp3puyz825v3
Fonctionnement d'un ordinateur/Le parallélisme mémoire au niveau du cach
0
81907
765075
730332
2026-04-25T20:39:02Z
EmausBot
70429
Robot : Correction d’une double redirection depuis [[Fonctionnement d'un ordinateur/Le parallélisme mémoire au niveau du cache]] vers [[Fonctionnement d'un ordinateur/Le parallélisme mémoire]]
765075
wikitext
text/x-wiki
#REDIRECTION [[Fonctionnement d'un ordinateur/Le parallélisme mémoire]]
mwgp3tyo4nz5vwietrgqp3puyz825v3
Dictionnaire de philosophie/Aristote
0
83057
765038
764928
2026-04-25T13:36:24Z
PandaMystique
119061
765038
wikitext
text/x-wiki
{{DicoPhilo|Aristote}}
Aristote (en grec ancien Ἀριστοτέλης, ''Aristotélēs'', 384-322 av. J.-C.) est un philosophe grec dont l'œuvre conservée couvre la logique, la philosophie de la nature, la biologie, la métaphysique, l'éthique, la politique, la rhétorique et la poétique. Né à Stagire en Chalcidique, il fut élève de Platon à l'Académie d'Athènes pendant une vingtaine d'années, puis précepteur d'Alexandre de Macédoine, avant de fonder à Athènes sa propre école, le Lycée. La transmission de ses écrits, complexe et partiellement lacunaire, a fortement conditionné l'ordre dans lequel ils nous sont parvenus ainsi que les modalités de leur interprétation : les dialogues exotériques publiés de son vivant ne subsistent qu'à l'état de fragments, tandis que les traités acroamatiques que nous lisons aujourd'hui ont été édités, organisés et titrés au Ier siècle av. J.-C. par Andronicos de Rhodes<ref>Sur l'histoire de la transmission, voir Pierre Pellegrin, ''Dictionnaire Aristote'', Paris, Ellipses, 2007, p. 5-7 ; Annick Jaulin, ''Aristote. La métaphysique'', Paris, PUF, 1999, Introduction.</ref>.
L'œuvre conservée a exercé une influence durable sur la philosophie ancienne tardive, sur les traditions arabe et latine médiévales, ainsi que sur plusieurs renaissances modernes de l'aristotélisme. Sa réception se fait selon des angles variables : les commentateurs néoplatoniciens en font une propédeutique au platonisme, les théologiens médiévaux y voient « le philosophe » par excellence (''Philosophus''), tandis que la science moderne se construit en partie en réaction à la physique péripatéticienne, sans pour autant rompre toujours avec elle de manière unilatérale<ref>Sur la pluralité des « Aristote » selon les époques, voir Daniel Larose, ''Aristote de A à Z'', Paris, PUF, « Que sais-je ? », 2021, Introduction.</ref>. Au {{XXe siècle}}, le projet « génétique » de Werner Jaeger – qui distinguait trois périodes (platonicienne, critique, empirique) dans la pensée du Stagirite – a été largement abandonné par la recherche universitaire, qui aborde aujourd'hui le corpus comme un ensemble cohérent sans être pour autant systématique<ref>Daniel Larose, ''Aristote de A à Z'', op. cit. ; voir aussi Pellegrin, ''Dictionnaire Aristote'', p. 6-8.</ref>.
Le présent article expose successivement la vie et le contexte historique d'Aristote, la constitution et la transmission de son œuvre, son rapport à Platon, puis ses doctrines en logique (l{{'}}''Organon''), philosophie de la nature, biologie, métaphysique et philosophie pratique (éthique, politique, rhétorique et poétique). Une dernière section traite de la réception et de la postérité de la pensée aristotélicienne.
== Vie et contexte historique ==
=== Origines familiales et contexte macédonien ===
Aristote naquit en 384 av. J.-C. à Stagire<ref>Stagire, l'actuelle Stavro, était une colonie grecque de la Chalcidique de Thrace, située sur la côte septentrionale de la mer Égée, à proximité de la Macédoine. Voir Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923), p. 103-104.</ref>, petite cité de la Chalcidique en Macédoine, d'où son surnom de Stagirite<ref>Ce patronyme sera employé tout au long de l'Antiquité pour le désigner. Cf. Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', Göteborg, Almqvist & Wiksell, 1957, p. 253-257.</ref>. Son père, Nicomaque, était médecin et appartenait à la corporation des Asclépiadés, dont les membres prétendaient descendre du dieu de la médecine, Asclépios<ref>Les Asclépiadés formaient une famille sacerdotale de médecins héritiers d'une tradition hippocratique. Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 1, trad. sous la dir. de M.-O. Goulet-Cazé, Paris, Le Livre de Poche, 1999, p. 573.</ref>. Nicomaque exerçait la fonction de médecin personnel et ami (''philos'') du roi Amyntas III de Macédoine<ref>Cette position à la cour macédonienne conférait à la famille d'Aristote un statut privilégié et des relations avec la maison royale. Voir Jean Brun, ''Aristote et le Lycée'', Paris, PUF, « Que sais-je ? », 1961, p. 7-8.</ref><ref>Diogène Laërce, ''Vies'', V, 1, op. cit., p. 573.</ref>.
Sa mère, Phæstias (ou Phaestis), originaire de Chalcis en Eubée, était sage-femme<ref>Certaines sources antiques indiquent qu'elle descendait d'une famille chalcidienne de notables. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 259.</ref>. La famille d'Aristote s'inscrivait ainsi dans un milieu cultivé, marqué à la fois par la pratique médicale rationnelle et par des ascendances ioniennes<ref>Selon Werner Jaeger, ces origines ioniennes pourraient avoir favorisé son goût pour l'investigation scientifique de la nature (''physis''), caractéristique des premiers Physiciens d'Ionie. Voir Werner Jaeger, ''Aristote'', op. cit., p. 105-106. Cette thèse, défendue par Jaeger dans le cadre de son interprétation génétique de la pensée d'Aristote, est aujourd'hui discutée par les historiens.</ref><ref>Ernest Barker, ''The Politics of Aristotle'', Oxford, Clarendon Press, 1946, Introduction, p. XI.</ref>.
Aristote devint orphelin à un âge précoce, perdant son père alors qu'il était encore enfant<ref>Sa mère mourut également jeune, laissant Aristote orphelin de ses deux parents avant ses dix-sept ans. Voir Werner Jaeger, ''Aristote'', op. cit., p. 104.</ref>. Il fut dès lors élevé par Proxène d'Atarnée, un ami de sa famille, originaire d'Atarnée en Mysie<ref>Atarnée était une cité située en Asie Mineure, en Troade. Diogène Laërce, ''Vies'', V, 3, op. cit., p. 574.</ref>. En reconnaissance, Aristote adoptera plus tard Nicanor, le fils de Proxène, et lui destinera sa propre fille Pythias par son testament<ref>Le testament d'Aristote, conservé par Diogène Laërce (V, 11-16), témoigne de ces liens familiaux durables. Voir l'édition dans Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014, p. 2597-2600.</ref><ref>Ces nouvelles attaches familiales constitueront les premiers rapports qu'Aristote entretiendra avec la région d'Atarnée, où il rencontrera plus tard Hermias, le futur tyran du lieu. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>.
=== Formation à l'Académie de Platon (367-347 av. J.-C.) ===
À l'âge de dix-sept ans, en 367-366 av. J.-C., Aristote se rend à Athènes, qui demeure alors, malgré son déclin politique et économique après les Guerres du Péloponnèse, l'un des principaux foyers intellectuels du monde grec<ref>Sous l'archontat de Polyzélos (selon Denys d'Halicarnasse) ou de Nausigénès (selon d'autres sources). Apollodore d'Athènes, cité par Diogène Laërce, V, 9, op. cit., p. 577.</ref>. Il entre à l'Académie de Platon, école philosophique fondée vers 387 av. J.-C.<ref>L'Académie tirait son nom du gymnase d'Académos, situé dans un faubourg d'Athènes. Voir Harold Cherniss, ''The Riddle of the Early Academy'', Berkeley, University of California Press, 1945, p. 1-72.</ref>. Cette institution dispensait un enseignement encyclopédique en mathématiques, astronomie, musique, dialectique, politique et philosophie<ref>Léon Robin, ''Aristote'', Paris, PUF, 1944, p. 3.</ref>.
Aristote y demeura vingt ans, jusqu'à la mort de Platon en 348-347 av. J.-C.<ref>Apollodore d'Athènes, cité par Diogène Laërce (V, 9-10), fournit cette chronologie. Voir Diogène Laërce, ''Vies'', op. cit., p. 577-578.</ref>. La tradition antique rapporte que Platon l'aurait surnommé le Liseur (''anagnôstês'') ou l'Intelligence de l'école (''ho nous tês scholês'')<ref>Ces surnoms, qui pourraient attester la reconnaissance par le Maître des dons de son élève, sont rapportés par les sources biographiques tardives. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 325-327.</ref><ref>''Vita Marciana'', dans Valentin Rose, ''Aristoteles Pseudepigraphus'', Leipzig, Teubner, 1863, p. 428 ; Jean Philopon, dans Proclus, ''De aeternitate mundi'', VI, 27, éd. Hugo Rabe, Leipzig, Teubner, 1899, p. 145.</ref>.
La tradition d'une rupture violente entre Aristote et Platon, attestée par certaines sources tardives, est aujourd'hui considérée par la critique moderne comme issue probablement des polémiques ultérieures entre épicuriens et péripatéticiens<ref>Les récits de Diogène Laërce évoquant une rupture violente sont jugés peu fiables par la plupart des biographes modernes. Voir Werner Jaeger, ''Aristote'', op. cit., p. 113-128.</ref>. Plusieurs éléments suggèrent au contraire des liens durables entre les deux philosophes : Aristote composa une élégie en l'honneur de son ami Eudème de Chypre, où il évoque Platon comme un maître<ref>Fragment 623 (Rose), conservé par Olympiodore. Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886, p. 42-43.</ref>. Dans l{{'}}''Éthique à Nicomaque'', Aristote écrit : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels, surtout quand on est philosophe : vérité et amitié nous sont chères l'une et l'autre, mais c'est pour nous un devoir sacré d'accorder la préférence à la vérité »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096 a 12-17, trad. J. Tricot, Paris, Vrin, 1959, p. 44.</ref><ref>Cette phrase a été condensée en latin par l'adage ''Amicus Plato, sed magis amica veritas'' : « ami de Platon, mais plus encore ami de la vérité ». Voir Ammonius, ''In Categorias'', éd. Busse, Berlin, Reimer, 1895, p. 79.</ref>.
Aristote participa à l'enseignement de l'Académie. On lui attribue notamment la charge du cours de rhétorique, qu'il aurait inauguré, selon certains témoignages, par cette formule : « Il serait honteux de se taire et de laisser parler Isocrate »<ref>Cette boutade visait Isocrate, le rival de Platon en matière d'enseignement rhétorique. Voir Werner Jaeger, ''Aristote'', op. cit., p. 180-182.</ref><ref>Philodème, ''Volumina rhetorica'', II, 36, 3-5, éd. Siegfried Sudhaus, Leipzig, Teubner, 1892-1896, vol. II, p. 50 ; Cicéron, ''De Oratore'', III, 35, 141 ; Quintilien, ''Institutio oratoria'', III, 1, 14.</ref>. Cette période fut également celle de ses premières publications, sous forme de dialogues à la manière platonicienne, dont la plupart sont aujourd'hui perdus<ref>Cicéron loua plus tard la qualité littéraire de ces dialogues, parlant d'un ''flumen orationis aureum'' : « un fleuve d'or de paroles ». Cicéron, ''Academica priora'', II, 38, 119.</ref>.
=== Voyages et maturation (348-335 av. J.-C.) ===
À la mort de Platon en 347, c'est le neveu du Maître, Speusippe, qui prend la direction de l'Académie. Aristote quitte alors Athènes — selon certaines hypothèses parce qu'il aurait espéré la succession, selon d'autres en raison du climat politique antimacédonien<ref>Voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 5.</ref>. Il se rend à Atarnée et Assos, en Troade (Asie Mineure), auprès de son ami Hermias, ancien condisciple de l'Académie devenu tyran d'Atarnée<ref>Hermias avait été esclave, puis affranchi, avant de devenir maître d'Atarnée et d'Assos. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>. Aristote y séjourne trois ans (347-345), accompagné probablement de Xénocrate<ref>Strabon, ''Géographie'', XIII, 1, 57, trad. F. Lasserre, Paris, Les Belles Lettres, 1981, p. 84-85.</ref>. Il y poursuit ses recherches philosophiques et biologiques<ref>C'est durant ce séjour qu'Aristote aurait entrepris des observations sur la faune marine de la côte d'Asie Mineure, dont témoignent l{{'}}''Histoire des Animaux'' et d'autres traités zoologiques. Voir David M. Balme, « The Place of Biology in Aristotle's Philosophy », dans Allan Gotthelf & James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987, p. 9-20.</ref>.
Hermias, pris dans les luttes entre la Macédoine et la Perse, fut capturé en 341 av. J.-C. par trahison sur ordre d'Artaxerxès III, le roi de Perse, torturé et exécuté<ref>Selon les sources antiques, Hermias refusa, malgré les tortures, de trahir ses liens avec Philippe II de Macédoine. Voir Werner Jaeger, ''Aristote'', op. cit., p. 138-142.</ref><ref>Diodore de Sicile, ''Bibliothèque historique'', XVI, 52, trad. P. Goukowsky, Paris, Les Belles Lettres, 1976, p. 164-165.</ref>. Aristote composa un Hymne à la Vertu en son honneur et fit ériger une statue à Delphes portant une épigramme à sa mémoire<ref>Fragments 624 et 625 (Rose), conservés par Diogène Laërce (V, 7-8) et Athénée (''Deipnosophistes'', XV, 696 a-c). Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', op. cit., p. 43-44.</ref>. Il épousa également Pythias, nièce ou fille adoptive d'Hermias, dont il aura une fille du même nom<ref>Dans son testament, Aristote prescrit que ses cendres soient mêlées à celles de Pythias. Diogène Laërce, ''Vies'', V, 16, op. cit., p. 582.</ref>.
Après la mort d'Hermias, Aristote quitte Assos pour Mytilène, sur l'île de Lesbos, en 345-344 av. J.-C. Il y poursuit pendant deux à trois ans ses observations biologiques et zoologiques, notamment sur les lagunes de Pyrrha<ref>De nombreuses observations précises de l{{'}}''Histoire des Animaux'' se rapportent à la faune de Lesbos. Voir Pierre Louis, « Introduction », dans Aristote, ''Histoire des Animaux'', tome I, Paris, Les Belles Lettres, 1964, p. XIV-XVIII.</ref>.
=== Précepteur d'Alexandre le Grand (343-336 av. J.-C.) ===
En 343-342 av. J.-C., Philippe II de Macédoine, qui avait connu Aristote dans sa jeunesse grâce à Nicomaque, appelle le philosophe à la cour de Pella pour devenir le précepteur de son fils, le jeune prince Alexandre, alors âgé de treize ans<ref>Voir Werner Jaeger, ''Aristote'', op. cit., p. 145-148.</ref><ref>Plutarque, ''Vie d'Alexandre'', 7-8, trad. R. Flacelière & É. Chambry, Paris, Les Belles Lettres, 1975, p. 33-34.</ref>. Aristote enseigne au prince pendant deux ou trois ans, probablement à Miéza<ref>Miéza était située à l'ouest de Pella, dans un environnement champêtre propice aux études. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 15-16.</ref>.
L'enseignement donné à Alexandre portait essentiellement sur la politique, l'éthique, la poésie et les lettres grecques<ref>Selon Plutarque, Aristote aurait fait connaître à Alexandre une édition annotée de l{{'}}''Iliade''. Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref><ref>Plutarque rapporte également un mot d'Alexandre selon lequel il aimait Aristote autant que son père : « si je dois la vie à l'un, je dois à l'autre de savoir bien vivre ». Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref>. Aristote composa peut-être à cette époque un traité ''Sur la Royauté'' (''Peri basileias''), aujourd'hui perdu<ref>Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', Louvain, Éditions universitaires, 1951, p. 157-158.</ref>.
Les relations entre le maître et l'élève demeurent difficiles à reconstituer avec certitude. Alors qu'Aristote, dans ses ''Politiques'', prône une distinction entre Grecs et Barbares<ref>Aristote considère, dans certains passages, que les Barbares sont naturellement faits pour être gouvernés par les Grecs. Aristote, ''Politique'', I, 2, 1252 b 5-9, trad. J. Aubonnet, Paris, Les Belles Lettres, 1960, p. 10-11.</ref>, Alexandre adopta une politique d'intégration des peuples conquis et de fusion entre Grecs et Orientaux<ref>Sur ces divergences, voir Werner Jaeger, ''Aristote'', op. cit., p. 148-152.</ref>. En 335 av. J.-C., lors du départ d'Alexandre pour la conquête de l'Asie, Aristote propose son neveu Callisthène pour l'accompagner comme conseiller et historiographe<ref>Voir Felix Jacoby, ''Die Fragmente der griechischen Historiker'', Berlin, Weidmann, 1923-1958, 124 F 1.</ref>. Callisthène, refusant d'adopter la proskynèse exigée par Alexandre, encourut sa disgrâce et fut exécuté vers 327 av. J.-C.<ref>Diogène Laërce (V, 5) et Plutarque (''Vie d'Alexandre'', 55) rapportent cette fin. Voir Diogène Laërce, ''Vies'', op. cit., p. 575-576 ; Plutarque, ''Vie d'Alexandre'', op. cit., p. 81-83.</ref>.
=== Fondation du Lycée et enseignement à Athènes (335-323 av. J.-C.) ===
En 335-334 av. J.-C., après la défaite athénienne face à la Macédoine à Chéronée (338 av. J.-C.), Aristote retourne à Athènes. Il y fonde sa propre école, le Lycée (''Lykeion''), nommé d'après le temple d'Apollon Lycien situé à proximité<ref>Le Lycée était un gymnase entouré de jardins et de promenoirs couverts (''peripatoi''), d'où le nom d'« école péripatéticienne » donné aux disciples d'Aristote. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 21-24.</ref><ref>Le site archéologique du Lycée fut découvert fortuitement en 1996 lors de travaux au centre d'Athènes. Voir Effi Lygouri, « The Lyceum of Aristotle in Athens », dans ''Acta Musei Nationalis Pragae. Series A – Historia'', 60, 1-2, 2006, p. 47-52.</ref>.
Aristote y enseigne pendant douze ou treize ans, de 335 à 323 av. J.-C., période durant laquelle il rédige la plupart des traités systématiques (''pragmateiai'') qui nous sont parvenus<ref>Ces traités, dits « acroamatiques » ou « ésotériques », étaient destinés à l'enseignement interne, par opposition aux dialogues « exotériques » écrits pour un large public. Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', op. cit., p. 3-85.</ref>. Selon Aulu-Gelle, son enseignement comportait deux modalités : le matin, des leçons approfondies sur la philosophie, la physique et la métaphysique, réservées aux disciples avancés ; l'après-midi, des cours plus accessibles de rhétorique et de dialectique, ouverts à un public plus large<ref>Aulu-Gelle, ''Nuits attiques'', XX, 5, trad. R. Marache, Paris, Les Belles Lettres, 1978, tome IV, p. 185-186.</ref>.
Aristote professait, selon la tradition, en se promenant (''peripatein'') avec ses disciples dans les allées du gymnase, d'où le nom d'école péripatéticienne donné à son école<ref>Diogène Laërce, ''Vies'', V, 2, op. cit., p. 574.</ref>. Il constitua au Lycée une bibliothèque et des collections d'histoire naturelle (animaux, plantes, minéraux, cartes géographiques)<ref>Selon Pline l'Ancien, Alexandre aurait aidé son ancien maître en lui envoyant d'Asie des spécimens zoologiques et botaniques. Pline l'Ancien, ''Histoire naturelle'', VIII, 17, trad. A. Ernout, Paris, Les Belles Lettres, 1952, p. 23. Cette tradition est cependant tardive et son authenticité est discutée.</ref>. Il entreprit également avec ses collaborateurs la rédaction des 158 Constitutions (''Politeiai'') des cités grecques et barbares, dont seule la ''Constitution d'Athènes'' nous est parvenue<ref>Cette œuvre fut probablement un travail collectif sous la direction d'Aristote. Voir Mortimer Chambers, « Aristotle's Forms of Democracy », dans ''Transactions and Proceedings of the American Philological Association'', 92, 1961, p. 20-36.</ref>.
=== Exil et mort (323-322 av. J.-C.) ===
À la mort d'Alexandre le Grand, survenue à Babylone en juin 323 av. J.-C., une réaction antimacédonienne éclate à Athènes<ref>Voir Werner Jaeger, ''Aristote'', op. cit., p. 387-390.</ref>. Aristote, en tant que métèque proche de la Macédoine, se trouve menacé<ref>En tant que métèque, Aristote n'avait jamais eu le droit de cité athénien. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 32-33.</ref>. Un certain Démophile, peut-être prêtre d'Éleusis, l'accuse d'impiété (''asebeia''), lui reprochant d'avoir composé l'Hymne à la Vertu en l'honneur d'Hermias, honneur normalement réservé aux dieux<ref>Cette accusation rappelle évidemment le procès de Socrate en 399 av. J.-C. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 346-350.</ref><ref>Diogène Laërce, ''Vies'', V, 5-6, op. cit., p. 575-576.</ref>.
Sans attendre le jugement, Aristote quitte Athènes et se réfugie à Chalcis, en Eubée, ville natale de sa mère<ref>Selon Aulu-Gelle, Aristote aurait déclaré vouloir « empêcher les Athéniens de commettre un second crime contre la philosophie », allusion au procès de Socrate. Aulu-Gelle, ''Nuits attiques'', III, 3, 10, op. cit., tome I, p. 151.</ref>. Il confie la direction du Lycée à Théophraste d'Érèse<ref>Théophraste dirigera le Lycée pendant trente-cinq ans, jusqu'en 288-287 av. J.-C. Voir Diogène Laërce, ''Vies'', V, 36-57, op. cit., p. 590-601.</ref>.
Aristote meurt à Chalcis en 322 av. J.-C., à l'âge de soixante-deux ans, probablement des suites d'une maladie d'estomac<ref>La légende d'un suicide par absorption de ciguë, rapportée par certaines sources tardives, n'est pas retenue par les historiens modernes. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 350-355.</ref><ref>Son testament, conservé par Diogène Laërce (V, 11-16), prescrit notamment que ses cendres soient mêlées à celles de sa première épouse Pythias. Voir Diogène Laërce, ''Vies'', op. cit., p. 579-582.</ref>. Ses cendres furent inhumées à Stagire<ref>Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 355-358.</ref>.
Aristote laissait deux enfants : Pythias, née de son premier mariage, destinée à épouser Nicanor, le fils adoptif du philosophe, et Nicomaque, né de son second mariage avec Herpyllis d'Assos<ref>C'est à ce dernier que fut dédiée l'''Éthique à Nicomaque'' — sans qu'il soit certain que ce titre traduise une dédicace personnelle plutôt qu'un choix éditorial postérieur. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 35-36.</ref><ref>Dans son testament, Aristote témoigne d'une grande reconnaissance envers Herpyllis. Diogène Laërce, ''Vies'', V, 12-13, op. cit., p. 580.</ref>.
== L'œuvre aristotélicienne : constitution et transmission ==
La constitution et la transmission de l'œuvre d'Aristote représentent l'un des dossiers les plus complexes de l'histoire de la philosophie antique. L'accès à la pensée du Stagirite est tributaire d'un processus historique long, marqué par des péripéties qui ont conditionné la forme sous laquelle nous lisons aujourd'hui ses écrits<ref>Pour une synthèse récente, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 5-7 ; Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>.
=== La double nature de l'œuvre aristotélicienne ===
L'œuvre d'Aristote se composait à l'origine de deux types d'écrits distincts. D'une part, les écrits exotériques (ἐξωτερικοὶ λόγοι), destinés à un public extérieur à l'école et composés sous forme de dialogues à la manière platonicienne entre 360 et 345 av. J.-C.<ref>Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 22-27.</ref>. Ces dialogues de jeunesse, dont Cicéron louait les qualités littéraires en qualifiant le style d'Aristote de « fleuve d'or » (''flumen aureum'')<ref>Cicéron, ''Academica'', II, 38, 119.</ref>, comprenaient notamment le ''Gryllos ou De la rhétorique'', l'''Eudème ou De l'âme'' sur l'immortalité de l'âme, le ''Protreptique'' et le traité ''Sur la philosophie''<ref>Fragments rassemblés dans V. Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886.</ref>. Ces œuvres ne nous sont parvenues que sous forme de fragments.
D'autre part, les écrits acroamatiques ou ésotériques (ἀκροαματικοί, ἐσωτερικοί), réservés aux disciples du Lycée et destinés à un usage interne à l'école<ref>Sur cette distinction, voir Aulu-Gelle, ''Nuits attiques'', XX, 5 ; Plutarque, ''Vie d'Alexandre'', 7.</ref>. Ces textes constituent l'essentiel du corpus aristotélicien tel que nous le connaissons aujourd'hui. Ils prennent vraisemblablement la forme de notes de cours, de résumés ou de mémoires de recherche élaborés par Aristote et ses collaborateurs. Selon Pierre Pellegrin, on pourrait considérer en termes modernes que « le texte aristotélicien que nous lisons aujourd'hui est plutôt le compte-rendu d'un séminaire donné par Aristote, qu'un ouvrage rédigé en bonne et due forme »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>.
=== Le sort de la bibliothèque d'Aristote ===
L'histoire de la transmission est intimement liée au destin de la bibliothèque personnelle d'Aristote. À sa mort en 322 av. J.-C., Aristote légua sa bibliothèque à son successeur à la tête du Lycée, Théophraste d'Érèse<ref>Diogène Laërce, ''Vies'', V, 51-52.</ref>. Selon le récit de Strabon, à la mort de Théophraste vers 288 av. J.-C., la bibliothèque fut léguée à Nélée de Scepsis, fils de Coriscos et disciple d'Aristote et de Théophraste<ref>Strabon, ''Géographie'', XIII, 1, 54 (608-609 C) ; voir aussi Plutarque, ''Sylla'', 26, 1-3.</ref>.
Nélée, en quittant Athènes pour retourner à Scepsis en Troade, emporta avec lui les manuscrits autographes d'Aristote et de Théophraste. Ses descendants, peu instruits selon Strabon, auraient caché ces livres dans une cave pour éviter qu'ils ne soient confisqués par les rois Attalides de Pergame<ref>Strabon, ''Géographie'', XIII, 1, 54.</ref>. Les ouvrages auraient ainsi été enfouis pendant près de deux siècles. Ce récit de Strabon, longtemps accepté tel quel, est aujourd'hui partiellement contesté : la recherche moderne souligne qu'il ne faut pas conclure de la dispersion d'une partie des manuscrits autographes que les œuvres d'Aristote auraient été totalement inaccessibles avant Andronicos<ref>Voir P. Moraux, ''Der Aristotelismus bei den Griechen'', vol. I, Berlin-New York, De Gruyter, 1973, p. 3-31. La critique moderne souligne que les philosophes hellénistiques (stoïciens, épicuriens) connaissaient et discutaient certaines thèses aristotéliciennes, ce qui suppose un accès au moins partiel aux écrits du Stagirite.</ref>.
Ce n'est qu'au début du Ier siècle av. J.-C. que ces textes furent redécouverts et achetés par Apellicon de Téos, un riche bibliophile athénien<ref>Athénée, ''Deipnosophistes'', V, 214d = Posidonios, FGrHist 87 F 36.</ref>. Apellicon entreprit de restaurer les manuscrits endommagés, mais aurait, selon Strabon, commis de nombreuses erreurs en comblant les lacunes<ref>Strabon, ''Géographie'', XIII, 1, 54.</ref>.
=== Le transfert à Rome et l'édition d'Andronicos ===
En 86 av. J.-C., lors de la prise d'Athènes, le général Sylla s'empara de la bibliothèque d'Apellicon et la fit transporter à Rome<ref>Plutarque, ''Sylla'', 26, 2 ; Strabon, ''Géographie'', XIII, 1, 54.</ref>. À Rome, ces manuscrits furent confiés au grammairien Tyrannion d'Amisos<ref>Strabon, ''Géographie'', XIII, 1, 54 ; Cicéron, ''Lettres à Atticus'', IV, 10, 1.</ref>.
C'est finalement Andronicos de Rhodes, onzième scholarque du Lycée et philosophe péripatéticien actif vers 60 av. J.-C., qui établit la première édition systématique des œuvres d'Aristote et de Théophraste<ref>Porphyre, ''Vie de Plotin'', 24 ; voir aussi David l'Arménien, ''Prolégomènes'', CAG XVIII, 2, p. 32-33.</ref>. Andronicos ne se contenta pas de publier les textes : il les organisa selon un ordre thématique probablement différent de celui voulu par Aristote, en regroupant les traités par affinité de contenu. La division traditionnelle du corpus en écrits logiques (réunis plus tard sous le titre d'Organon), physiques, biologiques, métaphysiques, éthiques et politiques en résulte<ref>Voir Simplicius, ''In Categorias'', CAG VIII, p. 4, 28-5, 4 ; Alexandre d'Aphrodise, ''In Metaphysica'', CAG I, p. 171, 5-8.</ref>. Comme le souligne Pellegrin, Andronicos « a uni des passages qui étaient originairement disjoints, gommé des contradictions, ménagé des transitions », et il a probablement « introduit dans le texte des matériaux issus de discussions et de critiques » faites en marge des cours du Lycée<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>.
C'est également à Andronicos que l'on doit le titre de Métaphysique (τὰ μετὰ τὰ φυσικά), qui signifie littéralement « ce qui vient après les [livres] physiques »<ref>Voir ''Métaphysique'', éd. W.D. Ross, Oxford, Clarendon Press, 1924, vol. I, p. XXXII-XLIII ; Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Aristote lui-même n'utilisait jamais ce terme, préférant parler de « philosophie première » (πρώτη φιλοσοφία) ou de « science théologique » (θεολογική)<ref>Aristote, ''Métaphysique'', E (VI), 1, 1026a19-23 ; K (XI), 7, 1064b1-3.</ref>.
=== Les conséquences pour notre accès au texte ===
Cette histoire éditoriale a eu des conséquences majeures pour notre connaissance de la pensée d'Aristote. La perte quasi totale des écrits exotériques nous prive d'un pan de son œuvre, celui qui était le mieux connu dans l'Antiquité<ref>Sur l'« autre » Aristote perdu, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>. L'état fragmentaire des manuscrits retrouvés et leur restauration introduisent des incertitudes textuelles. L'organisation systématique imposée par Andronicos, bien qu'elle ait permis la préservation et la diffusion de l'œuvre, ne correspond probablement pas à l'ordre de composition ni à l'organisation originelle voulue par Aristote.
La reconstruction d'une chronologie relative des œuvres pose des difficultés méthodologiques. Werner Jaeger, dans son ouvrage ''Aristoteles. Grundlegung einer Geschichte seiner Entwicklung'' (1923), a proposé de dater les textes selon leur plus ou moins grande proximité avec le platonisme<ref>Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', op. cit.</ref>. Cette « approche génétique » a été largement critiquée et n'est plus acceptée dans son ensemble : le « degré de platonicité » d'un texte est difficile à évaluer, et le corpus aristotélicien se prête mal aux examens stylométriques utilisés pour le corpus platonicien<ref>Pour une critique de l'approche génétique de Jaeger, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6-8 ; Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction. La recherche actuelle aborde l'œuvre comme un tout cohérent sans pour autant la juger systématique.</ref>.
Le texte d'Aristote tel que nous le connaissons est ainsi le produit d'une longue chaîne de transmission, qui passe par les commentateurs néoplatoniciens (Alexandre d'Aphrodise, Simplicius, Philopon), la tradition arabe médiévale (Al-Fârâbî, Avicenne, Averroès), puis la redécouverte occidentale à partir du XIIIe siècle<ref>Pour l'histoire de la transmission médiévale, voir F.E. Peters, ''Aristoteles Arabus'', Leiden, Brill, 1968 ; L. Minio-Paluello, ''Opuscula. The Latin Aristotle'', Amsterdam, Hakkert, 1972.</ref>.
== Aristote et Platon : continuité et rupture ==
La relation entre Aristote et Platon a fait l'objet d'interprétations divergentes dans l'histoire de la philosophie. Les commentateurs néoplatoniciens, de Porphyre à Simplicius, ont insisté sur l'harmonie fondamentale entre les deux philosophes<ref>Simplicius, ''In Categorias'', CAG VIII, éd. K. Kalbfleisch, Berlin, Reimer, 1907, p. 7, 23-32.</ref>. À l'inverse, une partie de la tradition occidentale, depuis la Renaissance, a mis l'accent sur leurs divergences. Coleridge résume cette opposition dans la formule : « Tout homme est né aristotélicien ou platonicien »<ref>Samuel Taylor Coleridge, ''Table Talk'', 2 juillet 1830, dans ''The Table Talk and Omniana of Samuel Taylor Coleridge'', Londres, Oxford University Press, 1917, p. 90.</ref>.
La recherche contemporaine privilégie une approche plus nuancée, qui examine simultanément les points de continuité et de rupture. Aristote s'oppose à Platon sur des questions ontologiques fondamentales, tout en demeurant tributaire de l'héritage académicien. Comme il l'écrit lui-même : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096a11-17, trad. J. Tricot, op. cit., p. 44.</ref>.
=== La critique aristotélicienne des Idées platoniciennes ===
==== Le rejet de la séparation (''chôrismos'') ====
L'un des points de rupture entre Aristote et Platon concerne le statut ontologique des Idées ou Formes (''eidos''). Pour Platon, les Idées constituent un monde intelligible séparé (''chôristos'') du monde sensible. Elles sont immuables, éternelles, et possèdent une existence autonome et transcendante. Les choses sensibles ne sont que des copies imparfaites qui participent (''methexis'') aux Idées ou les imitent (''mimêsis'')<ref>Platon, ''Phédon'', 74a-75d, 100c-102a ; ''République'', VI, 509d-511e, trad. É. Chambry, Paris, Les Belles Lettres, 1932-1934.</ref>. Dans le ''Phédon'', Platon affirme ainsi que « rien d'autre ne rend belle une chose que la présence ou la communion (on ne sait comment elle se fait) avec le Beau en soi »<ref>Platon, ''Phédon'', 100d, trad. M. Dixsaut, Paris, Flammarion, 1991, p. 315.</ref>.
Aristote refuse cette séparation des Idées. Dans la ''Métaphysique'', il consacre plusieurs chapitres à une critique systématique de la théorie platonicienne<ref>Aristote, ''Métaphysique'', A, 6, 987a29-988a17 ; A, 9, 990a34-993a10 ; M, 4-5, 1078b7-1080a11 ; N, 2, 1088b35-1090a2.</ref>. Ses objections portent sur trois points principaux<ref>Pour une analyse détaillée de ces critiques, voir Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', Londres-New York, Routledge, 2004, chap. 3-4.</ref>.
Premièrement, l'inutilité explicative des Idées séparées. Aristote soutient que les Idées ne peuvent rendre compte ni de l'existence ni du devenir des choses sensibles : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est prononcer des mots vides et faire des métaphores poétiques »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22, trad. J. Tricot, Paris, Vrin, 1953, t. I, p. 61.</ref>. Les Idées platoniciennes, étant immobiles et éternelles, ne peuvent expliquer le mouvement et le changement observés. Selon Aristote, Platon n'a pas identifié la cause efficiente (''archê tês kinêseôs'')<ref>Aristote, ''Métaphysique'', A, 9, 992a24-29.</ref>.
Deuxièmement, l'argument du « Troisième Homme ». Aristote reprend ici une objection déjà formulée dans le ''Parménide'' de Platon lui-même<ref>Platon, ''Parménide'', 132a-b.</ref>. Si l'on postule une Idée séparée de l'Homme pour expliquer ce que plusieurs hommes ont en commun, alors on doit également postuler une troisième Idée pour expliquer ce que l'Idée de l'Homme et les hommes particuliers ont en commun, et ainsi à l'infini<ref>Aristote, ''Métaphysique'', A, 9, 990b15-17 ; Z, 13, 1039a2-3 ; ''De la Sophistique'', 22, 178b36-179a10.</ref>.
Troisièmement, le dédoublement inutile du monde. Postuler un monde intelligible d'Idées séparées revient, selon Aristote, à « doubler les difficultés » sans les résoudre<ref>Aristote, ''Métaphysique'', A, 9, 990b1-4.</ref>. « Les Platoniciens font exister autant de substances séparées qu'il y a de choses naturelles, comme si quelqu'un, voulant compter des objets, estimait qu'il ne le pourrait pas quand ils sont en petit nombre, et croyait y parvenir en les multipliant »<ref>Aristote, ''Métaphysique'', A, 9, 990b4-8, trad. J. Tricot, op. cit., p. 60.</ref>.
==== L'hylémorphisme aristotélicien ====
À la théorie platonicienne de la participation, Aristote oppose la théorie hylémorphique. Selon cette conception, les êtres sensibles ne sont pas des copies imparfaites d'Idées transcendantes, mais des composés (''sunolon'') de matière (''hulê'') et de forme (''morphê'' ou ''eidos'')<ref>Aristote, ''Métaphysique'', Z, 3, 1029a1-7 ; H, 1-3, 1042a24-1043b23 ; ''Physique'', II, 1-2, 192b8-194a12.</ref>.
La forme aristotélicienne n'est pas séparée des choses sensibles : elle est immanente à la matière qu'elle informe. La forme du cheval n'existe pas dans un monde intelligible séparé, mais uniquement dans les chevaux individuels concrets. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence (''to ti ên einai'')<ref>Aristote, ''Métaphysique'', Z, 4-6, 1029b13-1031b14 ; Z, 7, 1032b1-2.</ref>. « Par forme, j'entends l'essence de chaque chose et sa substance première »<ref>Aristote, ''Métaphysique'', Z, 7, 1032b1-2, trad. J. Tricot, op. cit., t. I, p. 372.</ref>.
Cette conception hylémorphique permet de répondre à plusieurs problèmes posés par la théorie platonicienne. Elle explique le devenir : la génération d'une substance est le passage de la puissance (''dunamis'') à l'acte (''energeia''), l'actualisation d'une forme dans une matière. Elle sauvegarde l'individualité des substances premières, c'est-à-dire des individus concrets (''tode ti'')<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 13, 1038b23-1039a3.</ref>. Elle unifie enfin forme et finalité : la forme est à la fois cause formelle et cause finale, ce vers quoi tend le développement naturel de la chose<ref>Aristote, ''Physique'', II, 1, 193b12-13 ; II, 7, 198a24-27.</ref>.
=== La critique de la participation et de l'imitation ===
Platon utilise principalement deux concepts pour expliquer la relation entre les choses sensibles et les Idées : la participation (''methexis'') et l'imitation (''mimêsis''). Aristote critique ces notions, qu'il juge métaphoriques et non explicatives<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22 ; M, 5, 1079b24-26.</ref>.
La notion de participation pose des problèmes conceptuels que Platon lui-même a identifiés dans le ''Parménide''<ref>Platon, ''Parménide'', 130e-134e.</ref>. Si l'Idée tout entière est présente en chaque chose qui y participe, alors l'Idée se trouve séparée d'elle-même. Mais si c'est seulement une partie de l'Idée qui est présente en chaque chose, alors l'Idée se divise<ref>Platon, ''Parménide'', 131a-e.</ref>.
Selon Aristote, Platon n'a pas résolu ces difficultés : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est ne rien dire, car participer, qu'est-ce que c'est ? »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-21.</ref>. Pour Aristote, « ce que les Pythagoriciens appelaient "imitation", les Platoniciens l'ont appelé "participation", mais tous se bornent à changer le nom sans expliquer ce que peut bien être cette participation ou cette imitation des Idées »<ref>Aristote, ''Métaphysique'', A, 6, 987b10-13, trad. J. Tricot, op. cit., t. I, p. 49.</ref>.
Pour Aristote, la ressemblance entre les individus d'une même espèce s'explique par la possession d'une même forme immanente, transmise dans la génération naturelle : « L'homme engendre l'homme » (''anthrôpos anthrôpon genna'')<ref>Aristote, ''Métaphysique'', Z, 7, 1032a25 ; Z, 8, 1033b32-1034a2 ; Λ, 3, 1070a8.</ref>. Trois facteurs interviennent dans la génération : la matière (fournie par la femelle, selon Aristote), la forme (transmise par le mâle) et la privation (l'absence initiale de la forme dans la matière)<ref>Aristote, ''Physique'', I, 7, 190b10-191a7 ; ''De la Génération des Animaux'', I, 20-21, 729a9-730a32. Cette doctrine de la « contribution » respective des sexes reflète des préjugés de l'époque qu'il importe de signaler ; voir, pour une mise au point critique, Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021.</ref>.
=== Substance, essence et ''ousia'' ===
Le terme grec ''ousia'', traduit en latin par ''substantia'' ou ''essentia'', possède des significations différentes chez Platon et Aristote. Comme le note Pellegrin, ''ousia'' est en fait « difficile à traduire, car le terme représente, chez Aristote, trois choses différentes : la forme, la matière, et le composé des deux »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Ousia / Substance », p. 175-176, citant ''Métaphysique'', Z, 3, 1029a27-33.</ref>.
Chez Platon, l{{'}}''ousia'' désigne principalement l'Idée, la réalité véritable, immuable et éternelle, par opposition aux choses sensibles<ref>Platon, ''Phédon'', 78c-d ; ''République'', V, 477a-478e ; VI, 484b-486d.</ref>. Chez Aristote, l{{'}}''ousia'' désigne avant tout, dans les ''Catégories'', la substance première : l'individu concret qui existe par lui-même<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 3, 1028b33-1029a7.</ref>. Aristote distingue alors la substance première de la substance seconde, qui désigne l'espèce ou le genre auquel appartient l'individu<ref>Aristote, ''Catégories'', 5, 2a14-17.</ref>.
Le rapport entre cette doctrine des ''Catégories'' et la théorie de la substance développée dans les livres centraux de la ''Métaphysique'' (Z, H, Θ) est l'un des points les plus discutés de l'aristotélisme contemporain. Annick Jaulin souligne que la « doctrine » aristotélicienne de la substance n'est pas une donnée stabilisée mais l'objet d'une recherche : Aristote « invente une théorie de la forme qui intègre le mouvement »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Dans la ''Métaphysique'', la forme (''eidos'') apparaît comme le meilleur candidat au titre de substance, mais cette identification soulève à son tour la question de l'unité du composé hylémorphique<ref>Pour un panorama des débats, voir Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', Stuttgart, Metzler, 2011, chap. IV.18 ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 5-7.</ref>. Comme le résume Pellegrin, « ''ousia'' signifie donc la chose (la substance) et ses causes internes, la matière et la forme ; la forme est ce qui correspond à l'essence »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 176.</ref>.
=== Éléments de continuité entre Platon et Aristote ===
Au-delà des divergences ontologiques, Platon et Aristote partagent plusieurs convictions communes. La première est la primauté de la forme sur la matière dans l'ordre de l'intelligibilité, de la réalité et de la perfection. Pour Platon comme pour Aristote, la matière pure, prise en elle-même, est indéterminée<ref>Platon, ''Timée'', 49a-52d ; Aristote, ''Métaphysique'', Z, 10, 1036a8-9.</ref>.
La deuxième est la finalité dans la nature. Platon présente le cosmos comme l'œuvre d'un Démiurge qui organise la matière en regardant vers les Idées<ref>Platon, ''Timée'', 28a-30c.</ref>. Aristote intériorise et naturalise cette téléologie : la nature elle-même agit en vue d'une fin (''hê phusis heneka tou poiei''), sans qu'il soit besoin de postuler un Démiurge extérieur ou des Idées transcendantes<ref>Aristote, ''Physique'', II, 8, 198b10-199a8 ; ''Des Parties des Animaux'', I, 1, 639b14-640a9. Pour une discussion détaillée de la téléologie aristotélicienne, voir Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012 ; James G. Lennox, ''Aristotle's Philosophy of Biology'', Cambridge, Cambridge University Press, 2001.</ref>.
La troisième est la connaissance par les causes : pour les deux philosophes, la véritable connaissance scientifique consiste à connaître les causes (''aitiai'') des choses<ref>Platon, ''Phédon'', 96a-99d ; Aristote, ''Physique'', II, 3, 194b16-195b30 ; ''Seconds Analytiques'', I, 13, 78a22-b4.</ref>. Aristote reproche cependant à Platon d'avoir négligé la cause efficiente et la cause finale<ref>Aristote, ''Métaphysique'', A, 6, 988a8-17 ; A, 9, 992a24-29 ; Λ, 10, 1075b37-1076a4.</ref>.
La quatrième concerne la définition et l'universel. Platon et Aristote s'accordent sur le fait que la définition (''horismos'' ou ''logos'') porte sur l'universel et non sur le particulier<ref>Platon, ''Théétète'', 201c-210b ; Aristote, ''Métaphysique'', Z, 15, 1039b27-1040a7.</ref>. Mais Aristote opère une distinction fondamentale entre l'ordre de l'être (où le particulier est premier) et l'ordre de la connaissance (où l'universel est premier)<ref>Aristote, ''Métaphysique'', Z, 13, 1038b8-16 ; ''Seconds Analytiques'', I, 2, 71b33-72a5.</ref>.
=== La dialectique et le rôle de l'expérience sensible ===
Platon et Aristote sont tous deux héritiers de la méthode dialectique inaugurée par Socrate, qui consiste à examiner les opinions par le dialogue argumenté<ref>Platon, ''République'', VII, 533c-534e ; Aristote, ''Topiques'', I, 1-2, 100a18-101b4.</ref>. Aristote conserve cette approche : il commence presque toujours par recenser les opinions des prédécesseurs (''doxographia''), examine les difficultés (''aporiai''), avant de proposer sa propre solution<ref>Aristote, ''Éthique à Nicomaque'', VII, 1, 1145b2-7.</ref>. Cependant, pour Aristote, la dialectique est un outil préparatoire et non une science apodictique<ref>Aristote, ''Topiques'', I, 2, 101a25-b4 ; ''Métaphysique'', Γ, 2, 1004b17-26.</ref>.
Une divergence importante porte sur le rôle de l'expérience sensible. Pour Platon, les sens nous maintiennent dans l'opinion (''doxa'')<ref>Platon, ''Phédon'', 66b ; ''République'', VII, 514a-517c.</ref>. Aristote accorde au contraire une place fondamentale à l'expérience sensible : la science porte sur l'universel, mais cet universel est abstrait à partir des données sensibles par un processus d'induction (''epagôgê'')<ref>Aristote, ''Seconds Analytiques'', II, 19, 100b3-5, trad. J. Tricot, Paris, Vrin, 1947, p. 242 ; ''De l'Âme'', III, 8, 432a3-10.</ref>.
=== Bilan : continuité et rupture ===
Une partie de l'historiographie contemporaine décrit l'aristotélisme comme une reformulation immanentiste des problèmes hérités du platonisme : la forme « descend » du ciel des Idées pour s'incarner dans les choses, le Bien se réalise dans l'accomplissement de la nature propre de chaque être, la philosophie reconnaît que seuls existent les individus concrets dans lesquels l'universel se réalise. Cette caractérisation, parfois résumée par l'expression « naturalisation du platonisme », demeure toutefois une thèse interprétative dont la portée varie selon les commentateurs ; elle ne fait pas consensus dans la recherche universitaire et doit être attribuée à des travaux secondaires précis<ref>Cette interprétation est défendue notamment par certains chercheurs proches de la tradition de Pierre Aubenque ; voir ''Le problème de l'être chez Aristote'', Paris, PUF, 1962. D'autres travaux, notamment Annick Jaulin, ''Aristote. La métaphysique'', op. cit., insistent au contraire sur l'originalité radicale de la démarche aristotélicienne et son enracinement dans la tradition des penseurs de la nature, plus que dans une « naturalisation » du platonisme.</ref>.
Plus généralement, la querelle entre Platon et Aristote est l'une des plus discutées de l'histoire de la métaphysique occidentale. La tradition philosophique ultérieure n'a jamais tranché définitivement, oscillant entre tentatives de conciliation (néoplatoniciens, Thomas d'Aquin) et radicalisations de l'opposition (nominalistes médiévaux, empiristes modernes).
== La logique : l'Organon ==
=== Les Catégories – Les genres suprêmes de l'être ===
==== La classification première de la réalité ====
Aristote propose, dans le traité des ''Catégories'', une doctrine selon laquelle toute chose qui se dit relève de l'un des « genres suprêmes » (''katêgoriai''). Le terme ''katêgoria'' signifie littéralement « prédicat » ou « attribution »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Catégorie », p. 41-42.</ref>. Comme le souligne Pellegrin, lorsque Aristote parle des « genres de l'être », il « n'emploie pas le terme "genre" en son sens technique habituel », car il pose des termes « qui peuvent être affirmés des différentes réalités sans pouvoir être subsumés sous une attribution plus haute »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 41.</ref>.
Aristote présente une liste canonique de dix catégories. « Chacun des termes qui sont dits sans aucune combinaison », écrit-il, « indique soit une substance (''ousia''), soit une certaine quantité (''poson''), soit une certaine qualité (''poion''), soit un rapport à quelque chose (''pros ti''), soit quelque part (''pou''), soit un certain moment (''pote''), soit être dans une position (''keisthai''), soit posséder (''echein''), soit faire (''poiein''), soit subir (''paschein'') »<ref>Aristote, ''Catégories'', 4, 1b25-27, trad. R. Bodéüs, Les Belles Lettres, Paris, 2001.</ref>.
Ces catégories peuvent être illustrées par les exemples qu'Aristote donne lui-même : la substance désigne ce qu'est un être (un homme, un cheval) ; la quantité, l'extension (long de deux coudées) ; la qualité, la nature (blanc, instruit) ; la relation, un rapport (double, moitié) ; le lieu (au Lycée) ; le temps (hier) ; la position (couché, assis) ; la possession (être chaussé, être armé) ; l'action et la passion (couper ou être coupé)<ref>Aristote, ''Catégories'', 4, 1b25-2a10. Voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 41.</ref>.
Il convient de noter que la liste de dix catégories n'est pas systématiquement reprise par Aristote dans tous ses traités. Comme le note Pellegrin, « Aristote n'a nulle part établi qu'il s'agissait là d'un nombre fixe et définitif »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 41.</ref>. Par ailleurs, l'authenticité même du traité des ''Catégories'' a été discutée dans l'Antiquité, sa tonalité tranchant parfois avec le reste du corpus, même si sa doctrine est jugée authentiquement aristotélicienne par la majorité des commentateurs.
==== La primauté ontologique de la substance ====
Parmi les dix catégories, l'une occupe une place privilégiée : la substance. « La substance est ce qui se dit proprement, premièrement et avant tout ; ce qui à la fois ne se dit pas d'un certain sujet et n'est pas dans un certain sujet ; par exemple tel homme ou tel cheval »<ref>Aristote, ''Catégories'', 5, 2a11-14, trad. R. Bodéüs, op. cit.</ref>.
Toutes les autres catégories présupposent l'existence de la substance. On ne peut concevoir une couleur sans un corps coloré, une grandeur sans quelque chose de grand, une action sans un agent. « Tous les autres termes, ou bien se disent de sujets qui sont les substances premières, ou bien sont dans des sujets qui sont ces mêmes substances »<ref>Aristote, ''Catégories'', 5, 2a34-2b6.</ref>. Si les substances premières n'existaient pas, rien d'autre ne pourrait exister : la substance est le substrat ultime (''hypokeimenon''), ce dont tout se dit mais qui n'est dit de rien d'autre<ref>Aristote, ''Métaphysique'', Z, 3, 1028b36-37, trad. J. Tricot, Vrin, Paris, 1953.</ref>.
==== Substance première et substance seconde ====
Aristote introduit une distinction au sein même de la notion de substance. À côté de la substance première, il reconnaît l'existence de substances secondes (''deuterai ousiai'')<ref>Aristote, ''Catégories'', 5, 2a14-17.</ref>.
La substance première désigne l'individu concret : tel homme, tel cheval. Elle possède une double caractéristique négative : elle n'est ni dite d'un sujet, ni dans un sujet. Les substances premières sont des individus numériquement uns (''arithmôi hen''), des « ceci » (''tode ti'') déterminés et séparés<ref>J. Brun, ''Aristote et le Lycée'', PUF, « Que sais-je ? », Paris, 1961, p. 95-96.</ref>.
Les substances secondes, en revanche, sont les espèces et les genres auxquels appartiennent les substances premières. L'homme (espèce) et l'animal (genre) sont des substances secondes parce qu'ils se disent des substances premières. Aristote précise que « parmi les substances secondes, l'espèce est plus substance que le genre, car elle est plus proche de la substance première »<ref>Aristote, ''Catégories'', 5, 2b7-8.</ref>.
Le rapport entre cette doctrine de la substance et celle des livres centraux de la ''Métaphysique'' (Z, H) fait l'objet de débats interprétatifs : la substance première des ''Catégories'' (l'individu concret) ne coïncide pas exactement avec la « substance » des livres centraux, où la forme (''eidos'') est souvent identifiée comme substance première<ref>Sur cette question, voir Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', op. cit., chap. IV.18 ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 7.</ref>.
==== Les propriétés caractéristiques de la substance ====
Aristote dégage plusieurs propriétés permettant d'identifier la substance et de la distinguer des accidents. Premièrement, toute substance n'est pas dans un sujet<ref>Aristote, ''Catégories'', 5, 3a7-21.</ref>. Deuxièmement, la substance et ses différences se disent de façon synonyme (''sunônuma'')<ref>Aristote, ''Catégories'', 5, 3a33-3b9.</ref>. Troisièmement, toute substance « indique un certain ceci » (''tode ti''), même si les substances secondes désignent plutôt « une certaine sorte d'objet » (''poion ti'')<ref>Aristote, ''Catégories'', 5, 3b10-21.</ref>. Quatrièmement, la substance n'admet pas le plus ou le moins<ref>Aristote, ''Catégories'', 5, 3b33-4a9.</ref>. Enfin, et surtout, la substance est capable de recevoir les contraires tout en restant la même et numériquement une<ref>Aristote, ''Catégories'', 5, 4a10-21.</ref>.
==== Catégories, langage et débats interprétatifs ====
La doctrine des catégories établit un lien étroit entre l'ontologie et le langage : les catégories sont à la fois des divisions de l'être et des types de prédication. Aristote l'affirme explicitement : « l'être se dit en autant de sens qu'il y a de catégories »<ref>Aristote, ''Métaphysique'', Δ, 7, 1017a22-24.</ref>.
L'objet même des catégories a fait l'objet de débats considérables, déjà dans l'Antiquité. Selon Pellegrin, « il est en tout cas tentant de considérer que les catégories sont à l'intersection d'une analyse logique du discours et d'une décomposition ontologique de la réalité »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 41-42.</ref>. Friedrich Trendelenburg les a interprétées comme une réflexion sur la grammaire grecque, faisant correspondre les quatre premières catégories aux noms et adjectifs, les quatre dernières aux verbes, les deux intermédiaires aux adverbes ; Thomas d'Aquin les considère, à l'inverse, comme des genres d'être<ref>Sur ces interprétations divergentes, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 41.</ref>. La recherche contemporaine a maintenu et approfondi ces désaccords, qui portent sur l'objet même des catégories, leur méthode de génération et leur rapport à la métaphysique<ref>Pour un état de la question, voir l'entrée « Aristotle's Categories » de la ''Stanford Encyclopedia of Philosophy''.</ref>.
==== L'unité problématique de l'être ====
La doctrine des catégories soulève une difficulté : si l'être se dit en plusieurs sens irréductibles, comment préserver l'unité de son concept ? L'être n'est pas un genre au sens propre, car un genre possède une définition unique qui s'applique uniformément à toutes ses espèces<ref>Aristote, ''Métaphysique'', B, 3, 998b22.</ref>.
La solution aristotélicienne consiste à reconnaître que l'être est dit selon une pluralité ordonnée. Bien que l'être n'ait pas un sens univoque, ses différentes acceptions ne sont pas non plus purement équivoques : elles se rapportent toutes à un terme premier, la substance. « L'être se dit en multiples acceptions, mais toujours relativement à un terme unique, à une nature déterminée »<ref>Aristote, ''Métaphysique'', Γ, 2, 1003a33-b10.</ref>. Selon une formule reprise par Pierre Aubenque, c'est ce que la tradition appellera l'analogie de l'être ou, dans la terminologie des commentateurs anglo-saxons, la « signification focale » (''focal meaning'') de la substance<ref>P. Aubenque, ''Le problème de l'être chez Aristote'', PUF, Paris, 1962, p. 178-195. La notion de ''focal meaning'' a été élaborée par G.E.L. Owen ; voir les commentaires de Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 176.</ref>.
=== Le ''De interpretatione'' – Le jugement et la proposition ===
Le ''De interpretatione'' (''Peri hermeneias'') constitue le deuxième traité de l'Organon aristotélicien. Aristote y examine la structure du discours déclaratif, les conditions du jugement et les rapports entre langage, pensée et réalité<ref>Aristote, ''De l'interprétation'', 1, 16a3-8, trad. J. Tricot, Paris, Vrin, 1969, p. 77. Sur ce traité et les débats interprétatifs récents, voir Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', Paris, Vrin, 2009.</ref>.
==== Le langage comme système symbolique ====
Aristote ouvre son traité par une réflexion sur le statut du langage. Les sons émis par la voix (''ta en tè phonè'') sont, écrit-il, les symboles (''symbola'') des affections de l'âme (''ta en tè psychè pathèmata''), et les mots écrits sont à leur tour les symboles des mots prononcés<ref>Aristote, ''De l'interprétation'', 1, 16a3-8.</ref>. Cette conception stratifiée établit trois niveaux : les choses (''pragmata''), les états de l'âme, et les signes vocaux ou écrits.
Cette théorie sémiotique présente plusieurs caractéristiques. Elle affirme le caractère conventionnel (''kata synthèkèn'') du rapport entre signifiant linguistique et signifié mental : « De même que l'écriture n'est pas la même pour tous les hommes, les mots parlés ne sont pas non plus les mêmes, alors que les états de l'âme dont ces expressions sont immédiatement les signes sont identiques chez tous »<ref>''Ibid.'', 16a5-8.</ref>. La diversité des langues manifeste le caractère artificiel du lien entre ''phonè'' et ''pathèma'', tandis que l'universalité supposée des états mentaux et leur rapport de ressemblance (''homoiômata'') avec les choses fonderait la possibilité d'une communication véridique.
Cette analyse permet à Aristote de prendre ses distances avec la position cratylienne d'une justesse naturelle des noms : le langage signifie d'abord les concepts par lesquels nous appréhendons l'être<ref>Voir Pierre Aubenque, ''Le problème de l'être chez Aristote'', op. cit., p. 100-110.</ref>.
==== Les éléments du discours déclaratif : nom et verbe ====
Avant d'examiner la proposition proprement dite, Aristote analyse ses constituants élémentaires. Le nom (''onoma'') est défini comme « un son vocal possédant une signification conventionnelle, sans référence au temps, et dont aucune partie, prise isolément, n'est significative par elle-même »<ref>Aristote, ''De l'interprétation'', 2, 16a19-21.</ref>. Cette définition insiste sur quatre caractères : la nature sonore (''phonè''), la signification conventionnelle, l'atemporalité, et l'absence de signification des parties prises isolément.
Aristote précise que « rien n'est par nature un nom, mais seulement quand il devient symbole »<ref>''Ibid.'', 16a27-28.</ref>. Il mentionne également les noms indéfinis (''aoriston onoma''), comme « non-homme »<ref>''Ibid.'', 2, 16a30-32.</ref>.
Le verbe (''rhèma'') se distingue du nom par deux caractères spécifiques : « Le verbe est ce qui ajoute à sa propre signification celle du temps ; aucune de ses parties n'est significative prise séparément, et il indique toujours quelque chose d'affirmé de quelque chose d'autre »<ref>''Ibid.'', 3, 16b6-8.</ref>. La consignification du temps (''prosèmainei chronon'') fait du verbe l'élément qui ancre le discours dans la temporalité.
Le verbe « être » occupe une position singulière. Pris en lui-même, « être ou ne pas être n'est pas un signe de la chose réelle, pas même si tu dis 'étant' tout court ; car en soi, ce n'est rien, mais il consignifie une certaine composition qu'on ne peut concevoir sans les composants »<ref>''Ibid.'', 3, 16b22-25.</ref>. Cette remarque suggère que le verbe « être », dans sa fonction copulative, signifie l'acte même de liaison ou de synthèse (''synthesis'') entre le sujet et le prédicat<ref>Voir Octave Hamelin, ''Le système d'Aristote'', Paris, Vrin, 1920, p. 159-160 ; pour une discussion contemporaine, Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', op. cit.</ref>.
==== La proposition déclarative (''logos apophantikos'') ====
Tout discours (''logos'') n'est pas une proposition. Aristote définit la proposition déclarative (''logos apophantikos'') comme « le discours en lequel réside le vrai ou le faux »<ref>Aristote, ''De l'interprétation'', 4, 17a2-3.</ref>. C'est l'énoncé qui « manifeste » (''apophainein'') un état de choses et peut être confronté à la réalité.
La proposition élémentaire se divise en affirmation (''kataphasis'') et négation (''apophasis''). L'affirmation est « la déclaration de quelque chose au sujet de quelque chose » (''apophansis tinos kata tinos''), tandis que la négation est « la déclaration de quelque chose séparé de quelque chose » (''apophansis tinos apo tinos'')<ref>''Ibid.'', 5, 17a25-26.</ref>.
Aristote insiste sur le fait que l'affirmation et la négation concernent la liaison ou la séparation d'un sujet et d'un prédicat. C'est précisément cette opération de composition (''synthesis'') ou de division (''diairesis'') qui rend possible la vérité ou la fausseté. Comme Aristote l'expliquera dans la ''Métaphysique'', « dire que ce qui est est et que ce qui n'est pas n'est pas, c'est le vrai ; dire que ce qui est n'est pas ou que ce qui n'est pas est, c'est le faux »<ref>Aristote, ''Métaphysique'', Γ (IV), 7, 1011b26-27.</ref>.
==== Quantité et qualité des propositions ====
Aristote distingue les propositions selon leur quantité (universelles, particulières, singulières, indéterminées) et leur qualité (affirmatives, négatives)<ref>Aristote, ''De l'interprétation'', 7, 17a38-17b12.</ref>. En croisant ces critères, on obtient quatre formes fondamentales : l'universelle affirmative (A), l'universelle négative (E), la particulière affirmative (I), et la particulière négative (O) — désignations qui ne sont pas aristotéliciennes mais scolastiques.
Cette classification permet de définir les relations d'opposition entre propositions : contradiction, contrariété, subcontrariété et subalternation<ref>''Ibid.'', 7, 17b16-26.</ref>.
==== Le problème des futurs contingents ====
Le chapitre 9 du ''De interpretatione'' soulève l'une des questions les plus discutées de l'histoire de la logique : le statut des propositions portant sur les futurs contingents. Aristote se demande si le principe de bivalence s'applique aux propositions concernant des événements futurs qui ne sont ni nécessaires ni impossibles.
Le problème se formule ainsi : « Il y aura demain une bataille navale » et « Il n'y aura pas demain une bataille navale » sont deux propositions contradictoires. D'après le principe du tiers exclu, l'une doit être vraie et l'autre fausse. Mais si l'une est dès maintenant vraie, alors il est nécessaire que l'événement se produise<ref>Aristote, ''De l'interprétation'', 9, 18b9-16.</ref>. On aboutit à un fatalisme logique.
La solution d'Aristote est subtile et a fait l'objet d'interprétations divergentes : il maintient que pour les propositions portant sur le présent et le passé, le principe de bivalence s'applique sans restriction ; mais pour les futurs contingents, « il est nécessaire que l'affirmation ou la négation soit vraie, mais non que celle-ci déterminément ou celle-là déterminément soit vraie »<ref>''Ibid.'', 19a36-39.</ref>. La disjonction est nécessaire, mais chacun des disjoints reste contingent.
Cette doctrine a suscité des controverses depuis l'Antiquité (les Stoïciens) jusqu'à la logique contemporaine (logique modale, logiques plurivalentes)<ref>Pour une discussion récente, voir Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', op. cit.</ref>.
==== Les propositions modales ====
Les chapitres 12 et 13 du ''De interpretatione'' examinent les propositions modales<ref>Aristote, ''De l'interprétation'', 12-13, 21a34-23a26.</ref>. Aristote distingue quatre modalités : le possible (''dynaton'', ''endechomenon''), l'impossible (''adynaton''), le contingent et le nécessaire (''anankaion'').
Aristote établit que « Il est possible que S soit P » ne se convertit pas comme une proposition assertorique. Il définit le nécessaire comme « ce qui ne peut pas ne pas être » (''to mè endechomenon mè einai'')<ref>''Ibid.'', 12, 21b35-36.</ref>. Les propositions modales jouent un rôle essentiel dans la théorie aristotélicienne de la science : la science porte sur le nécessaire, non sur le contingent<ref>Aristote, ''Seconds Analytiques'', I, 30, 87b19-27.</ref>.
==== Portée philosophique du ''De interpretatione'' ====
L'importance du ''De interpretatione'' dépasse le cadre de la logique formelle. Aristote y pose les bases d'une ontologie du jugement qui sera reprise par la philosophie occidentale jusqu'à Kant et au-delà. En établissant que la vérité réside dans la composition et la division opérées par l'intellect, et non dans les choses isolées ni dans les concepts isolés, Aristote fait du jugement le lieu de la manifestation de l'être<ref>Aristote, ''Métaphysique'', Θ (IX), 10, 1051b1-9.</ref>. La recherche contemporaine, notamment Suzanne Husson dans ''Interpréter le De Interpretatione'', a insisté sur la fécondité de ce traité pour la philosophie analytique du langage<ref>Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', op. cit.</ref>.
=== Les Analytiques – La science démonstrative ===
Les deux traités des ''Analytiques'' – ''Premiers Analytiques'' (''Analytica priora'') et ''Seconds Analytiques'' (''Analytica posteriora'') – exposent la théorie de la science démonstrative. Les ''Premiers Analytiques'' s'attachent à la forme du syllogisme en général, indépendamment de la vérité des prémisses ; les ''Seconds Analytiques'' traitent du syllogisme scientifique ou démonstratif (''apodeixis''), dont les prémisses doivent être vraies, premières et causales<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 9-16. Sur la distinction entre logique formelle et épistémologie chez Aristote, voir Jonathan Barnes, ''Aristotle's Posterior Analytics'', 2e éd., Oxford, Clarendon Press, 1993, p. xviii-xix.</ref>.
==== Le syllogisme : structure et figures ====
Le syllogisme (''syllogismos'') est défini par Aristote comme « un discours dans lequel, certaines choses étant posées, quelque chose d'autre que ces données en résulte nécessairement par le seul fait de ces données »<ref>Aristote, ''Premiers Analytiques'', I, 1, 24 b 18-20.</ref>. Cette définition insiste sur trois caractères essentiels : la pluralité des prémisses (au moins deux), la nécessité de la conclusion, et le fait que cette nécessité découle uniquement de la position des prémisses<ref>David Bronstein, ''Aristotle on Knowledge and Learning: The Posterior Analytics'', Oxford, Oxford University Press, 2016, p. 31-32. Pour une étude classique de la syllogistique, voir Jan Lukasiewicz, ''La syllogistique d'Aristote'', trad. fr., Paris, Vrin.</ref>.
La structure minimale du syllogisme comporte trois termes : le grand extrême ou majeur, le petit extrême ou mineur, et le moyen terme qui assure la liaison entre les extrêmes sans apparaître dans la conclusion<ref>Aristote, ''Premiers Analytiques'', I, 4, 25 b 32-36.</ref>. L'exemple canonique est : « Tout homme est mortel » (majeure), « Or Socrate est un homme » (mineure), « Donc Socrate est mortel ».
Aristote distingue trois figures du syllogisme selon la position du moyen terme dans les prémisses<ref>Aristote, ''Premiers Analytiques'', I, 4-6, 25 b 26-28 b 14.</ref>. La première figure est considérée comme la plus parfaite, car elle seule permet de conclure dans tous les modes<ref>Aristote, ''Premiers Analytiques'', I, 7, 29 a 30 ; I, 14, 32 b 38-33 a 5.</ref>.
À l'intérieur de chaque figure, Aristote détermine les modes valables. Dans la première figure, quatre modes sont concluants : Barbara, Celarent, Darii et Ferio (désignations scolastiques)<ref>Aristote, ''Premiers Analytiques'', I, 4, 25 b 37-26 b 34.</ref>. Les syllogismes des deuxième et troisième figures, dits « imparfaits », doivent être ramenés par conversion des prémisses aux syllogismes parfaits de la première figure<ref>Aristote, ''Premiers Analytiques'', I, 2-3, 25 a 1-26.</ref>.
==== La démonstration scientifique (''apodeixis'') ====
Aristote définit la science (''epistèmè'') triplement : elle est connaissance de la cause, certitude de l'adéquation entre la cause et l'effet, et conscience de la nécessité de cette liaison. « Nous estimons posséder la science d'une chose d'une manière absolue », écrit-il, « quand nous croyons que nous connaissons la cause par laquelle la chose est, que nous savons que cette cause est celle de la chose, et qu'en outre il n'est pas possible que la chose soit autre qu'elle n'est »<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 9-12.</ref>.
La démonstration est le syllogisme qui produit la science. Elle doit partir de prémisses vraies, premières (indémontrables), immédiates, plus connues que la conclusion, antérieures à elle, et causes de celle-ci<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 20-25.</ref>. Sans ces conditions, on peut avoir un syllogisme valide, mais non une démonstration scientifique<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 35-42.</ref>.
Le moyen terme joue dans la démonstration un rôle crucial : « Le moyen terme est la cause »<ref>Aristote, ''Seconds Analytiques'', II, 2, 90 a 6.</ref>. Pour démontrer que la Lune subit des éclipses, on utilisera comme moyen terme « interposition de la Terre », qui n'est pas seulement un lien logique mais la cause physique du phénomène. Aristote distingue ainsi le syllogisme du fait (''hoti'') et le syllogisme du pourquoi (''dioti'')<ref>Aristote, ''Seconds Analytiques'', I, 13, 78 a 22-b 13.</ref>.
Les causes dont traite la démonstration correspondent aux quatre types de causes exposés dans la ''Physique'' (formelle, matérielle, efficiente, finale)<ref>Aristote, ''Seconds Analytiques'', II, 11, 94 a 20-24 ; cf. ''Physique'', II, 3, 194 b 23-195 b 30. Voir Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', Oxford, Oxford University Press, 2012, p. 176-180.</ref>.
==== Les principes de la science : axiomes, hypothèses et définitions ====
Toute démonstration présuppose des principes (''archai'') qui ne peuvent être démontrés. Aristote refuse à la fois la régression à l'infini et la démonstration circulaire<ref>Aristote, ''Seconds Analytiques'', I, 3, 72 b 5-18.</ref>. Il faut donc admettre l'existence de principes premiers connus sans démonstration, qui se divisent en trois catégories<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 94-99.</ref>.
Les axiomes (''axiômata'') ou principes communs s'appliquent à toutes les sciences. Le plus fondamental est le principe de non-contradiction : « Il est impossible que le même attribut appartienne et n'appartienne pas en même temps au même sujet et sous le même rapport »<ref>Aristote, ''Métaphysique'', Γ (IV), 3, 1005 b 19-20.</ref>. Les hypothèses (''hypotheseis'') et les thèses (''theseis'') affirment l'existence ou la non-existence de certaines entités propres à chaque science<ref>Aristote, ''Seconds Analytiques'', I, 2, 72 a 14-24 ; I, 10, 76 b 23-34.</ref>. Les définitions (''horoi'') énoncent ce qu'est une chose, son essence (''ti esti'')<ref>Aristote, ''Seconds Analytiques'', II, 3, 90 b 24-27.</ref>.
Aristote examine longuement la question de savoir si l'on peut démontrer l'essence : il conclut négativement, distinguant définition et démonstration<ref>Aristote, ''Seconds Analytiques'', II, 4, 91 a 35-b 11.</ref>. Toutefois, certaines définitions peuvent découler de démonstrations : c'est le cas des définitions causales, comme celle du tonnerre comme « bruit dans les nuages causé par l'extinction du feu »<ref>Aristote, ''Seconds Analytiques'', II, 8, 93 b 7-14.</ref>.
==== Unité et diversité des sciences ====
Un principe capital est l'interdiction du passage d'un genre à un autre (''metabasis eis allo genos''). Chaque science se définit par son genre propre et ne peut emprunter ses principes ou démonstrations à une autre science<ref>Aristote, ''Seconds Analytiques'', I, 7, 75 a 38-b 2.</ref>. Cette règle garantit l'autonomie des sciences<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 177-183.</ref>.
Aristote admet trois exceptions : la subordination d'une science à une autre (l'optique à la géométrie), le partage des axiomes communs, et l'existence de sciences mixtes (''metaxu'') comme l'astronomie mathématique<ref>Aristote, ''Seconds Analytiques'', I, 7, 75 b 14-17 ; ''Physique'', II, 2, 194 a 7-12.</ref>.
Cette théorie fonde l'organisation aristotélicienne du savoir : chaque science possède une méthode adaptée à son objet. Les mathématiques procèdent par démonstration nécessaire ; la physique tient compte du changement ; la biologie observe les régularités qui se produisent « dans la plupart des cas » (''hôs epi to poly'') ; l'éthique et la politique se contentent de vérités approximatives<ref>Aristote, ''Éthique à Nicomaque'', I, 3, 1094 b 14-16.</ref>.
==== Le problème de la connaissance des principes : induction et intellection ====
La théorie de la démonstration soulève un problème : si toute science procède de principes indémontrables, comment connaître ces principes eux-mêmes ?<ref>Aristote, ''Seconds Analytiques'', I, 3, 72 b 5-18.</ref> Aristote consacre le chapitre final des ''Seconds Analytiques'' (II, 19) à cette question.
La connaissance des principes résulte d'un processus qui part de la sensation (''aisthèsis''), passe par la mémoire (''mnèmè''), puis par l'expérience (''empeiria''), pour aboutir à la saisie de l'universel<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 a 3-9.</ref>. Ce processus est appelé induction (''epagôgê''). Aristote compare ce processus à une armée en déroute où l'ordre se rétablit progressivement<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 a 12-14.</ref>. L'interprétation de ce passage difficile fait l'objet de débats : selon David Bronstein, l'induction n'est pas une opération purement logique mais un mouvement de l'âme vers l'intelligible<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 225-247.</ref>.
La saisie ultime des principes premiers relève d'une faculté qu'Aristote nomme intellect (''nous'') ou intuition intellectuelle, « la disposition par laquelle nous connaissons les principes »<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 b 12.</ref>. Aristote affirme que nous possédons en puissance la capacité de connaître les principes, qui s'actualise par la sensation et la pensée. L'intellect est la plus haute forme de connaissance, supérieure même à la science démonstrative<ref>Aristote, ''Éthique à Nicomaque'', VI, 6, 1141 a 7-8.</ref>.
Cette doctrine soulève des difficultés notoires, qu'Aristote ne résout pas explicitement. Comment l'intellect peut-il être à la fois une capacité innée et le résultat d'un processus d'apprentissage ? Les commentateurs ultérieurs (Alexandre d'Aphrodise, Avicenne, Averroès, Thomas d'Aquin) ont proposé des interprétations divergentes<ref>Orna Harari, ''Knowledge and Demonstration: Aristotle's Posterior Analytics'', Dordrecht, Springer, 2004, p. 26-31.</ref>.
==== Portée et postérité de la théorie démonstrative ====
La théorie aristotélicienne de la science démonstrative a fourni un modèle épistémologique de référence pendant deux millénaires. Les ''Éléments'' d'Euclide, avec leur méthode axiomatique-déductive, sont parfois présentés comme l'incarnation de l'idéal aristotélicien<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 3-10. Cette caractérisation est cependant nuancée par certains travaux récents, qui soulignent les différences entre la pratique mathématique grecque et la théorie aristotélicienne de la démonstration.</ref>.
À partir de la révolution scientifique moderne, la théorie aristotélicienne a fait l'objet de critiques. Descartes reproche au syllogisme de ne rien apprendre de nouveau ; Bacon dénonce la stérilité de la logique aristotélicienne. La science moderne procède par hypothèses provisoires, expérimentations et inférences probabilistes plutôt que par démonstrations nécessaires à partir de principes évidents<ref>Pour une discussion équilibrée, voir Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. xviii-xix. La recherche récente sur la philosophie naturelle de la Renaissance et la scolastique tardive nuance cependant l'idée d'une rupture frontale avec l'aristotélisme : la transition vers la science moderne combine continuités, relectures et oppositions plutôt qu'une opposition unilatérale.</ref>.
Ces critiques ne suppriment pas l'apport historique d'Aristote : il a établi les règles de la déduction valide, distingué clairement la forme et la matière du raisonnement, et montré la nécessité des principes premiers. Sa conception de l'explication scientifique comme connaissance du « pourquoi » continue de nourrir la réflexion contemporaine en philosophie des sciences<ref>Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., p. 169-202.</ref>.
=== Les ''Topiques'' – L'art de la dialectique ===
==== La dialectique et les lieux communs ====
Si les ''Analytiques'' traitent de la démonstration scientifique, les ''Topiques'' concernent le raisonnement dialectique. La dialectique part de prémisses probables (''endoxa''), c'est-à-dire d'opinions généralement admises par tous, ou par les plus nombreux, ou par les sages<ref>Aristote, ''Topiques'', I, 1, 100a29-b23.</ref>. Elle ne vise pas la certitude scientifique mais l'art de discuter de manière raisonnable.
Les ''topoi'' ou lieux sont des schèmes d'argumentation valables dans plusieurs domaines. Par exemple, le lieu « du plus et du moins » permet d'argumenter ainsi : si ce qui est plus susceptible d'appartenir à quelque chose ne lui appartient pas, ce qui l'est moins ne lui appartiendra pas non plus<ref>Aristote, ''Topiques'', II, 10, 114b37-115a3.</ref>.
==== L'utilité de la dialectique ====
Aristote assigne trois usages à la dialectique : entraînement intellectuel, utilité dans les rencontres avec autrui, et apport aux sciences philosophiques elles-mêmes<ref>Aristote, ''Topiques'', I, 2, 101a25-b4.</ref>.
La dialectique permet d'examiner de manière critique (''peirastikê'') les principes des sciences en confrontant les opinions opposées. Elle permet aussi de parcourir les difficultés (''aporiai'') et de dégager progressivement les principes véritables. Cette méthode dialectique est mise systématiquement en œuvre par Aristote dans ses traités<ref>Aristote, ''Éthique à Nicomaque'', VII, 1, 1145b2-7. Sur la dialectique aristotélicienne, voir J. Brunschwig, ''Aristote: Topiques I-IV'', Paris, Les Belles Lettres, 1967 et 2007 ; Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit.</ref>.
=== Les ''Réfutations sophistiques'' – Les paralogismes et leur réfutation ===
==== Les sophismes et leurs types ====
Les ''Réfutations sophistiques'' complètent les ''Topiques'' en examinant les raisonnements fallacieux. Aristote distingue treize types de sophismes, dont six dépendent du langage (homonymie, amphibologie, composition, division, accentuation, forme de l'expression) et sept en sont indépendants (accident, passage du qualifié à l'absolu, ignorance de la réfutation, pétition de principe, faux enchaînement, prise de l'antécédent comme conséquent, réunion de plusieurs questions en une)<ref>Aristote, ''Réfutations sophistiques'', 4, 165b23-166b19. Voir L.A. Dorion, ''Les Réfutations Sophistiques d'Aristote'', Paris, Vrin, 1995.</ref>.
L'exemple du sophisme par accident est célèbre : « Coriskos est différent de Socrate / Or Socrate est un homme / Donc Coriskos est différent d'un homme »<ref>Aristote, ''Réfutations sophistiques'', 5, 166b28-36.</ref>.
==== Logique et défense de la rationalité ====
Au-delà de son utilité pratique, l'étude des sophismes a une portée philosophique. Pour Aristote, il existe des règles objectives du raisonnement correct, indépendantes de l'habileté rhétorique<ref>Aristote, ''Réfutations sophistiques'', 11, 171b34-172a7.</ref>. Cette thèse a été souvent lue, dans la tradition interprétative, comme une réponse au relativisme attribué aux sophistes. Une partie de la recherche contemporaine nuance cependant cette lecture : la « réponse aux sophistes » est moins un combat frontal qu'une délimitation du domaine de la science par rapport à celui de l'argumentation persuasive ; il s'agit pour Aristote, comme dans la défense du principe de non-contradiction, d'établir des conditions minimales pour qu'un discours rationnel soit possible<ref>Aristote, ''Métaphysique'', Γ, 3-4, 1005b19-1008b31. Sur le rôle interprétatif joué par la figure du « sophiste » chez Aristote, voir L.A. Dorion, « Aristote et l'invention de la dialectique », dans M. Canto-Sperber et P. Pellegrin (éd.), ''Le Style de la Pensée'', Paris, Les Belles Lettres, 2002, p. 182-220.</ref>.
== La philosophie de la nature ==
=== La ''Physique'' – Les principes du mouvement et du changement ===
==== La nature comme principe interne de mouvement ====
La physique aristotélicienne n'est pas la physique au sens moderne, science mathématisée des phénomènes matériels. Elle est la science des êtres qui possèdent en eux-mêmes un principe de mouvement et de repos<ref>Aristote, ''Physique'', II, 1, 192b13-23. Pour une introduction d'ensemble à la philosophie naturelle aristotélicienne, voir Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie III ; ainsi que l'entrée « Aristotle's Natural Philosophy » de la ''Stanford Encyclopedia of Philosophy''.</ref>. Un être naturel (''phusei on'') se distingue ainsi d'un être artificiel : une plante croît et se reproduit par sa propre nature, tandis qu'un lit, fait de bois, ne produit pas naturellement d'autres lits.
Cette définition fonde l'autonomie de la nature et de son étude. Les êtres naturels ont leurs principes en eux-mêmes et ne dépendent pas de causes extérieures pour leur mouvement essentiel. Le physicien doit étudier non seulement la forme des choses, mais aussi leur matière, car la matière est le principe des mouvements naturels<ref>Aristote, ''Physique'', II, 2, 194a12-27.</ref>. Comme le souligne Larose, la défense aristotélicienne de l'autonomie de la physique constitue une contribution durable de la pensée du Stagirite : « Sa défense de l'autonomie des domaines du savoir, encore une fois contre Platon, est toujours d'actualité. Le refus de réduire la biologie aux mathématiques est bien aristotélicien »<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>.
==== Les quatre causes ====
Pour comprendre pleinement un être naturel, il faut connaître ses quatre causes. La cause matérielle est ce dont une chose est faite (le bronze est la cause matérielle de la statue). La cause formelle est l'essence ou la définition de la chose (la forme de l'Hermès est la cause formelle de la statue d'Hermès). La cause efficiente est ce qui a produit la chose (le sculpteur est la cause efficiente de la statue). La cause finale est ce en vue de quoi la chose existe (la décoration du temple est la cause finale de la statue)<ref>Aristote, ''Physique'', II, 3, 194b23-195a3.</ref>.
Ces quatre causes ne s'excluent pas mais se complètent. Plusieurs causes peuvent coïncider : la forme, le moteur et la fin peuvent être identiques. Dans la génération naturelle d'un homme, c'est la forme d'homme qui est à la fois dans le géniteur (cause efficiente), dans l'engendré (cause formelle), et visée comme fin du processus de génération<ref>Aristote, ''Physique'', II, 7, 198a24-27.</ref>.
==== Le mouvement et ses espèces ====
Le mouvement (''kinêsis'') ou changement est défini comme « l'actualité de ce qui est en puissance en tant que tel »<ref>Aristote, ''Physique'', III, 1, 201a10-11.</ref>. Cette définition signifie que le mouvement est l'acte d'un être qui n'est pas encore pleinement actualisé, mais en voie de l'être. C'est un acte imparfait, par opposition à l'acte parfait (''energeia'') qui est l'actualité achevée d'une chose.
Aristote distingue quatre espèces de changement selon les catégories : le changement substantiel (génération et corruption), le changement qualitatif (altération), le changement quantitatif (accroissement et diminution), et le changement local (déplacement)<ref>Aristote, ''Physique'', V, 1, 225a34-225b9.</ref>. Parmi ces changements, le mouvement local est premier, car il peut exister sans les autres<ref>Aristote, ''Physique'', VIII, 7, 260a26-260b7.</ref>.
==== L'éternité du mouvement et le Premier Moteur ====
Le mouvement est-il éternel ou a-t-il commencé ? Aristote argumente qu'il doit être éternel, car toute génération du mouvement supposerait un mouvement antérieur<ref>Aristote, ''Physique'', VIII, 1, 251a8-252b6.</ref>. Or tout ce qui est mû est mû par autre chose<ref>Aristote, ''Physique'', VII, 1, 241b24-242a15.</ref>. Pour éviter une régression à l'infini, il faut postuler un Premier Moteur immobile qui meut éternellement.
Ce Premier Moteur meut sans être mû, à la manière dont l'objet du désir meut le désirant. Il est donc cause finale plutôt qu'efficiente du mouvement éternel du ciel<ref>Aristote, ''Physique'', VIII, 6, 259b20-260a19.</ref>. Cette preuve « physique » du Premier Moteur prépare les développements métaphysiques du livre Λ de la ''Métaphysique''. Comme le souligne Annick Jaulin, l'interprétation de ce passage et sa relation aux livres centraux de la ''Métaphysique'' constitue l'un des problèmes les plus discutés de l'aristotélisme contemporain<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>.
=== Le ''De caelo'' – Le ciel et les éléments ===
==== La cinquième essence et l'éternité du monde ====
Le traité ''Du ciel'' étudie le mouvement circulaire du ciel et sa substance. Aristote établit qu'il existe un cinquième élément, l'éther (''aithêr''), distinct des quatre éléments sublunaires, animé d'un mouvement circulaire naturel et éternel<ref>Aristote, ''Du ciel'', I, 2, 269a2-269b17.</ref>. Cette quintessence ne connaît ni génération ni corruption, ni accroissement ni diminution.
Le ciel est, selon Aristote, éternel, sans commencement ni fin. Aristote réfute les cosmogonies qui, comme celle du ''Timée'' de Platon, faisaient naître le monde dans le temps<ref>Aristote, ''Du ciel'', I, 10-12, 279b4-284a35.</ref>. Cette thèse de l'éternité du monde entrera en conflit, au Moyen Âge, avec le dogme chrétien de la création ''ex nihilo'', donnant lieu à des tentatives de conciliation comme celles de Thomas d'Aquin.
==== La structure du cosmos ====
Aristote défend une cosmologie géocentrique. La Terre, sphérique, est immobile au centre de l'univers<ref>Aristote, ''Du ciel'', II, 14, 296b6-297b21.</ref>. Autour d'elle se trouvent les sphères concentriques des quatre éléments sublunaires (terre, eau, air, feu), puis les sphères célestes portant les astres<ref>Aristote, ''Du ciel'', II, 12, 292a14-293a11.</ref>.
Cette cosmologie restera dominante jusqu'à Copernic, Kepler et Galilée. Elle repose sur la distinction entre monde supralunaire, parfait et immuable, et monde sublunaire, siège de la génération et de la corruption. Cette distinction sera ébranlée par la découverte, au début du XVIIe siècle, des taches solaires et de la nature des comètes.
==== Les quatre éléments et leurs mouvements naturels ====
Dans le monde sublunaire, les quatre éléments possèdent des mouvements naturels rectilignes. La terre et l'eau, éléments lourds, se dirigent vers le bas, c'est-à-dire vers le centre de l'univers. L'air et le feu, éléments légers, se dirigent vers le haut, c'est-à-dire vers la périphérie du monde sublunaire<ref>Aristote, ''Du ciel'', IV, 4, 311a15-312a21.</ref>.
Comme le note Pellegrin, Aristote attache une grande importance à l'évidence sensible dans son traitement des questions physiques : il écrit lui-même, à propos de la transformation des éléments, que « le résultat final […] pour la science physique c'est l'évidence sensible qui toujours l'emporte » (''De caelo'', III, 7, 306a11)<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 94.</ref>.
Ces principes fondent la dynamique aristotélicienne, selon laquelle chaque corps tend vers son lieu propre avec une vitesse proportionnelle à son poids et inversement proportionnelle à la résistance du milieu<ref>Aristote, ''Du ciel'', I, 8, 277a27-277b8.</ref>. Cette physique sera critiquée par la révolution galiléenne, qui montrera que dans le vide tous les corps tombent à la même vitesse. Il faut cependant noter, comme l'a montré la recherche récente sur la philosophie naturelle de la Renaissance, que la transition entre la physique aristotélicienne et la mécanique moderne s'est opérée par étapes, à travers des relectures et des modifications internes au cadre péripatéticien plutôt que par un rejet abrupt et frontal<ref>Voir A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', Leiden, Brill, 2009.</ref>.
=== Le ''De generatione et corruptione'' – Génération, corruption et transformation ===
==== Les deux espèces de génération ====
La génération absolue (''genesis haplôs'') est le passage du non-être à l'être d'une substance : un homme naît. La génération relative (''genesis ti'') est l'altération d'une substance qui demeure : un homme devient musicien<ref>Aristote, ''De la génération et la corruption'', I, 3, 317a17-b18.</ref>. Aristote cherche à éviter deux écueils : l'éléatisme de Parménide, qui niait tout devenir, et l'atomisme de Démocrite, qui réduisait toute génération à une simple agrégation d'atomes éternels.
La solution réside dans les concepts de matière et de forme. Dans toute génération, quelque chose persiste (la matière) tandis que quelque chose advient (la forme). Dans la génération absolue, la matière première indéterminée reçoit une nouvelle forme substantielle. Dans la génération relative, la substance demeure identique tandis que ses accidents changent<ref>Aristote, ''De la génération et la corruption'', I, 4, 319b6-320a7.</ref>.
==== Action et passion, contact et mélange ====
Pour qu'il y ait génération, il faut qu'un agent agisse sur un patient. Mais l'action n'est pas séparée de la passion : ce sont deux aspects d'un même changement<ref>Aristote, ''De la génération et la corruption'', I, 7, 323b18-324a19.</ref>.
Le mélange (''mixis'') se distingue de la simple juxtaposition par le fait que les composants, tout en formant un nouveau corps homogène, peuvent être restitués par analyse. Aristote critique l'atomisme qui ramène le mélange à un simple entrelacement d'atomes : si les composants demeuraient inchangés, il n'y aurait pas véritable mélange<ref>Aristote, ''De la génération et la corruption'', I, 10, 327a30-328a5.</ref>. Dans le véritable mélange, les qualités des composants s'unissent pour former une nouvelle qualité intermédiaire.
=== Les ''Météorologiques'' – Les phénomènes du monde sublunaire ===
==== Le programme de la science naturelle ====
Les ''Météorologiques'' s'insèrent dans le programme de la physique aristotélicienne. Après la ''Physique'' (principes du mouvement), le ''De caelo'' (structure de l'univers), et le ''De generatione'' (transformations des éléments), Aristote étudie les phénomènes qui résultent de l'action du ciel sur le monde sublunaire<ref>Aristote, ''Météorologiques'', I, 1, 338a20-339a5.</ref>.
Le terme « météorologique » a ici un sens beaucoup plus large qu'aujourd'hui. Il désigne tous les phénomènes qui se produisent dans la région entre la surface de la terre et la sphère de la lune : phénomènes atmosphériques (pluie, vent, tonnerre), mais aussi comètes, Voie Lactée, tremblements de terre, mer et marées, fleuves et leurs crues.
==== Les deux exhalaisons ====
Le principe explicatif fondamental est celui des deux exhalaisons. Le soleil, par son mouvement et sa chaleur, produit deux sortes d'évaporations terrestres : une exhalaison humide (vapeur d'eau) et une exhalaison sèche (exhalations terrestres combustibles)<ref>Aristote, ''Météorologiques'', I, 3, 340b19-341a12.</ref>. Ces deux exhalaisons donnent naissance à la plupart des phénomènes météorologiques.
L'exhalaison humide, refroidie dans les régions supérieures, retombe en pluie. L'exhalaison sèche, enflammée au contact de la sphère du feu, produit les phénomènes ignés : étoiles filantes, comètes, Voie Lactée<ref>Aristote, ''Météorologiques'', I, 4-8, 341b6-346a34.</ref>. Ces explications, souvent fausses au regard de la science moderne, témoignent d'une démarche qui cherche à rendre compte des phénomènes par des causes naturelles, sans recourir au mythe.
=== Le ''De anima'' – L'âme, forme du corps vivant ===
==== Définition de l'âme ====
Le traité ''De l'âme'' relève à la fois de la physique – l'âme est principe de mouvement du corps vivant – et de ce qu'on appellerait aujourd'hui psychologie ou philosophie de l'esprit. Après avoir réfuté les conceptions de ses prédécesseurs, Aristote définit l'âme comme « l'entéléchie première d'un corps naturel ayant la vie en puissance »<ref>Aristote, ''De l'âme'', II, 1, 412a27-28.</ref>.
L'âme est la forme du corps vivant, son acte premier, principe de toutes ses opérations vitales. Elle n'est ni une substance séparée habitant le corps comme un pilote dans son navire (critique du dualisme platonicien), ni une simple harmonie ou arrangement du corps (critique du matérialisme), mais la forme substantielle indissociable du corps qu'elle anime<ref>Aristote, ''De l'âme'', II, 1, 413a3-10.</ref>. Cette doctrine hylémorphique de l'âme est aujourd'hui remise au premier plan par certains travaux de philosophie de l'esprit qui y voient une alternative au dualisme cartésien et au réductionnisme matérialiste<ref>Voir Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie IV ; ainsi que les travaux de Sophia Connell sur la psychologie aristotélicienne.</ref>.
==== Les trois âmes et leurs facultés ====
Il y a, selon Aristote, trois niveaux d'âme. L'âme nutritive, commune à tous les vivants (plantes, animaux, hommes), assure la nutrition, la croissance et la reproduction. L'âme sensitive, propre aux animaux, ajoute la sensation, le désir et le mouvement local. L'âme intellective, propre à l'homme, ajoute la pensée rationnelle<ref>Aristote, ''De l'âme'', II, 2-3, 413a20-414b28.</ref>.
Ces trois âmes ne sont pas trois substances séparées, mais trois niveaux de capacités, les supérieures incluant les inférieures. Un animal possède toutes les capacités de la plante plus les siennes propres ; l'homme possède celles de la plante et de l'animal plus l'intelligence.
==== La sensation et l'intellection ====
La sensation est la réception de la forme sensible sans la matière, comme la cire reçoit l'empreinte du sceau sans recevoir le métal dont il est fait<ref>Aristote, ''De l'âme'', II, 12, 424a17-21.</ref>. Chaque sens a son objet propre (la couleur pour la vue, le son pour l'ouïe). Il existe aussi un sens commun qui perçoit les sensibles communs (mouvement, repos, nombre, figure)<ref>Aristote, ''De l'âme'', III, 1-2, 425a13-427a16.</ref>.
L'intellect (''nous'') est la faculté de penser les formes intelligibles. Aristote distingue l'intellect patient, qui reçoit les formes, et l'intellect agent, qui les abstrait à partir des images sensibles<ref>Aristote, ''De l'âme'', III, 5, 430a10-25.</ref>. L'interprétation de ce passage célèbre et bref est l'une des plus controversées de l'aristotélisme : l'intellect agent est-il une partie de l'âme humaine ou une réalité séparée ? Est-il immortel ou périssable avec le corps ? Ces questions ont donné lieu, dans la tradition commentatoriale arabe et latine, à des positions divergentes (Alexandre d'Aphrodise, Avicenne, Averroès, Thomas d'Aquin).
=== Les ''Parva Naturalia'' – Les fonctions vitales ===
==== Organisation des Petits traités d'histoire naturelle ====
Les ''Parva Naturalia'' regroupent un ensemble de courts traités sur diverses fonctions vitales et leurs organes. Ils complètent le ''De anima'' en étudiant non plus l'âme en général mais ses opérations particulières<ref>Aristote, ''De la sensation'', 1, 436a1-17.</ref>.
Le ''De sensu'' traite des sensibles et des organes des sens. Le ''De memoria'' examine la mémoire et la réminiscence. Le ''De somno'' et le ''De insomniis'' étudient le sommeil et les rêves, expliqués par les mouvements qui persistent dans les organes sensoriels après la disparition des stimuli externes<ref>Aristote, ''Du sommeil'', 2, 455a12-455b2.</ref>. Le ''De divinatione'' traite de la divination dans les songes, dont Aristote nie la valeur prophétique.
==== Le cœur, principe de la vie ====
Aristote localise le principe vital et le sens commun dans le cœur plutôt que dans le cerveau<ref>Aristote, ''Des parties des animaux'', III, 4, 666a11-18.</ref>. C'est dans le cœur que réside la chaleur innée. Le cerveau, froid et humide, sert seulement à refroidir la chaleur excessive du cœur<ref>Aristote, ''Des parties des animaux'', II, 7, 652a24-652b34.</ref>.
Cette doctrine cardiocentrique est aujourd'hui jugée incorrecte du point de vue physiologique : Galien, dès l'Antiquité, reconnaîtra au cerveau un rôle dans les sensations et les mouvements volontaires. Comme le note Pellegrin, « aucune [observation] n'a amené Aristote à renverser l'une quelconque des conceptions fantaisistes qu'il a sur le fonctionnement du corps vivant »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 94.</ref>. Cette limite illustre les contraintes méthodologiques de la science aristotélicienne, tributaire des moyens techniques de son époque, sans pour autant invalider la démarche générale qui consiste à expliquer les phénomènes vitaux par des causes naturelles observables.
== La biologie et la connaissance du vivant ==
=== L'''Histoire des animaux'' – L'enquête empirique ===
==== Méthode et organisation de l'œuvre ====
L'''Histoire des animaux'' (''Peri ta zôia historiai''), en dix livres dont trois sont probablement apocryphes, constitue un travail de collection et de description des faits concernant les animaux<ref>Aristote, ''Histoire des animaux'', I, 6, 491a7-14. Pour une introduction à la biologie aristotélicienne et à son importance dans la recherche contemporaine, voir Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021.</ref>. Le terme ''historia'' signifie ici « enquête » ou « recherche », non pas histoire au sens temporel. Il s'agit d'un exposé systématique des données empiriques qui sert de fondement aux explications causales développées dans les autres traités biologiques.
Aristote y décrit l'anatomie externe et interne, le mode de reproduction, le régime alimentaire, les habitats et les comportements de plusieurs centaines d'espèces animales. Cette œuvre témoigne d'observations personnelles, complétées par des témoignages de pêcheurs, chasseurs et éleveurs<ref>D'Arcy Wentworth Thompson, introduction à sa traduction de l'''Histoire des animaux'', Oxford, 1910. Pour une mise au point récente sur le rôle de l'''Historia animalium'' dans le projet biologique aristotélicien, voir A. Gotthelf, « Data-organization, Classification, and Kinds: the Place of the History of Animals in Aristotle's Biological Enterprise », dans ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012, p. 261-292 ; ainsi que James G. Lennox, « Between Data and Demonstration: The Analytics and the Historia Animalium », dans A. Bowen (éd.), ''Science and Philosophy in Classical Greece'', New York, Garland, 1991, p. 261-295.</ref>.
La place de cet ouvrage dans le projet scientifique aristotélicien a été reconsidérée par la recherche contemporaine. La question du rapport entre les ''Seconds Analytiques'' (théorie de la science démonstrative) et la pratique effective des traités biologiques a fait l'objet de débats nourris, notamment autour des travaux de David Balme, Allan Gotthelf et James G. Lennox<ref>Voir David Balme, « Aristotle's Use of Division and Differentiae », dans A. Gotthelf et J.G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987 ; Mariska Leunissen, « History of Animals », dans Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
==== Principes de classification ====
Aristote organise les animaux selon une classification qui prend en compte plusieurs critères : mode de reproduction (vivipares, ovipares, larvipares), habitat (terrestres, aquatiques, aériens), régime alimentaire, présence ou absence de sang<ref>Aristote, ''Histoire des animaux'', I, 6, 490b7-491a6.</ref>. La division fondamentale oppose les animaux sanguins (en gros, les vertébrés) et les animaux non-sanguins (les invertébrés).
Contrairement à une idée parfois répandue, Aristote ne se contente pas d'une classification dichotomique rigide. Il reconnaît que les espèces forment un continuum, avec des formes intermédiaires qui rendent difficile le tracé de frontières nettes. Ainsi, les éponges occupent-elles une position intermédiaire entre les plantes et les animaux<ref>Aristote, ''Histoire des animaux'', I, 1, 487b6-10.</ref>. L'idée d'une ''scala naturae'' (échelle de la nature) influencera la pensée biologique jusqu'à Lamarck et Darwin, même s'il convient de ne pas projeter rétrospectivement sur Aristote des conceptions évolutionnistes qui lui sont étrangères<ref>Voir James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
=== Les ''Parties des animaux'' – La causalité finale dans le vivant ===
==== Méthode de la biologie : de la description à l'explication ====
Le traité ''Des parties des animaux'' se propose d'expliquer pourquoi les animaux possèdent telles parties avec telles configurations. Après l'''Historia'', qui répond à la question « qu'est-ce qui est ? », vient l'étude qui répond à « pourquoi est-ce ainsi ? »<ref>Aristote, ''Des parties des animaux'', I, 1, 639b7-640a9.</ref>.
Le livre I constitue un véritable traité de méthodologie scientifique. Aristote y défend la légitimité de l'étude de la nature : « il faut étudier chaque être sans dégoût, car en chacun réside quelque chose de naturel et de beau »<ref>Aristote, ''Des parties des animaux'', I, 5, 645a15-17.</ref>. Cette injonction est aujourd'hui souvent citée pour souligner l'importance accordée par Aristote à l'observation des phénomènes naturels, même dans leurs manifestations les plus humbles.
==== La priorité de la cause finale ====
Dans l'étude des vivants, la cause finale joue, selon Aristote, un rôle primordial. C'est en vue d'une fonction déterminée que chaque organe est configuré d'une certaine manière. Les dents de devant sont tranchantes pour couper, les molaires larges et plates pour broyer, parce que telle est leur fonction dans la nutrition<ref>Aristote, ''Des parties des animaux'', III, 1, 661b23-662a8.</ref>.
Aristote critique le mécanisme d'Empédocle et des atomistes, qui expliquaient les organes par des rencontres fortuites de particules matérielles. Selon lui, le hasard ne peut produire la régularité observée dans la nature, où chaque espèce reproduit invariablement la même organisation<ref>Aristote, ''Des parties des animaux'', I, 1, 639b11-640a9.</ref>. La matière joue un rôle, par ses propriétés et ses nécessités, mais elle est, dans cette perspective, au service de la forme et de la fin.
La nature de cette téléologie aristotélicienne est aujourd'hui l'un des sujets les plus discutés dans la recherche en philosophie de la biologie. Plusieurs interprétations s'opposent : la téléologie aristotélicienne est-elle « anthropocentrique » (la nature serait organisée pour le bien de l'homme), « cosmique » (le cosmos tout entier serait orienté vers une fin) ou « locale » (chaque espèce ou chaque organe a sa fin propre, sans qu'il y ait de finalité globale du vivant) ? Comme le souligne Pellegrin, « la téléologie aristotélicienne a comme horizon fondamental les espèces animales elles-mêmes »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Vivant », p. 196.</ref>. Cette lecture « locale », défendue notamment par Allan Gotthelf, James G. Lennox et Mariska Leunissen, est aujourd'hui largement partagée<ref>Voir Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', op. cit. ; James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Mariska Leunissen, ''Explanation and Teleology in Aristotle's Science of Nature'', Cambridge, Cambridge University Press, 2010.</ref>.
==== L'unité fonctionnelle de l'organisme ====
Chaque animal forme une totalité organisée dont toutes les parties coopèrent en vue de la vie de l'ensemble. Les poumons existent en vue de la respiration, qui existe en vue du refroidissement du cœur, qui existe en vue de la vie de l'animal. Réciproquement, la possession de poumons impose certaines autres caractéristiques : un animal pourvu de poumons doit avoir un sang et un cœur, doit respirer, donc doit avoir des voies aériennes<ref>Aristote, ''Des parties des animaux'', III, 6, 668b33-669a13.</ref>.
Cette conception « systémique » de l'organisme, où chaque partie trouve sa raison d'être dans sa contribution au tout, est aujourd'hui souvent rapprochée des approches fonctionnalistes en biologie contemporaine. Elle fonde aussi la possibilité d'une connaissance rationnelle du vivant : malgré la complexité des formes de vie, on peut les comprendre en dégageant les rapports fonctionnels entre les parties et le tout<ref>Voir Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit. ; Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie III.</ref>.
=== La ''Génération des animaux'' – Reproduction et hérédité ===
==== Les modes de reproduction ====
Le traité ''De la génération des animaux'' étudie la reproduction sexuée et asexuée, la formation de l'embryon, l'hérédité. Aristote distingue plusieurs modes de génération : par accouplement (la plupart des animaux), par génération spontanée (certains insectes, les anguilles qu'on croyait alors naître de la vase), par bourgeonnement (certaines plantes)<ref>Aristote, ''De la génération des animaux'', I, 1, 715a1-18.</ref>.
Dans la génération sexuée, le mâle apporte, selon Aristote, la forme et le principe du mouvement (la semence), tandis que la femelle apporte la matière (les menstrues chez les vivipares, l'œuf chez les ovipares)<ref>Aristote, ''De la génération des animaux'', I, 20, 729a9-b21.</ref>. Cette théorie reflète des préjugés androcentrés de l'époque : elle dénie à la femelle tout rôle actif dans la génération, la réduisant à fournir le substrat matériel informé par la semence mâle. La recherche contemporaine, notamment féministe, a discuté de manière approfondie ce volet de la pensée aristotélicienne ; elle souligne à la fois sa cohérence interne avec la métaphysique du composé hylémorphique et le caractère contestable de ses présupposés empiriques et sociaux<ref>Voir Sophia M. Connell, ''Aristotle on Female Animals: A Study of the Generation of Animals'', Cambridge, Cambridge University Press, 2016 ; ainsi que les contributions à Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
==== L'embryogenèse et la formation des parties ====
Aristote décrit avec précision le développement de l'embryon de poulet, qu'il a observé en ouvrant des œufs à différents stades d'incubation. Il voit d'abord se former le cœur, qui bat dès le troisième jour, puis progressivement les autres organes<ref>Aristote, ''Histoire des animaux'', VI, 3, 561a4-561b13.</ref>. Cette description fonde une conception épigénétique de l'embryologie : l'embryon se construit progressivement, par différenciation graduelle, et non par simple croissance d'un organisme préformé miniature.
La cause de cette différenciation progressive est, selon Aristote, la chaleur vitale contenue dans la semence, qui « cuit » et façonne la matière menstruelle comme la présure fait cailler le lait<ref>Aristote, ''De la génération des animaux'', II, 4, 739b20-740a4.</ref>. Ce processus n'est pas mécanique mais finalisé : c'est en vue de telle forme déterminée (l'homme adulte, le poulet adulte) que les parties se forment dans tel ordre.
==== L'hérédité et la ressemblance ====
Pourquoi les enfants ressemblent-ils à leurs parents ? Aristote explique ces phénomènes par le degré de « cuisson » et de maîtrise qu'exerce la semence mâle sur la matière femelle. Si la cuisson est parfaite, l'enfant ressemble au père ; si elle l'est moins, à la mère ; encore moins, aux grands-parents<ref>Aristote, ''De la génération des animaux'', IV, 3, 767b15-768a14.</ref>.
Ces explications, rudimentaires au regard de la génétique moderne, témoignent d'un effort pour rendre compte rationnellement de phénomènes que d'autres cultures expliquaient par l'intervention divine. Aristote pose les questions fondamentales de la biologie (qu'est-ce que la vie ? comment les formes se transmettent-elles ? pourquoi existe-t-il une telle diversité d'espèces ?) et invente des méthodes pour y répondre.
=== Le ''De motu animalium'' et le ''De incessu animalium'' – Le mouvement animal ===
==== Le principe du mouvement volontaire ====
Le ''De motu animalium'' examine comment les animaux se meuvent localement par eux-mêmes. Aristote établit qu'un animal ne peut se mouvoir que s'il s'appuie sur quelque chose d'immobile : de même qu'on ne peut pousser un bateau depuis l'intérieur du bateau, l'animal doit prendre appui sur le sol, l'eau ou l'air<ref>Aristote, ''Du mouvement des animaux'', 2, 698b7-699a11.</ref>.
Le principe moteur interne est le désir, excité par la sensation ou l'imagination d'un objet désirable. Le désir entraîne un réchauffement dans la région du cœur, qui se communique aux membres et produit leur contraction ou extension<ref>Aristote, ''Du mouvement des animaux'', 10, 703a4-b2.</ref>. Le mouvement animal, bien que produit de l'intérieur, a toujours une cause finale externe : l'objet désiré qui meut sans être mû.
==== Les modes de locomotion ====
Le ''De incessu animalium'' décrit et explique les différents modes de locomotion : marche, course, vol, nage. Aristote établit des lois générales : les animaux sanguins ne peuvent avoir plus de quatre points d'appui, car la nature ne fait rien en vain, et quatre suffisent à assurer la stabilité<ref>Aristote, ''De la marche des animaux'', 8, 708a9-708b9.</ref>. Les oiseaux ont des ailes parce qu'ils ont le corps léger et la poitrine large et musculeuse<ref>Aristote, ''De la marche des animaux'', 10, 710a10-710b7.</ref>.
Ces études relèvent de ce que nous appellerions aujourd'hui biomécanique. Elles montrent qu'Aristote ne se contente pas de contempler les formes vivantes, mais cherche à en expliquer le fonctionnement par des causes physiques, sans abandonner le cadre téléologique général qui voit dans la nature l'action d'une finalité immanente.
== La philosophie première : la métaphysique ==
=== Objet et divisions de la métaphysique ===
==== La science de l'être en tant qu'être ====
La métaphysique, qu'Aristote nomme « philosophie première » ou « sagesse », est définie comme la science de l'être en tant qu'être (''on hêi on'') et de ce qui lui appartient essentiellement<ref>Aristote, ''Métaphysique'', Γ, 1, 1003a21-22. Sur l'unité (et la possible disparité) du projet métaphysique aristotélicien, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction et chap. « La science recherchée » ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit.</ref>. Cette formulation distingue la métaphysique des sciences particulières qui étudient un aspect de l'être : la géométrie l'étudie en tant que continu, la biologie en tant que vivant. Seule la métaphysique considérerait l'être dans sa totalité.
Comme le souligne Annick Jaulin, le terme « métaphysique » lui-même n'apparaît jamais dans les traités aristotéliciens : il s'agit d'un titre éditorial donné par Andronicos<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Pellegrin recense quant à lui plusieurs définitions concurrentes de cette science chez Aristote : recherche des premiers principes et des premières causes, science de l'être en tant qu'être, science de la substance, science théologique<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Métaphysique », p. 136-137.</ref>.
Cette science est dite « première » en deux sens : elle porte sur ce qui est premier dans l'ordre de l'être (les principes et causes premiers), et elle examine les principes communs à toutes les sciences, comme le principe de non-contradiction<ref>Aristote, ''Métaphysique'', Γ, 3, 1005a19-b8.</ref>. Elle est aussi qualifiée de « science théologique » car elle porte sur ce qu'il y a de plus divin, le Premier Moteur immobile<ref>Aristote, ''Métaphysique'', Α, 2, 983a5-10.</ref>.
==== La question de l'unité de la métaphysique ====
Comment la métaphysique peut-elle être à la fois ontologie générale, étude de l'être en tant qu'être, et théologie, étude d'un être particulier (Dieu) ? Cette tension a donné lieu à plusieurs interprétations dans l'histoire de la philosophie<ref>Pour un état de la question, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit. ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 1-2.</ref>.
Une lecture, défendue notamment par Werner Jaeger, voit dans le corpus de la ''Métaphysique'' deux projets juxtaposés correspondant à deux périodes différentes de la pensée d'Aristote : une métaphysique ontologique générale, plus tardive, et une métaphysique théologique d'inspiration platonicienne, plus ancienne<ref>Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', op. cit. Cette lecture est cependant aujourd'hui largement contestée ; voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit.</ref>.
Une autre lecture, défendue par Thomas d'Aquin et reprise par toute une tradition, soutient que l'unité est assurée par le fait que Dieu est principe de tout être<ref>Thomas d'Aquin, ''In Metaphysicam Aristotelis Commentaria'', Prooemium.</ref>. C'est ce que la tradition appellera l'« onto-théologie ».
Une troisième lecture, plus récente, défendue notamment par Pierre Aubenque, considère que la synthèse entre ontologie et théologie est en fait impossible et que la ''Métaphysique'' aristotélicienne reste inachevée comme problème<ref>Pierre Aubenque, ''Le problème de l'être chez Aristote'', op. cit. Voir aussi Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 137.</ref>. Une quatrième lecture, présente notamment dans le travail d'Annick Jaulin, refuse de lire l'expression « substance séparée » au sens transcendant et soutient qu'Aristote, plutôt que d'opérer une rupture avec la physique, « réinscrit la substance immobile dans la tradition des penseurs de la nature »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>. Le débat reste ouvert.
==== Les apories de la métaphysique ====
Le livre Β de la ''Métaphysique'' expose méthodiquement les apories, c'est-à-dire les difficultés que rencontre toute tentative de construire une science de l'être et des principes premiers : Y a-t-il une science unique de toutes les causes ? La science de l'être porte-t-elle aussi sur les principes de la démonstration ? Y a-t-il seulement des substances sensibles, ou existe-t-il aussi des substances séparées ? Les principes sont-ils universels ou particuliers ? En acte ou en puissance ?<ref>Aristote, ''Métaphysique'', Β, 1, 995b4-996a17.</ref>
Cette méthode aporétique est caractéristique de la démarche aristotélicienne : « Il faut, pour bien rechercher, avoir auparavant développé les apories »<ref>Aristote, ''Métaphysique'', Β, 1, 995a24-27.</ref>.
=== La substance (livres Z-H) ===
==== Qu'est-ce que la substance ? ====
Si l'être se dit en plusieurs sens, et si la substance est le sens premier de l'être, la question centrale de la métaphysique devient : qu'est-ce que la substance (''ousia'') ?<ref>Aristote, ''Métaphysique'', Ζ, 1, 1028a10-1028b2.</ref> Quatre candidats se présentent : l'essence (''to ti ên einai''), l'universel (''to katholou''), le genre (''to genos''), et le substrat (''to hupokeimenon''). Ce dernier peut être entendu en trois sens : la matière, la forme, ou le composé des deux.
Aristote élimine d'abord l'universel et le genre : ils ne peuvent être substances parce qu'ils se prédiquent de plusieurs choses, alors que la substance de chaque chose lui est propre<ref>Aristote, ''Métaphysique'', Ζ, 13, 1038b8-16.</ref>. Cette exclusion vise notamment la théorie platonicienne des Idées.
L'interprétation de cet examen, et la question de savoir lequel des trois candidats restants (matière, forme, composé) Aristote retient finalement comme substance première, fait l'objet de débats considérables dans la recherche contemporaine. Comme le résume Christof Rapp, « les controverses interprétatives concernant l'interprétation des livres pertinents s'étendent de la question de savoir jusqu'où s'étend le traitement de l{{'}}''ousia'' (seulement le livre Z, ZH ou même ZHΘ), à la question de la structuration interne du traité de l{{'}}''ousia'', en passant par les questions sur l'objectif précis et la finalité philosophique de ces livres, jusqu'à la question de la nature de l'''eidos'' (la forme) – qui est au cours du traité plusieurs fois désignée comme ''ousia'' – et enfin la question du rapport entre matière et forme et l'unité de l{{'}}''ousia'' qui y est liée »<ref>Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', op. cit., chap. IV.18 (traduction libre).</ref>.
==== La forme, candidat à la substantialité ====
Le substrat semble avoir des titres à être appelé substance, puisqu'il est ce dont tout le reste se dit. Mais si l'on identifiait la substance à la matière pure, support ultime de toutes les déterminations, on aboutirait au paradoxe qu'une substance pourrait exister sans aucune détermination<ref>Aristote, ''Métaphysique'', Ζ, 3, 1029a10-26.</ref>.
C'est donc la forme (''morphê'', ''eidos'') qui apparaît, dans plusieurs passages des livres centraux, comme substance au sens propre. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence. Elle est aussi acte (''energeia'') par opposition à la matière qui est puissance (''dynamis''). Un morceau d'airain est en puissance une statue ; quand le sculpteur lui a donné la forme de l'Hermès, il est en acte une statue. La forme actualise la matière et lui confère l'être déterminé<ref>Aristote, ''Métaphysique'', Η, 2, 1042b9-1043a28.</ref>.
==== Le composé de matière et de forme ====
La substance concrète, l'individu réel, n'est ni la matière seule ni la forme seule, mais leur composé (''synolon''). Callias n'est ni simplement de la chair et des os, ni simplement la forme de l'homme, mais cet homme-ci composé de cette chair-ci et de ces os-ci structurés selon la forme humaine<ref>Aristote, ''Métaphysique'', Ζ, 10, 1035b14-27.</ref>.
La forme demeure cependant première en un sens, car c'est elle qui confère l'unité au composé. Sans la forme, la matière ne serait qu'un amas d'éléments disparates. C'est l'âme, forme du corps vivant, qui fait que ce corps est un organisme uni et non un simple agrégat. Dans l'ordre de la connaissance aussi, c'est par la forme qu'on définit et connaît la substance : on définit l'homme par sa forme (animal rationnel), non par sa matière (chair et os)<ref>Aristote, ''Métaphysique'', Ζ, 11, 1037a21-33. Pour une discussion approfondie, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « La substance ».</ref>.
=== Puissance et acte (livre Θ) ===
==== La distinction de la puissance et de l'acte ====
La distinction entre puissance (''dynamis'') et acte (''energeia'', ''entelecheia'') est l'une des contributions majeures d'Aristote à la philosophie. Elle permet de répondre aux apories de Parménide et de Platon concernant le devenir. Comment une chose peut-elle devenir ce qu'elle n'est pas ? En étant en puissance ce qu'elle devient en acte. Le bronze n'est pas une statue, mais il est en puissance une statue, de sorte qu'il peut le devenir sans passer du non-être à l'être<ref>Aristote, ''Métaphysique'', Θ, 6, 1048a30-1048b17.</ref>.
Une chose en puissance n'a pas encore telle propriété, mais elle a la capacité de l'acquérir. La capacité n'est ni l'absence pure (le bronze ne peut pas devenir homme), ni la présence actuelle (ce qui est actuellement chaud n'a plus la capacité de le devenir). Elle est un mode d'être intermédiaire<ref>Aristote, ''Métaphysique'', Θ, 7, 1049a1-18.</ref>.
==== La priorité de l'acte sur la puissance ====
Aristote établit que l'acte est antérieur à la puissance en plusieurs sens : dans l'ordre de la définition (on définit la puissance par l'acte correspondant), dans l'ordre de la connaissance, dans l'ordre de l'essence et du temps<ref>Aristote, ''Métaphysique'', Θ, 8, 1049b10-1050a3.</ref>.
Plus profondément, ce qui est éternellement en acte est antérieur à ce qui peut être tantôt en acte, tantôt en puissance. Or les substances divines sont éternellement en acte, tandis que les substances sensibles passent de la puissance à l'acte et de l'acte à la puissance. Les substances immobiles éternelles sont donc absolument premières<ref>Aristote, ''Métaphysique'', Θ, 8, 1050b6-28.</ref>.
Comme le souligne Annick Jaulin, cette primauté de l'acte sur la puissance n'est pas un simple point doctrinal mais structure l'ensemble de la philosophie première : « la primauté de l'acte sur la puissance permet de poser l'antériorité de la forme sur la matière », et elle « ouvre également la possibilité d'une interprétation positive du devenir »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « La science recherchée ».</ref>.
=== L'Un et le Multiple (livres I-K) ===
==== L'un se dit en plusieurs sens ====
Parallèlement à l'être, l'un aussi se dit en plusieurs sens. Il y a l'un par accident (le musicien et l'homme sont un quand le musicien est homme). Il y a l'un par soi, qui se divise en un par continuité (une route), un par indivisibilité en espèce (tout homme est un par l'espèce), un par le concept et la définition<ref>Aristote, ''Métaphysique'', Ι, 1, 1052a15-1052b14.</ref>.
Les pythagoriciens et Platon avaient fait de l'Un un principe suprême, antérieur même à l'être. Aristote critique cette position : l'un n'est pas une substance séparée, mais une propriété convertible avec l'être<ref>Aristote, ''Métaphysique'', Ι, 2, 1053b16-1054a13.</ref>. Dire qu'une chose est et dire qu'elle est une, c'est la même chose.
==== La pluralité et le nombre ====
La pluralité s'oppose à l'un comme le divisible à l'indivisible. Le nombre est une pluralité mesurée par l'un<ref>Aristote, ''Métaphysique'', Ι, 1, 1053a18-24.</ref>. Cette analyse fonde la possibilité des mathématiques et des sciences quantitatives.
=== Le Premier Moteur immobile (livre Λ) ===
==== La démonstration de l'existence du Premier Moteur ====
Le livre Λ de la ''Métaphysique'' constitue le sommet de la philosophie première aristotélicienne. Après avoir établi que les substances sont premières parmi les êtres, Aristote examine quelles substances existent. Il y a évidemment les substances sensibles, soumises au changement. Mais existe-t-il aussi une substance éternelle immobile ?<ref>Aristote, ''Métaphysique'', Λ, 6, 1071b3-5.</ref>
La démonstration procède à partir du mouvement. Il existe du mouvement, cela est manifeste. Or tout ce qui est mû est mû par autre chose. Ou bien il y a un premier moteur immobile, ou bien la série des moteurs remonte à l'infini. Mais une série infinie de causes ne peut rien expliquer, car en l'absence d'un premier il n'y aurait ni intermédiaire ni dernier<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a19-1072b4.</ref>. Il doit donc exister un premier moteur qui meut sans être mû.
==== La nature du Premier Moteur ====
Ce Premier Moteur est substance, acte pur, éternel, sans parties, sans grandeur. Il meut comme objet de désir et d'intellection : l'intellect désire le bien et se meut vers lui. Le Premier Moteur, étant le bien suprême et l'intelligible suprême, attire vers lui le premier ciel qui l'imite par son mouvement circulaire éternel<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a23-1072b4.</ref>.
Quelle est la vie de ce Premier Moteur ? Il est Pensée, mais que pense-t-il ? Il doit penser ce qu'il y a de plus excellent, donc lui-même. Il est donc Pensée de la Pensée (''noêsis noêseôs noêsis''), intellection qui se pense elle-même dans une contemplation éternellement bienheureuse<ref>Aristote, ''Métaphysique'', Λ, 9, 1074b33-35.</ref>.
==== Les moteurs des sphères ====
Le mouvement des astres requiert, outre le Premier Moteur qui meut la sphère des fixes, une pluralité de moteurs immobiles pour les sphères des planètes. Aristote, se fondant sur l'astronomie d'Eudoxe et de Callippe, compte cinquante-cinq sphères, donc cinquante-cinq moteurs<ref>Aristote, ''Métaphysique'', Λ, 8, 1073a14-1074b14.</ref>. Ces moteurs ne sont pas subordonnés les uns aux autres dans une hiérarchie, mais chacun meut directement sa sphère.
Cette pluralité d'intelligences motrices a posé un problème théologique au Moyen Âge : la tradition péripatéticienne et la scolastique médiévale ont tenté de la concilier avec l'unité divine en faisant des moteurs des substances secondes subordonnées au Premier Moteur. La recherche contemporaine, notamment Annick Jaulin, propose une lecture moins théologique : il s'agirait pour Aristote de fournir une explication causale du mouvement astronomique, sans projet théologique transcendant<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>.
=== Critique de la théorie platonicienne des Idées (livres M-N) ===
==== Les arguments contre les Idées séparées ====
Les livres M et N de la ''Métaphysique'' reprennent et développent la critique de la théorie platonicienne des Idées, déjà amorcée dans le livre A. Aristote reconnaît à Platon le mérite d'avoir affirmé l'existence de réalités intelligibles éternelles, mais lui reproche d'avoir séparé ces formes des choses sensibles et d'en avoir fait des substances subsistant par elles-mêmes<ref>Aristote, ''Métaphysique'', Μ, 4-5, 1078b7-1080a8.</ref>.
Cette séparation est, selon Aristote, inutile et impossible. Inutile, car les Idées ne servent ni à la connaissance des sensibles, ni à leur existence, ni à leur devenir<ref>Aristote, ''Métaphysique'', Α, 9, 991a8-991b9.</ref>. Impossible, car elle conduit à des apories comme l'argument du Troisième Homme<ref>Aristote, ''Métaphysique'', Α, 9, 990b17-991a8.</ref>.
==== Le statut des êtres mathématiques ====
Platon situait les êtres mathématiques (nombres, figures) dans un plan intermédiaire entre les Idées et les sensibles. Aristote refuse cette ontologie tripartite. Les objets mathématiques n'existent pas séparément, mais par abstraction<ref>Aristote, ''Métaphysique'', Μ, 3, 1078a21-31.</ref>. Le mathématicien considère les sensibles non en tant que sensibles mais en tant que continus ou quantifiés, faisant abstraction de leurs autres propriétés.
Cette solution préserve l'objectivité des mathématiques sans multiplier les êtres. Les vérités mathématiques sont nécessaires et universelles parce qu'elles portent sur des propriétés que les choses sensibles possèdent nécessairement, même si ces propriétés ne sont jamais réalisées dans les sensibles avec la perfection qu'étudie le mathématicien<ref>Aristote, ''Métaphysique'', Μ, 2, 1077a9-1077b17.</ref>.
== La philosophie pratique : éthique, politique, rhétorique, poétique ==
=== L'''Éthique à Nicomaque'' – La vie bonne ===
==== Le souverain bien et le bonheur ====
L'''Éthique à Nicomaque'' s'ouvre sur l'affirmation que toute action et toute recherche vise un bien. Parmi les biens, il y en a un qui est visé pour lui-même et en vue duquel tous les autres sont poursuivis : c'est le souverain bien, que tous appellent bonheur (''eudaimonia'')<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1095a14-26. Pour une introduction d'ensemble à l'éthique aristotélicienne, voir Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', Londres, Routledge, 2001 ; Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', Cambridge, Cambridge University Press, 2014.</ref>.
Comme le note Pellegrin, Aristote, dans le premier livre de l'''Éthique à Nicomaque'', « donne l'un des exemples les plus caractéristiques et les plus aboutis du traitement d'une notion léguée par la tradition »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Bonheur (eudaimonia) », p. 37.</ref> : il commence par exposer les opinions reçues sur le bonheur (plaisir, honneurs, richesse, vertu, contemplation), puis examine ce qu'il peut conserver de chacune.
Pour déterminer le bonheur véritable, Aristote recourt à la notion de fonction (''ergon'') : le bien pour chaque être réside dans l'accomplissement de sa fonction propre. La fonction propre de l'homme est l'activité de l'âme rationnelle selon l'excellence. Le bonheur est donc « une activité de l'âme selon la vertu parfaite, dans une vie complète »<ref>Aristote, ''Éthique à Nicomaque'', I, 7, 1098a16-18.</ref>.
L'interprétation de cette définition fait l'objet d'un débat important dans la recherche contemporaine, qui oppose une lecture « inclusiviste » à une lecture « dominante »<ref>Sur ce débat, voir Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', op. cit. ; Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit. La question fait l'objet d'une discussion approfondie dans la littérature anglo-saxonne, notamment depuis les travaux de J.L. Ackrill et T.H. Irwin.</ref>. Selon la lecture inclusiviste, le bonheur consiste en l'exercice de toutes les vertus, morales et intellectuelles, dans une vie complète. Selon la lecture dominante, le bonheur s'identifie à l'activité de la vertu la plus haute, c'est-à-dire la contemplation, comme le suggère le livre X. Cette tension entre deux perspectives au sein même de l'''Éthique à Nicomaque'' (entre les premiers livres, qui semblent privilégier une vie pratique vertueuse, et le livre X, qui exalte la vie contemplative) reste l'objet d'interprétations divergentes.
==== Les vertus éthiques et la doctrine du juste milieu ====
Aristote distingue les vertus intellectuelles (sagesse théorique, prudence) des vertus éthiques ou morales (courage, tempérance, justice). Les vertus morales sont des dispositions acquises par l'habitude à choisir le juste milieu entre deux extrêmes vicieux<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1106b36-1107a2.</ref>.
Ainsi, le courage est le juste milieu entre la lâcheté (défaut de crainte) et la témérité (excès d'audace). La tempérance est le milieu entre l'insensibilité et l'intempérance. La libéralité est le milieu entre l'avarice et la prodigalité<ref>Aristote, ''Éthique à Nicomaque'', II, 7, 1107a33-1108b10.</ref>. Ce milieu n'est pas arithmétique mais relatif à nous : il dépend des circonstances et de l'agent. Toute l'œuvre de la vertu consiste à trouver ce milieu, guidée par la droite raison (''orthos logos'') qu'incarne la prudence<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1107a1-2.</ref>.
Cette doctrine du juste milieu a connu une fortune durable dans la philosophie morale. Elle est aujourd'hui au centre du renouveau de l'éthique des vertus en philosophie morale contemporaine, à la suite des travaux d'Anscombe, MacIntyre et Nussbaum<ref>Voir les contributions à Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit.</ref>.
==== L'amitié ====
Les livres VIII et IX de l'''Éthique à Nicomaque'' traitent de l'amitié (''philia''). Aristote distingue trois espèces d'amitié : l'amitié utile, fondée sur l'intérêt réciproque ; l'amitié agréable, fondée sur le plaisir ; et l'amitié parfaite, celle des hommes vertueux qui s'aiment pour eux-mêmes<ref>Aristote, ''Éthique à Nicomaque'', VIII, 3, 1156a6-1156b7.</ref>.
Seule la dernière est véritablement amitié au sens plein, car elle est durable et réciproque. Les deux premières sont instables, car elles cessent quand cesse l'utilité ou le plaisir. L'amitié parfaite requiert du temps et de l'intimité<ref>Aristote, ''Éthique à Nicomaque'', VIII, 6, 1158a10-15.</ref>.
L'amitié n'est pas seulement agréable, elle est nécessaire à la vie bonne. L'homme est un animal politique qui ne peut s'accomplir dans l'isolement. L'ami est, selon Aristote, un autre soi-même : en conversant avec lui, en partageant ses joies et ses peines, nous nous connaissons et nous accomplissons nous-mêmes<ref>Aristote, ''Éthique à Nicomaque'', IX, 9, 1169b16-1170a4.</ref>.
==== La vie contemplative ====
Le livre X conclut l'éthique en affirmant que le bonheur suprême réside dans la vie contemplative. L'activité théorétique de l'intellect serait la plus haute et la plus autosuffisante. Elle nous apparente aux dieux, qui passent l'éternité dans la contemplation<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177a12-18.</ref>. Aristote reconnaît que cette vie purement intellectuelle dépasse les forces humaines prises isolément, mais affirme que dans la mesure où il y a en nous quelque chose de divin, nous devons tendre vers cette vie<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177b30-34.</ref>.
Comme le souligne Pellegrin, ce passage du livre X introduit la notion de « bonheur achevé » (''teleia eudaimonia'') et déclare que « le bonheur pratique, celui du citoyen vertueux, n'est bonheur "qu'à titre secondaire" »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 39, citant ''Éthique à Nicomaque'', X, 8, 1178a9.</ref>. La cohérence entre cette thèse et l'analyse de l'''eudaimonia'' développée dans les premiers livres est l'une des questions les plus discutées de l'aristotélisme moral contemporain.
=== Les ''Politiques'' – La cité et les constitutions ===
==== L'homme, animal politique ====
Les ''Politiques'' commencent par affirmer que la cité (''polis'') existe par nature et que l'homme est par nature un animal politique<ref>Aristote, ''Politiques'', I, 2, 1252b27-1253a3. Pour une vue d'ensemble de la pensée politique aristotélicienne, voir Marguerite Deslauriers et Pierre Destrée (éd.), ''The Cambridge Companion to Aristotle's Politics'', Cambridge, Cambridge University Press, 2013.</ref>. Cette affirmation s'oppose à la fois aux sophistes, qui faisaient de la société une convention artificielle, et à la tradition cynique, qui prônait l'autarcie individuelle.
L'homme ne peut, selon Aristote, ni vivre ni bien vivre en dehors de la cité, car il a besoin des autres pour satisfaire ses besoins matériels et pour actualiser sa nature rationnelle et morale. La cité n'est pas une simple alliance défensive ou commerciale, mais une communauté de vie bonne, ayant pour fin le bonheur de ses membres<ref>Aristote, ''Politiques'', III, 9, 1280b39-1281a4.</ref>.
Il faut signaler ici que les ''Politiques'' contiennent également des thèses aujourd'hui rejetées : la justification de l'esclavage par nature (livre I) et la subordination des femmes ont fait l'objet de critiques nombreuses, déjà au {{XIXe siècle}} et plus encore dans la philosophie féministe contemporaine. Comme le note Larose, « certains des textes [d'Aristote] choqueront à juste titre le lecteur, en particulier ceux qui traitent du statut de la femme et de l'esclavage. Tout philosophe qu'il soit, Aristote est bien un homme de son temps »<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>.
==== Les formes de constitution ====
Aristote distingue six formes de constitution selon deux critères : le nombre de gouvernants (un seul, quelques-uns, la multitude) et la fin poursuivie (l'intérêt commun ou l'intérêt privé des gouvernants). Les formes droites sont la royauté (gouvernement d'un seul pour le bien commun), l'aristocratie (gouvernement de quelques-uns pour le bien commun), et la république ou ''politeia'' (gouvernement de la multitude pour le bien commun). Les formes déviées sont la tyrannie, l'oligarchie et la démocratie au sens péjoratif de démagogie<ref>Aristote, ''Politiques'', III, 7, 1279a22-1279b10.</ref>.
Comme le souligne Pellegrin, l'originalité d'Aristote ne réside pas dans la quête d'une constitution idéale unique, mais dans l'idée qu'« une constitution est dite droite si elle gouverne la cité en vue de "l'avantage commun" »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Politique », p. 57.</ref>. Aucune constitution n'est absolument la meilleure en tout lieu et en tout temps : la meilleure constitution pour une cité donnée dépend des circonstances – étendue du territoire, richesses, mœurs des habitants. Aristote fait preuve ici d'un réalisme politique qui contraste avec l'utopisme de la ''République'' de Platon.
==== La constitution mixte et la classe moyenne ====
La constitution la plus stable, selon le livre IV, est celle qui mêle des éléments oligarchiques et démocratiques, donnant le pouvoir à la classe moyenne<ref>Aristote, ''Politiques'', IV, 11, 1295a25-1295b1.</ref>. Les classes moyennes ne sont ni assez pauvres pour envier les riches, ni assez riches pour mépriser les pauvres. Elles recherchent la stabilité et l'égalité plutôt que les révolutions<ref>Aristote rappelle aussi que « les bons législateurs sont sortis de la classe moyenne », citant l'exemple de Solon, Lycurgue et Charondas. Voir Daniel Larose, ''Aristote de A à Z'', op. cit., article « Constitution mixte ».</ref>.
Cette théorie de la classe moyenne et de la constitution mixte a influencé la pensée politique occidentale, de Polybe à Montesquieu. La méthode aristotélicienne, comme le souligne Pellegrin, ne se contente pas d'observer la diversité des constitutions, mais « rend la diversité intelligible en en construisant un modèle théorique » à partir d'un nombre fini de paramètres<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 60.</ref>.
==== L'éducation ====
Les derniers livres des ''Politiques'' sont consacrés à l'éducation. Celle-ci ne peut être laissée aux familles privées, car la cité a pour fin de rendre les citoyens vertueux. Il doit donc y avoir une éducation publique commune, qui forme le caractère et l'intelligence des jeunes en vue de la vie civique et de la vie bonne<ref>Aristote, ''Politiques'', VIII, 1, 1337a11-21.</ref>.
Cette éducation comprend la gymnastique pour le corps, la musique pour l'âme, les lettres pour l'usage pratique, et le dessin pour apprécier la beauté des œuvres. Mais son but ultime n'est pas l'utilité mais le loisir bien employé (''scholê''), c'est-à-dire l'activité libre de l'esprit<ref>Aristote, ''Politiques'', VIII, 3, 1337b28-1338a13.</ref>.
=== La ''Rhétorique'' – L'art de persuader ===
==== La rhétorique comme art ====
La ''Rhétorique'' étudie les moyens de persuasion dans tous les genres de discours. Elle est l'homologue (''antistrophos'') de la dialectique : de même que la dialectique enseigne à raisonner sur toute question à partir de prémisses probables, la rhétorique enseigne à persuader tout auditoire sur tout sujet<ref>Aristote, ''Rhétorique'', I, 1, 1354a1-11.</ref>.
Aristote prend ses distances avec la critique platonicienne de la rhétorique formulée dans le ''Gorgias''. Bien utilisée, la rhétorique est un art (''technê'') légitime. Elle sert à défendre la vérité et la justice, car « il serait absurde que l'incapacité de se servir de ses forces corporelles soit honteuse, mais non l'incapacité de se servir de la parole »<ref>Aristote, ''Rhétorique'', I, 1, 1355a20-24.</ref>.
==== Les trois genres rhétoriques ====
Aristote distingue trois genres de rhétorique. Le genre délibératif conseille ou dissuade concernant l'avenir (devons-nous faire la guerre ?). Le genre judiciaire accuse ou défend concernant le passé (X a-t-il commis ce crime ?). Le genre épidictique loue ou blâme concernant le présent (célébrons la vertu du héros)<ref>Aristote, ''Rhétorique'', I, 3, 1358b2-29.</ref>.
Chaque genre a ses lieux propres. Le délibératif porte sur l'utile et le nuisible. Le judiciaire porte sur le juste et l'injuste. L'épidictique porte sur le beau et le laid moral<ref>Aristote, ''Rhétorique'', I, 3, 1358b29-1359a5.</ref>.
==== Les preuves rhétoriques : ethos, pathos, logos ====
Aristote distingue trois moyens de persuasion : l'''ethos'' (le caractère de l'orateur), le ''pathos'' (les émotions de l'auditoire), et le ''logos'' (le raisonnement lui-même)<ref>Aristote, ''Rhétorique'', I, 2, 1356a1-13.</ref>.
L'''ethos'' persuade en inspirant confiance : l'orateur doit paraître prudent, vertueux et bienveillant. Le ''pathos'' persuade en suscitant des émotions favorables à la thèse défendue. Le livre II étudie systématiquement les émotions (colère, pitié, crainte, envie), leurs causes et leurs manifestations. Le ''logos'' persuade par les raisonnements, notamment l'enthymème (syllogisme rhétorique à partir de prémisses probables) et l'exemple (induction rhétorique)<ref>Aristote, ''Rhétorique'', I, 2, 1356a35-1356b5.</ref>.
Cette analyse fonde la rhétorique comme discipline rationnelle et systématique. Elle constituera la base de l'enseignement rhétorique jusqu'à l'époque moderne et nourrit aujourd'hui des recherches actives en philosophie de l'argumentation et théorie de la communication.
=== La ''Poétique'' – La création artistique ===
==== La ''mimêsis'' et la ''catharsis'' ====
La ''Poétique'' étudie l'art poétique, principalement la tragédie et l'épopée. La poésie, comme tous les arts, est imitation (''mimêsis''). Mais elle n'imite pas les choses telles qu'elles sont (c'est le rôle de l'histoire), mais telles qu'elles pourraient ou devraient être selon la vraisemblance ou la nécessité<ref>Aristote, ''Poétique'', 9, 1451a36-1451b5.</ref>. C'est pourquoi la poésie est, selon Aristote, plus philosophique que l'histoire : elle dit l'universel, alors que l'histoire dit le particulier.
La tragédie représente une action sérieuse et complète, en suscitant pitié et crainte, pour opérer la purification (''catharsis'') de ces émotions<ref>Aristote, ''Poétique'', 6, 1449b24-28.</ref>. La doctrine de la ''catharsis'' est l'une des plus discutées de toute la philosophie ancienne. L'interprétation médicale (la tragédie « purge » les émotions excessives) a été défendue notamment par Jacob Bernays au {{XIXe siècle}} ; d'autres interprétations y voient plutôt une « clarification » morale ou cognitive des émotions<ref>Sur ces interprétations divergentes, voir Stephen Halliwell, ''Aristotle's Poetics'', Londres, Duckworth, 1986 ; Christof Rapp, « Katharsis der Emotionen », dans B. Seidensticker et M. Vöhler (éd.), ''Katharsiskonzeptionen vor Aristoteles'', Berlin, De Gruyter, 2007 ; Christof Rapp, « Aristoteles über das Wesen und die Wirkung der Tragödie », dans O. Höffe (éd.), ''Aristoteles. Poetik'', Berlin, Akademie Verlag, 2009. La question demeure ouverte dans la recherche contemporaine.</ref>.
==== La structure de la tragédie ====
Aristote analyse avec précision la structure de la tragédie. Celle-ci doit former un tout avec commencement, milieu et fin. L'intrigue (''mythos'') est l'âme de la tragédie, plus importante que les caractères<ref>Aristote, ''Poétique'', 11, 1452a15-32.</ref>. L'intrigue idéale comprend une péripétie (''peripeteia''), renversement de l'action en sens contraire, et une reconnaissance (''anagnôrisis''), passage de l'ignorance à la connaissance.
Le héros tragique ne doit être ni parfaitement vertueux ni complètement vicieux, mais occuper une position intermédiaire. Son malheur doit résulter non d'un vice mais d'une erreur (''hamartia'')<ref>Aristote, ''Poétique'', 13, 1453a7-10.</ref>. Ainsi Œdipe qui, sans le savoir, tue son père et épouse sa mère, inspire-t-il pitié plutôt que répulsion.
Comme le rappelle Pellegrin, la ''Poétique'' que nous connaissons est une œuvre incomplète : « nous ne possédons qu'une partie, celle qu'Aristote a consacrée à la tragédie, et en partie à l'épopée »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 109.</ref>. La partie consacrée à la comédie est perdue. Ces analyses ont profondément influencé la théorie littéraire occidentale, notamment à la Renaissance avec la redécouverte du traité, et nourrissent encore les débats en théorie littéraire et esthétique contemporaine.
== Réception et postérité ==
L'œuvre d'Aristote a connu une transmission complexe et une réception multiforme dans l'histoire de la pensée. Dans l'Antiquité tardive, les commentateurs néoplatoniciens (Porphyre, Alexandre d'Aphrodise, Simplicius, Philopon) étudient et expliquent ses œuvres, en cherchant souvent à les harmoniser avec le platonisme.
Au IXe siècle, les philosophes et savants du monde arabo-musulman traduisent Aristote en syriaque puis en arabe. Al-Fârâbî (872-950), Avicenne (980-1037) et Averroès (1126-1198), surnommé « le Commentateur », développent un aristotélisme islamique qui sera lui-même reçu en Occident latin. À partir du XIIe siècle, les œuvres d'Aristote, accompagnées des commentaires arabes, sont traduites en latin et transforment l'enseignement universitaire médiéval.
Albert le Grand (1200-1280) et Thomas d'Aquin (1225-1274) intègrent largement Aristote dans la théologie chrétienne, montrant la possibilité d'une articulation entre la philosophie péripatéticienne et la foi. Le thomisme deviendra une philosophie de référence dans l'Église catholique. Cette domination scolastique provoquera, à la Renaissance et à l'époque moderne, des remises en cause variées.
La science moderne, de Galilée à Newton, se construit en partie en réaction à la physique aristotélicienne, mais sans en constituer la simple négation : la recherche récente sur la philosophie naturelle de la Renaissance et la scolastique tardive décrit un tableau plus nuancé, fait à la fois de continuités, de relectures et d'oppositions<ref>Voir notamment, pour les débats sur la transition entre l'aristotélisme tardif et la science moderne, A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', op. cit. ; et l'entrée « Aristotle's Natural Philosophy » de la ''Stanford Encyclopedia of Philosophy''.</ref>.
Au {{XXe siècle}} et au début du {{XXIe siècle}}, plusieurs domaines de la pensée aristotélicienne ont fait l'objet d'un regain d'attention universitaire. En philosophie morale, le renouveau de l'éthique des vertus (Anscombe, MacIntyre, Nussbaum) a remis au premier plan les analyses de l'''Éthique à Nicomaque''<ref>Voir Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit. ; Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', op. cit.</ref>. En philosophie de l'esprit, certains philosophes ont vu dans l'hylémorphisme aristotélicien une alternative aux apories du dualisme cartésien et du réductionnisme matérialiste. En métaphysique, la conception de la substance et des catégories nourrit les débats sur l'ontologie réaliste. En philosophie de la biologie, la téléologie et la conception de l'organisme comme totalité fonctionnelle font l'objet de relectures<ref>Voir notamment Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', op. cit. ; James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
Au-delà de ces actualisations, l'œuvre d'Aristote demeure un objet d'étude central de l'histoire de la philosophie. Comme le rappelle Daniel Larose, « il existe ainsi plusieurs "Aristote" selon les époques » : la pluralité des lectures (logicienne, physicienne, métaphysicienne, théologienne, éthicienne) reflète à la fois la richesse interne de son œuvre et la diversité des projets philosophiques qui s'en sont nourris<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>. La recherche universitaire actuelle aborde le corpus aristotélicien comme un ensemble cohérent sans pour autant le juger systématique au sens classique du terme.
== Notes et références ==
{{Références|colonnes = 2}}
== Bibliographie ==
=== Éditions et traductions de référence ===
* Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014.
* Bekker, Immanuel (éd.), ''Aristotelis Opera'', Berlin, Reimer, 1831-1870.
* Jonathan Barnes (éd.), ''The Complete Works of Aristotle. The Revised Oxford Translation'', Princeton, Princeton University Press, 1984.
* Aristote, ''Catégories'', éd. et trad. R. Bodéüs, Paris, Les Belles Lettres, 2001.
* Aristote, ''Topiques I-IV'', éd. et trad. J. Brunschwig, Paris, Les Belles Lettres, 1967 et 2007.
* Aristote, ''Poétique'', éd. et trad. J. Hardy, Paris, Les Belles Lettres.
* Aristote, ''De l'Âme'', éd. et trad. A. Jannone et E. Barbotin, Paris, Les Belles Lettres.
* Aristote, ''Politique'', éd. et trad. J. Aubonnet, Paris, Les Belles Lettres, 1960 et suiv.
=== Synthèses générales ===
* Pierre Aubenque, ''Le problème de l'être chez Aristote'', Paris, PUF, 1962.
* Jonathan Barnes (éd.), ''The Cambridge Companion to Aristotle'', Cambridge, Cambridge University Press, 1995.
* Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923).
* Daniel Larose, ''Aristote de A à Z'', Paris, PUF, « Que sais-je ? », 2021.
* Pierre Pellegrin, ''Dictionnaire Aristote'', Paris, Ellipses, 2007.
* Pierre Pellegrin, ''Aristote'', Paris, Bordas, 1990.
* David Ross, ''Aristotle'', London, Methuen, 1923.
=== Études spécialisées par domaine ===
* Logique et épistémologie : Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', Paris, Vrin, 2009 ; Jan Lukasiewicz, ''La syllogistique d'Aristote'', trad. fr., Paris, Vrin ; J. Brunschwig, ''Aristote: Topiques I-IV'', Paris, Les Belles Lettres, 1967 et 2007 ; L.A. Dorion, ''Les Réfutations Sophistiques d'Aristote'', Paris, Vrin, 1995.
* Métaphysique : Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', Londres-New York, Routledge, 2004 ; Annick Jaulin, ''Aristote. La métaphysique'', Paris, PUF, 1999 ; Maddalena Bonelli (dir.), ''Physique et métaphysique chez Aristote'', Paris, Vrin ; Michel Narcy et Alonso Tordesillas (dir.), ''La « Métaphysique » d'Aristote. Perspectives contemporaines'', Paris, Vrin ; Richard Bodéüs, ''Aristote et la théologie des vivants immortels'', Montréal-Paris, Bellarmin-Les Belles Lettres, 1992.
* Philosophie de la nature et biologie : Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021 ; James G. Lennox, ''Aristotle's Philosophy of Biology: Studies in the Origins of Life Science'', Cambridge, Cambridge University Press, 2001 ; Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012 ; Allan Gotthelf et James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987 ; A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', Leiden, Brill, 2009.
* Éthique et politique : Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', Cambridge, Cambridge University Press, 2014 ; Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', Londres, Routledge, 2001 ; Marguerite Deslauriers et Pierre Destrée (éd.), ''The Cambridge Companion to Aristotle's Politics'', Cambridge, Cambridge University Press, 2013 ; Pierre-Marie Morel, ''Aristote. Une philosophie de l'activité'', Paris, Flammarion, 2003.
* Synthèses de référence en langue allemande et anglaise : Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', Oxford, Oxford University Press, 2012 ; Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch. Leben – Werk – Wirkung'', Stuttgart, Metzler, 2011.
=== Ressources en ligne ===
* ''Stanford Encyclopedia of Philosophy'', entrées : « Aristotle » ; « Aristotle's Categories » ; « Aristotle's Logic » ; « Aristotle's Metaphysics » ; « Aristotle's Ethics » ; « Aristotle's Political Philosophy » ; « Aristotle's Natural Philosophy » ; « Aristotle's Biology » ; « Aristotle's Aesthetics ». [https://plato.stanford.edu/]
* ''Internet Encyclopedia of Philosophy'', entrée « Aristotle ». [https://iep.utm.edu/aristotle/]
{{Autocat}}
[[Catégorie:Philosophe]]
{{DEFAULTSORT:Aristote}}
nxziicpk0mphzspryt1rzgcjwauoc2m
765039
765038
2026-04-25T13:38:20Z
PandaMystique
119061
/* Méthode et organisation de l'œuvre */
765039
wikitext
text/x-wiki
{{DicoPhilo|Aristote}}
Aristote (en grec ancien Ἀριστοτέλης, ''Aristotélēs'', 384-322 av. J.-C.) est un philosophe grec dont l'œuvre conservée couvre la logique, la philosophie de la nature, la biologie, la métaphysique, l'éthique, la politique, la rhétorique et la poétique. Né à Stagire en Chalcidique, il fut élève de Platon à l'Académie d'Athènes pendant une vingtaine d'années, puis précepteur d'Alexandre de Macédoine, avant de fonder à Athènes sa propre école, le Lycée. La transmission de ses écrits, complexe et partiellement lacunaire, a fortement conditionné l'ordre dans lequel ils nous sont parvenus ainsi que les modalités de leur interprétation : les dialogues exotériques publiés de son vivant ne subsistent qu'à l'état de fragments, tandis que les traités acroamatiques que nous lisons aujourd'hui ont été édités, organisés et titrés au Ier siècle av. J.-C. par Andronicos de Rhodes<ref>Sur l'histoire de la transmission, voir Pierre Pellegrin, ''Dictionnaire Aristote'', Paris, Ellipses, 2007, p. 5-7 ; Annick Jaulin, ''Aristote. La métaphysique'', Paris, PUF, 1999, Introduction.</ref>.
L'œuvre conservée a exercé une influence durable sur la philosophie ancienne tardive, sur les traditions arabe et latine médiévales, ainsi que sur plusieurs renaissances modernes de l'aristotélisme. Sa réception se fait selon des angles variables : les commentateurs néoplatoniciens en font une propédeutique au platonisme, les théologiens médiévaux y voient « le philosophe » par excellence (''Philosophus''), tandis que la science moderne se construit en partie en réaction à la physique péripatéticienne, sans pour autant rompre toujours avec elle de manière unilatérale<ref>Sur la pluralité des « Aristote » selon les époques, voir Daniel Larose, ''Aristote de A à Z'', Paris, PUF, « Que sais-je ? », 2021, Introduction.</ref>. Au {{XXe siècle}}, le projet « génétique » de Werner Jaeger – qui distinguait trois périodes (platonicienne, critique, empirique) dans la pensée du Stagirite – a été largement abandonné par la recherche universitaire, qui aborde aujourd'hui le corpus comme un ensemble cohérent sans être pour autant systématique<ref>Daniel Larose, ''Aristote de A à Z'', op. cit. ; voir aussi Pellegrin, ''Dictionnaire Aristote'', p. 6-8.</ref>.
Le présent article expose successivement la vie et le contexte historique d'Aristote, la constitution et la transmission de son œuvre, son rapport à Platon, puis ses doctrines en logique (l{{'}}''Organon''), philosophie de la nature, biologie, métaphysique et philosophie pratique (éthique, politique, rhétorique et poétique). Une dernière section traite de la réception et de la postérité de la pensée aristotélicienne.
== Vie et contexte historique ==
=== Origines familiales et contexte macédonien ===
Aristote naquit en 384 av. J.-C. à Stagire<ref>Stagire, l'actuelle Stavro, était une colonie grecque de la Chalcidique de Thrace, située sur la côte septentrionale de la mer Égée, à proximité de la Macédoine. Voir Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923), p. 103-104.</ref>, petite cité de la Chalcidique en Macédoine, d'où son surnom de Stagirite<ref>Ce patronyme sera employé tout au long de l'Antiquité pour le désigner. Cf. Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', Göteborg, Almqvist & Wiksell, 1957, p. 253-257.</ref>. Son père, Nicomaque, était médecin et appartenait à la corporation des Asclépiadés, dont les membres prétendaient descendre du dieu de la médecine, Asclépios<ref>Les Asclépiadés formaient une famille sacerdotale de médecins héritiers d'une tradition hippocratique. Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 1, trad. sous la dir. de M.-O. Goulet-Cazé, Paris, Le Livre de Poche, 1999, p. 573.</ref>. Nicomaque exerçait la fonction de médecin personnel et ami (''philos'') du roi Amyntas III de Macédoine<ref>Cette position à la cour macédonienne conférait à la famille d'Aristote un statut privilégié et des relations avec la maison royale. Voir Jean Brun, ''Aristote et le Lycée'', Paris, PUF, « Que sais-je ? », 1961, p. 7-8.</ref><ref>Diogène Laërce, ''Vies'', V, 1, op. cit., p. 573.</ref>.
Sa mère, Phæstias (ou Phaestis), originaire de Chalcis en Eubée, était sage-femme<ref>Certaines sources antiques indiquent qu'elle descendait d'une famille chalcidienne de notables. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 259.</ref>. La famille d'Aristote s'inscrivait ainsi dans un milieu cultivé, marqué à la fois par la pratique médicale rationnelle et par des ascendances ioniennes<ref>Selon Werner Jaeger, ces origines ioniennes pourraient avoir favorisé son goût pour l'investigation scientifique de la nature (''physis''), caractéristique des premiers Physiciens d'Ionie. Voir Werner Jaeger, ''Aristote'', op. cit., p. 105-106. Cette thèse, défendue par Jaeger dans le cadre de son interprétation génétique de la pensée d'Aristote, est aujourd'hui discutée par les historiens.</ref><ref>Ernest Barker, ''The Politics of Aristotle'', Oxford, Clarendon Press, 1946, Introduction, p. XI.</ref>.
Aristote devint orphelin à un âge précoce, perdant son père alors qu'il était encore enfant<ref>Sa mère mourut également jeune, laissant Aristote orphelin de ses deux parents avant ses dix-sept ans. Voir Werner Jaeger, ''Aristote'', op. cit., p. 104.</ref>. Il fut dès lors élevé par Proxène d'Atarnée, un ami de sa famille, originaire d'Atarnée en Mysie<ref>Atarnée était une cité située en Asie Mineure, en Troade. Diogène Laërce, ''Vies'', V, 3, op. cit., p. 574.</ref>. En reconnaissance, Aristote adoptera plus tard Nicanor, le fils de Proxène, et lui destinera sa propre fille Pythias par son testament<ref>Le testament d'Aristote, conservé par Diogène Laërce (V, 11-16), témoigne de ces liens familiaux durables. Voir l'édition dans Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014, p. 2597-2600.</ref><ref>Ces nouvelles attaches familiales constitueront les premiers rapports qu'Aristote entretiendra avec la région d'Atarnée, où il rencontrera plus tard Hermias, le futur tyran du lieu. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>.
=== Formation à l'Académie de Platon (367-347 av. J.-C.) ===
À l'âge de dix-sept ans, en 367-366 av. J.-C., Aristote se rend à Athènes, qui demeure alors, malgré son déclin politique et économique après les Guerres du Péloponnèse, l'un des principaux foyers intellectuels du monde grec<ref>Sous l'archontat de Polyzélos (selon Denys d'Halicarnasse) ou de Nausigénès (selon d'autres sources). Apollodore d'Athènes, cité par Diogène Laërce, V, 9, op. cit., p. 577.</ref>. Il entre à l'Académie de Platon, école philosophique fondée vers 387 av. J.-C.<ref>L'Académie tirait son nom du gymnase d'Académos, situé dans un faubourg d'Athènes. Voir Harold Cherniss, ''The Riddle of the Early Academy'', Berkeley, University of California Press, 1945, p. 1-72.</ref>. Cette institution dispensait un enseignement encyclopédique en mathématiques, astronomie, musique, dialectique, politique et philosophie<ref>Léon Robin, ''Aristote'', Paris, PUF, 1944, p. 3.</ref>.
Aristote y demeura vingt ans, jusqu'à la mort de Platon en 348-347 av. J.-C.<ref>Apollodore d'Athènes, cité par Diogène Laërce (V, 9-10), fournit cette chronologie. Voir Diogène Laërce, ''Vies'', op. cit., p. 577-578.</ref>. La tradition antique rapporte que Platon l'aurait surnommé le Liseur (''anagnôstês'') ou l'Intelligence de l'école (''ho nous tês scholês'')<ref>Ces surnoms, qui pourraient attester la reconnaissance par le Maître des dons de son élève, sont rapportés par les sources biographiques tardives. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 325-327.</ref><ref>''Vita Marciana'', dans Valentin Rose, ''Aristoteles Pseudepigraphus'', Leipzig, Teubner, 1863, p. 428 ; Jean Philopon, dans Proclus, ''De aeternitate mundi'', VI, 27, éd. Hugo Rabe, Leipzig, Teubner, 1899, p. 145.</ref>.
La tradition d'une rupture violente entre Aristote et Platon, attestée par certaines sources tardives, est aujourd'hui considérée par la critique moderne comme issue probablement des polémiques ultérieures entre épicuriens et péripatéticiens<ref>Les récits de Diogène Laërce évoquant une rupture violente sont jugés peu fiables par la plupart des biographes modernes. Voir Werner Jaeger, ''Aristote'', op. cit., p. 113-128.</ref>. Plusieurs éléments suggèrent au contraire des liens durables entre les deux philosophes : Aristote composa une élégie en l'honneur de son ami Eudème de Chypre, où il évoque Platon comme un maître<ref>Fragment 623 (Rose), conservé par Olympiodore. Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886, p. 42-43.</ref>. Dans l{{'}}''Éthique à Nicomaque'', Aristote écrit : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels, surtout quand on est philosophe : vérité et amitié nous sont chères l'une et l'autre, mais c'est pour nous un devoir sacré d'accorder la préférence à la vérité »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096 a 12-17, trad. J. Tricot, Paris, Vrin, 1959, p. 44.</ref><ref>Cette phrase a été condensée en latin par l'adage ''Amicus Plato, sed magis amica veritas'' : « ami de Platon, mais plus encore ami de la vérité ». Voir Ammonius, ''In Categorias'', éd. Busse, Berlin, Reimer, 1895, p. 79.</ref>.
Aristote participa à l'enseignement de l'Académie. On lui attribue notamment la charge du cours de rhétorique, qu'il aurait inauguré, selon certains témoignages, par cette formule : « Il serait honteux de se taire et de laisser parler Isocrate »<ref>Cette boutade visait Isocrate, le rival de Platon en matière d'enseignement rhétorique. Voir Werner Jaeger, ''Aristote'', op. cit., p. 180-182.</ref><ref>Philodème, ''Volumina rhetorica'', II, 36, 3-5, éd. Siegfried Sudhaus, Leipzig, Teubner, 1892-1896, vol. II, p. 50 ; Cicéron, ''De Oratore'', III, 35, 141 ; Quintilien, ''Institutio oratoria'', III, 1, 14.</ref>. Cette période fut également celle de ses premières publications, sous forme de dialogues à la manière platonicienne, dont la plupart sont aujourd'hui perdus<ref>Cicéron loua plus tard la qualité littéraire de ces dialogues, parlant d'un ''flumen orationis aureum'' : « un fleuve d'or de paroles ». Cicéron, ''Academica priora'', II, 38, 119.</ref>.
=== Voyages et maturation (348-335 av. J.-C.) ===
À la mort de Platon en 347, c'est le neveu du Maître, Speusippe, qui prend la direction de l'Académie. Aristote quitte alors Athènes — selon certaines hypothèses parce qu'il aurait espéré la succession, selon d'autres en raison du climat politique antimacédonien<ref>Voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 5.</ref>. Il se rend à Atarnée et Assos, en Troade (Asie Mineure), auprès de son ami Hermias, ancien condisciple de l'Académie devenu tyran d'Atarnée<ref>Hermias avait été esclave, puis affranchi, avant de devenir maître d'Atarnée et d'Assos. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>. Aristote y séjourne trois ans (347-345), accompagné probablement de Xénocrate<ref>Strabon, ''Géographie'', XIII, 1, 57, trad. F. Lasserre, Paris, Les Belles Lettres, 1981, p. 84-85.</ref>. Il y poursuit ses recherches philosophiques et biologiques<ref>C'est durant ce séjour qu'Aristote aurait entrepris des observations sur la faune marine de la côte d'Asie Mineure, dont témoignent l{{'}}''Histoire des Animaux'' et d'autres traités zoologiques. Voir David M. Balme, « The Place of Biology in Aristotle's Philosophy », dans Allan Gotthelf & James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987, p. 9-20.</ref>.
Hermias, pris dans les luttes entre la Macédoine et la Perse, fut capturé en 341 av. J.-C. par trahison sur ordre d'Artaxerxès III, le roi de Perse, torturé et exécuté<ref>Selon les sources antiques, Hermias refusa, malgré les tortures, de trahir ses liens avec Philippe II de Macédoine. Voir Werner Jaeger, ''Aristote'', op. cit., p. 138-142.</ref><ref>Diodore de Sicile, ''Bibliothèque historique'', XVI, 52, trad. P. Goukowsky, Paris, Les Belles Lettres, 1976, p. 164-165.</ref>. Aristote composa un Hymne à la Vertu en son honneur et fit ériger une statue à Delphes portant une épigramme à sa mémoire<ref>Fragments 624 et 625 (Rose), conservés par Diogène Laërce (V, 7-8) et Athénée (''Deipnosophistes'', XV, 696 a-c). Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', op. cit., p. 43-44.</ref>. Il épousa également Pythias, nièce ou fille adoptive d'Hermias, dont il aura une fille du même nom<ref>Dans son testament, Aristote prescrit que ses cendres soient mêlées à celles de Pythias. Diogène Laërce, ''Vies'', V, 16, op. cit., p. 582.</ref>.
Après la mort d'Hermias, Aristote quitte Assos pour Mytilène, sur l'île de Lesbos, en 345-344 av. J.-C. Il y poursuit pendant deux à trois ans ses observations biologiques et zoologiques, notamment sur les lagunes de Pyrrha<ref>De nombreuses observations précises de l{{'}}''Histoire des Animaux'' se rapportent à la faune de Lesbos. Voir Pierre Louis, « Introduction », dans Aristote, ''Histoire des Animaux'', tome I, Paris, Les Belles Lettres, 1964, p. XIV-XVIII.</ref>.
=== Précepteur d'Alexandre le Grand (343-336 av. J.-C.) ===
En 343-342 av. J.-C., Philippe II de Macédoine, qui avait connu Aristote dans sa jeunesse grâce à Nicomaque, appelle le philosophe à la cour de Pella pour devenir le précepteur de son fils, le jeune prince Alexandre, alors âgé de treize ans<ref>Voir Werner Jaeger, ''Aristote'', op. cit., p. 145-148.</ref><ref>Plutarque, ''Vie d'Alexandre'', 7-8, trad. R. Flacelière & É. Chambry, Paris, Les Belles Lettres, 1975, p. 33-34.</ref>. Aristote enseigne au prince pendant deux ou trois ans, probablement à Miéza<ref>Miéza était située à l'ouest de Pella, dans un environnement champêtre propice aux études. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 15-16.</ref>.
L'enseignement donné à Alexandre portait essentiellement sur la politique, l'éthique, la poésie et les lettres grecques<ref>Selon Plutarque, Aristote aurait fait connaître à Alexandre une édition annotée de l{{'}}''Iliade''. Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref><ref>Plutarque rapporte également un mot d'Alexandre selon lequel il aimait Aristote autant que son père : « si je dois la vie à l'un, je dois à l'autre de savoir bien vivre ». Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref>. Aristote composa peut-être à cette époque un traité ''Sur la Royauté'' (''Peri basileias''), aujourd'hui perdu<ref>Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', Louvain, Éditions universitaires, 1951, p. 157-158.</ref>.
Les relations entre le maître et l'élève demeurent difficiles à reconstituer avec certitude. Alors qu'Aristote, dans ses ''Politiques'', prône une distinction entre Grecs et Barbares<ref>Aristote considère, dans certains passages, que les Barbares sont naturellement faits pour être gouvernés par les Grecs. Aristote, ''Politique'', I, 2, 1252 b 5-9, trad. J. Aubonnet, Paris, Les Belles Lettres, 1960, p. 10-11.</ref>, Alexandre adopta une politique d'intégration des peuples conquis et de fusion entre Grecs et Orientaux<ref>Sur ces divergences, voir Werner Jaeger, ''Aristote'', op. cit., p. 148-152.</ref>. En 335 av. J.-C., lors du départ d'Alexandre pour la conquête de l'Asie, Aristote propose son neveu Callisthène pour l'accompagner comme conseiller et historiographe<ref>Voir Felix Jacoby, ''Die Fragmente der griechischen Historiker'', Berlin, Weidmann, 1923-1958, 124 F 1.</ref>. Callisthène, refusant d'adopter la proskynèse exigée par Alexandre, encourut sa disgrâce et fut exécuté vers 327 av. J.-C.<ref>Diogène Laërce (V, 5) et Plutarque (''Vie d'Alexandre'', 55) rapportent cette fin. Voir Diogène Laërce, ''Vies'', op. cit., p. 575-576 ; Plutarque, ''Vie d'Alexandre'', op. cit., p. 81-83.</ref>.
=== Fondation du Lycée et enseignement à Athènes (335-323 av. J.-C.) ===
En 335-334 av. J.-C., après la défaite athénienne face à la Macédoine à Chéronée (338 av. J.-C.), Aristote retourne à Athènes. Il y fonde sa propre école, le Lycée (''Lykeion''), nommé d'après le temple d'Apollon Lycien situé à proximité<ref>Le Lycée était un gymnase entouré de jardins et de promenoirs couverts (''peripatoi''), d'où le nom d'« école péripatéticienne » donné aux disciples d'Aristote. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 21-24.</ref><ref>Le site archéologique du Lycée fut découvert fortuitement en 1996 lors de travaux au centre d'Athènes. Voir Effi Lygouri, « The Lyceum of Aristotle in Athens », dans ''Acta Musei Nationalis Pragae. Series A – Historia'', 60, 1-2, 2006, p. 47-52.</ref>.
Aristote y enseigne pendant douze ou treize ans, de 335 à 323 av. J.-C., période durant laquelle il rédige la plupart des traités systématiques (''pragmateiai'') qui nous sont parvenus<ref>Ces traités, dits « acroamatiques » ou « ésotériques », étaient destinés à l'enseignement interne, par opposition aux dialogues « exotériques » écrits pour un large public. Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', op. cit., p. 3-85.</ref>. Selon Aulu-Gelle, son enseignement comportait deux modalités : le matin, des leçons approfondies sur la philosophie, la physique et la métaphysique, réservées aux disciples avancés ; l'après-midi, des cours plus accessibles de rhétorique et de dialectique, ouverts à un public plus large<ref>Aulu-Gelle, ''Nuits attiques'', XX, 5, trad. R. Marache, Paris, Les Belles Lettres, 1978, tome IV, p. 185-186.</ref>.
Aristote professait, selon la tradition, en se promenant (''peripatein'') avec ses disciples dans les allées du gymnase, d'où le nom d'école péripatéticienne donné à son école<ref>Diogène Laërce, ''Vies'', V, 2, op. cit., p. 574.</ref>. Il constitua au Lycée une bibliothèque et des collections d'histoire naturelle (animaux, plantes, minéraux, cartes géographiques)<ref>Selon Pline l'Ancien, Alexandre aurait aidé son ancien maître en lui envoyant d'Asie des spécimens zoologiques et botaniques. Pline l'Ancien, ''Histoire naturelle'', VIII, 17, trad. A. Ernout, Paris, Les Belles Lettres, 1952, p. 23. Cette tradition est cependant tardive et son authenticité est discutée.</ref>. Il entreprit également avec ses collaborateurs la rédaction des 158 Constitutions (''Politeiai'') des cités grecques et barbares, dont seule la ''Constitution d'Athènes'' nous est parvenue<ref>Cette œuvre fut probablement un travail collectif sous la direction d'Aristote. Voir Mortimer Chambers, « Aristotle's Forms of Democracy », dans ''Transactions and Proceedings of the American Philological Association'', 92, 1961, p. 20-36.</ref>.
=== Exil et mort (323-322 av. J.-C.) ===
À la mort d'Alexandre le Grand, survenue à Babylone en juin 323 av. J.-C., une réaction antimacédonienne éclate à Athènes<ref>Voir Werner Jaeger, ''Aristote'', op. cit., p. 387-390.</ref>. Aristote, en tant que métèque proche de la Macédoine, se trouve menacé<ref>En tant que métèque, Aristote n'avait jamais eu le droit de cité athénien. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 32-33.</ref>. Un certain Démophile, peut-être prêtre d'Éleusis, l'accuse d'impiété (''asebeia''), lui reprochant d'avoir composé l'Hymne à la Vertu en l'honneur d'Hermias, honneur normalement réservé aux dieux<ref>Cette accusation rappelle évidemment le procès de Socrate en 399 av. J.-C. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 346-350.</ref><ref>Diogène Laërce, ''Vies'', V, 5-6, op. cit., p. 575-576.</ref>.
Sans attendre le jugement, Aristote quitte Athènes et se réfugie à Chalcis, en Eubée, ville natale de sa mère<ref>Selon Aulu-Gelle, Aristote aurait déclaré vouloir « empêcher les Athéniens de commettre un second crime contre la philosophie », allusion au procès de Socrate. Aulu-Gelle, ''Nuits attiques'', III, 3, 10, op. cit., tome I, p. 151.</ref>. Il confie la direction du Lycée à Théophraste d'Érèse<ref>Théophraste dirigera le Lycée pendant trente-cinq ans, jusqu'en 288-287 av. J.-C. Voir Diogène Laërce, ''Vies'', V, 36-57, op. cit., p. 590-601.</ref>.
Aristote meurt à Chalcis en 322 av. J.-C., à l'âge de soixante-deux ans, probablement des suites d'une maladie d'estomac<ref>La légende d'un suicide par absorption de ciguë, rapportée par certaines sources tardives, n'est pas retenue par les historiens modernes. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 350-355.</ref><ref>Son testament, conservé par Diogène Laërce (V, 11-16), prescrit notamment que ses cendres soient mêlées à celles de sa première épouse Pythias. Voir Diogène Laërce, ''Vies'', op. cit., p. 579-582.</ref>. Ses cendres furent inhumées à Stagire<ref>Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 355-358.</ref>.
Aristote laissait deux enfants : Pythias, née de son premier mariage, destinée à épouser Nicanor, le fils adoptif du philosophe, et Nicomaque, né de son second mariage avec Herpyllis d'Assos<ref>C'est à ce dernier que fut dédiée l'''Éthique à Nicomaque'' — sans qu'il soit certain que ce titre traduise une dédicace personnelle plutôt qu'un choix éditorial postérieur. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 35-36.</ref><ref>Dans son testament, Aristote témoigne d'une grande reconnaissance envers Herpyllis. Diogène Laërce, ''Vies'', V, 12-13, op. cit., p. 580.</ref>.
== L'œuvre aristotélicienne : constitution et transmission ==
La constitution et la transmission de l'œuvre d'Aristote représentent l'un des dossiers les plus complexes de l'histoire de la philosophie antique. L'accès à la pensée du Stagirite est tributaire d'un processus historique long, marqué par des péripéties qui ont conditionné la forme sous laquelle nous lisons aujourd'hui ses écrits<ref>Pour une synthèse récente, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 5-7 ; Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>.
=== La double nature de l'œuvre aristotélicienne ===
L'œuvre d'Aristote se composait à l'origine de deux types d'écrits distincts. D'une part, les écrits exotériques (ἐξωτερικοὶ λόγοι), destinés à un public extérieur à l'école et composés sous forme de dialogues à la manière platonicienne entre 360 et 345 av. J.-C.<ref>Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 22-27.</ref>. Ces dialogues de jeunesse, dont Cicéron louait les qualités littéraires en qualifiant le style d'Aristote de « fleuve d'or » (''flumen aureum'')<ref>Cicéron, ''Academica'', II, 38, 119.</ref>, comprenaient notamment le ''Gryllos ou De la rhétorique'', l'''Eudème ou De l'âme'' sur l'immortalité de l'âme, le ''Protreptique'' et le traité ''Sur la philosophie''<ref>Fragments rassemblés dans V. Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886.</ref>. Ces œuvres ne nous sont parvenues que sous forme de fragments.
D'autre part, les écrits acroamatiques ou ésotériques (ἀκροαματικοί, ἐσωτερικοί), réservés aux disciples du Lycée et destinés à un usage interne à l'école<ref>Sur cette distinction, voir Aulu-Gelle, ''Nuits attiques'', XX, 5 ; Plutarque, ''Vie d'Alexandre'', 7.</ref>. Ces textes constituent l'essentiel du corpus aristotélicien tel que nous le connaissons aujourd'hui. Ils prennent vraisemblablement la forme de notes de cours, de résumés ou de mémoires de recherche élaborés par Aristote et ses collaborateurs. Selon Pierre Pellegrin, on pourrait considérer en termes modernes que « le texte aristotélicien que nous lisons aujourd'hui est plutôt le compte-rendu d'un séminaire donné par Aristote, qu'un ouvrage rédigé en bonne et due forme »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>.
=== Le sort de la bibliothèque d'Aristote ===
L'histoire de la transmission est intimement liée au destin de la bibliothèque personnelle d'Aristote. À sa mort en 322 av. J.-C., Aristote légua sa bibliothèque à son successeur à la tête du Lycée, Théophraste d'Érèse<ref>Diogène Laërce, ''Vies'', V, 51-52.</ref>. Selon le récit de Strabon, à la mort de Théophraste vers 288 av. J.-C., la bibliothèque fut léguée à Nélée de Scepsis, fils de Coriscos et disciple d'Aristote et de Théophraste<ref>Strabon, ''Géographie'', XIII, 1, 54 (608-609 C) ; voir aussi Plutarque, ''Sylla'', 26, 1-3.</ref>.
Nélée, en quittant Athènes pour retourner à Scepsis en Troade, emporta avec lui les manuscrits autographes d'Aristote et de Théophraste. Ses descendants, peu instruits selon Strabon, auraient caché ces livres dans une cave pour éviter qu'ils ne soient confisqués par les rois Attalides de Pergame<ref>Strabon, ''Géographie'', XIII, 1, 54.</ref>. Les ouvrages auraient ainsi été enfouis pendant près de deux siècles. Ce récit de Strabon, longtemps accepté tel quel, est aujourd'hui partiellement contesté : la recherche moderne souligne qu'il ne faut pas conclure de la dispersion d'une partie des manuscrits autographes que les œuvres d'Aristote auraient été totalement inaccessibles avant Andronicos<ref>Voir P. Moraux, ''Der Aristotelismus bei den Griechen'', vol. I, Berlin-New York, De Gruyter, 1973, p. 3-31. La critique moderne souligne que les philosophes hellénistiques (stoïciens, épicuriens) connaissaient et discutaient certaines thèses aristotéliciennes, ce qui suppose un accès au moins partiel aux écrits du Stagirite.</ref>.
Ce n'est qu'au début du Ier siècle av. J.-C. que ces textes furent redécouverts et achetés par Apellicon de Téos, un riche bibliophile athénien<ref>Athénée, ''Deipnosophistes'', V, 214d = Posidonios, FGrHist 87 F 36.</ref>. Apellicon entreprit de restaurer les manuscrits endommagés, mais aurait, selon Strabon, commis de nombreuses erreurs en comblant les lacunes<ref>Strabon, ''Géographie'', XIII, 1, 54.</ref>.
=== Le transfert à Rome et l'édition d'Andronicos ===
En 86 av. J.-C., lors de la prise d'Athènes, le général Sylla s'empara de la bibliothèque d'Apellicon et la fit transporter à Rome<ref>Plutarque, ''Sylla'', 26, 2 ; Strabon, ''Géographie'', XIII, 1, 54.</ref>. À Rome, ces manuscrits furent confiés au grammairien Tyrannion d'Amisos<ref>Strabon, ''Géographie'', XIII, 1, 54 ; Cicéron, ''Lettres à Atticus'', IV, 10, 1.</ref>.
C'est finalement Andronicos de Rhodes, onzième scholarque du Lycée et philosophe péripatéticien actif vers 60 av. J.-C., qui établit la première édition systématique des œuvres d'Aristote et de Théophraste<ref>Porphyre, ''Vie de Plotin'', 24 ; voir aussi David l'Arménien, ''Prolégomènes'', CAG XVIII, 2, p. 32-33.</ref>. Andronicos ne se contenta pas de publier les textes : il les organisa selon un ordre thématique probablement différent de celui voulu par Aristote, en regroupant les traités par affinité de contenu. La division traditionnelle du corpus en écrits logiques (réunis plus tard sous le titre d'Organon), physiques, biologiques, métaphysiques, éthiques et politiques en résulte<ref>Voir Simplicius, ''In Categorias'', CAG VIII, p. 4, 28-5, 4 ; Alexandre d'Aphrodise, ''In Metaphysica'', CAG I, p. 171, 5-8.</ref>. Comme le souligne Pellegrin, Andronicos « a uni des passages qui étaient originairement disjoints, gommé des contradictions, ménagé des transitions », et il a probablement « introduit dans le texte des matériaux issus de discussions et de critiques » faites en marge des cours du Lycée<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>.
C'est également à Andronicos que l'on doit le titre de Métaphysique (τὰ μετὰ τὰ φυσικά), qui signifie littéralement « ce qui vient après les [livres] physiques »<ref>Voir ''Métaphysique'', éd. W.D. Ross, Oxford, Clarendon Press, 1924, vol. I, p. XXXII-XLIII ; Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Aristote lui-même n'utilisait jamais ce terme, préférant parler de « philosophie première » (πρώτη φιλοσοφία) ou de « science théologique » (θεολογική)<ref>Aristote, ''Métaphysique'', E (VI), 1, 1026a19-23 ; K (XI), 7, 1064b1-3.</ref>.
=== Les conséquences pour notre accès au texte ===
Cette histoire éditoriale a eu des conséquences majeures pour notre connaissance de la pensée d'Aristote. La perte quasi totale des écrits exotériques nous prive d'un pan de son œuvre, celui qui était le mieux connu dans l'Antiquité<ref>Sur l'« autre » Aristote perdu, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>. L'état fragmentaire des manuscrits retrouvés et leur restauration introduisent des incertitudes textuelles. L'organisation systématique imposée par Andronicos, bien qu'elle ait permis la préservation et la diffusion de l'œuvre, ne correspond probablement pas à l'ordre de composition ni à l'organisation originelle voulue par Aristote.
La reconstruction d'une chronologie relative des œuvres pose des difficultés méthodologiques. Werner Jaeger, dans son ouvrage ''Aristoteles. Grundlegung einer Geschichte seiner Entwicklung'' (1923), a proposé de dater les textes selon leur plus ou moins grande proximité avec le platonisme<ref>Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', op. cit.</ref>. Cette « approche génétique » a été largement critiquée et n'est plus acceptée dans son ensemble : le « degré de platonicité » d'un texte est difficile à évaluer, et le corpus aristotélicien se prête mal aux examens stylométriques utilisés pour le corpus platonicien<ref>Pour une critique de l'approche génétique de Jaeger, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6-8 ; Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction. La recherche actuelle aborde l'œuvre comme un tout cohérent sans pour autant la juger systématique.</ref>.
Le texte d'Aristote tel que nous le connaissons est ainsi le produit d'une longue chaîne de transmission, qui passe par les commentateurs néoplatoniciens (Alexandre d'Aphrodise, Simplicius, Philopon), la tradition arabe médiévale (Al-Fârâbî, Avicenne, Averroès), puis la redécouverte occidentale à partir du XIIIe siècle<ref>Pour l'histoire de la transmission médiévale, voir F.E. Peters, ''Aristoteles Arabus'', Leiden, Brill, 1968 ; L. Minio-Paluello, ''Opuscula. The Latin Aristotle'', Amsterdam, Hakkert, 1972.</ref>.
== Aristote et Platon : continuité et rupture ==
La relation entre Aristote et Platon a fait l'objet d'interprétations divergentes dans l'histoire de la philosophie. Les commentateurs néoplatoniciens, de Porphyre à Simplicius, ont insisté sur l'harmonie fondamentale entre les deux philosophes<ref>Simplicius, ''In Categorias'', CAG VIII, éd. K. Kalbfleisch, Berlin, Reimer, 1907, p. 7, 23-32.</ref>. À l'inverse, une partie de la tradition occidentale, depuis la Renaissance, a mis l'accent sur leurs divergences. Coleridge résume cette opposition dans la formule : « Tout homme est né aristotélicien ou platonicien »<ref>Samuel Taylor Coleridge, ''Table Talk'', 2 juillet 1830, dans ''The Table Talk and Omniana of Samuel Taylor Coleridge'', Londres, Oxford University Press, 1917, p. 90.</ref>.
La recherche contemporaine privilégie une approche plus nuancée, qui examine simultanément les points de continuité et de rupture. Aristote s'oppose à Platon sur des questions ontologiques fondamentales, tout en demeurant tributaire de l'héritage académicien. Comme il l'écrit lui-même : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096a11-17, trad. J. Tricot, op. cit., p. 44.</ref>.
=== La critique aristotélicienne des Idées platoniciennes ===
==== Le rejet de la séparation (''chôrismos'') ====
L'un des points de rupture entre Aristote et Platon concerne le statut ontologique des Idées ou Formes (''eidos''). Pour Platon, les Idées constituent un monde intelligible séparé (''chôristos'') du monde sensible. Elles sont immuables, éternelles, et possèdent une existence autonome et transcendante. Les choses sensibles ne sont que des copies imparfaites qui participent (''methexis'') aux Idées ou les imitent (''mimêsis'')<ref>Platon, ''Phédon'', 74a-75d, 100c-102a ; ''République'', VI, 509d-511e, trad. É. Chambry, Paris, Les Belles Lettres, 1932-1934.</ref>. Dans le ''Phédon'', Platon affirme ainsi que « rien d'autre ne rend belle une chose que la présence ou la communion (on ne sait comment elle se fait) avec le Beau en soi »<ref>Platon, ''Phédon'', 100d, trad. M. Dixsaut, Paris, Flammarion, 1991, p. 315.</ref>.
Aristote refuse cette séparation des Idées. Dans la ''Métaphysique'', il consacre plusieurs chapitres à une critique systématique de la théorie platonicienne<ref>Aristote, ''Métaphysique'', A, 6, 987a29-988a17 ; A, 9, 990a34-993a10 ; M, 4-5, 1078b7-1080a11 ; N, 2, 1088b35-1090a2.</ref>. Ses objections portent sur trois points principaux<ref>Pour une analyse détaillée de ces critiques, voir Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', Londres-New York, Routledge, 2004, chap. 3-4.</ref>.
Premièrement, l'inutilité explicative des Idées séparées. Aristote soutient que les Idées ne peuvent rendre compte ni de l'existence ni du devenir des choses sensibles : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est prononcer des mots vides et faire des métaphores poétiques »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22, trad. J. Tricot, Paris, Vrin, 1953, t. I, p. 61.</ref>. Les Idées platoniciennes, étant immobiles et éternelles, ne peuvent expliquer le mouvement et le changement observés. Selon Aristote, Platon n'a pas identifié la cause efficiente (''archê tês kinêseôs'')<ref>Aristote, ''Métaphysique'', A, 9, 992a24-29.</ref>.
Deuxièmement, l'argument du « Troisième Homme ». Aristote reprend ici une objection déjà formulée dans le ''Parménide'' de Platon lui-même<ref>Platon, ''Parménide'', 132a-b.</ref>. Si l'on postule une Idée séparée de l'Homme pour expliquer ce que plusieurs hommes ont en commun, alors on doit également postuler une troisième Idée pour expliquer ce que l'Idée de l'Homme et les hommes particuliers ont en commun, et ainsi à l'infini<ref>Aristote, ''Métaphysique'', A, 9, 990b15-17 ; Z, 13, 1039a2-3 ; ''De la Sophistique'', 22, 178b36-179a10.</ref>.
Troisièmement, le dédoublement inutile du monde. Postuler un monde intelligible d'Idées séparées revient, selon Aristote, à « doubler les difficultés » sans les résoudre<ref>Aristote, ''Métaphysique'', A, 9, 990b1-4.</ref>. « Les Platoniciens font exister autant de substances séparées qu'il y a de choses naturelles, comme si quelqu'un, voulant compter des objets, estimait qu'il ne le pourrait pas quand ils sont en petit nombre, et croyait y parvenir en les multipliant »<ref>Aristote, ''Métaphysique'', A, 9, 990b4-8, trad. J. Tricot, op. cit., p. 60.</ref>.
==== L'hylémorphisme aristotélicien ====
À la théorie platonicienne de la participation, Aristote oppose la théorie hylémorphique. Selon cette conception, les êtres sensibles ne sont pas des copies imparfaites d'Idées transcendantes, mais des composés (''sunolon'') de matière (''hulê'') et de forme (''morphê'' ou ''eidos'')<ref>Aristote, ''Métaphysique'', Z, 3, 1029a1-7 ; H, 1-3, 1042a24-1043b23 ; ''Physique'', II, 1-2, 192b8-194a12.</ref>.
La forme aristotélicienne n'est pas séparée des choses sensibles : elle est immanente à la matière qu'elle informe. La forme du cheval n'existe pas dans un monde intelligible séparé, mais uniquement dans les chevaux individuels concrets. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence (''to ti ên einai'')<ref>Aristote, ''Métaphysique'', Z, 4-6, 1029b13-1031b14 ; Z, 7, 1032b1-2.</ref>. « Par forme, j'entends l'essence de chaque chose et sa substance première »<ref>Aristote, ''Métaphysique'', Z, 7, 1032b1-2, trad. J. Tricot, op. cit., t. I, p. 372.</ref>.
Cette conception hylémorphique permet de répondre à plusieurs problèmes posés par la théorie platonicienne. Elle explique le devenir : la génération d'une substance est le passage de la puissance (''dunamis'') à l'acte (''energeia''), l'actualisation d'une forme dans une matière. Elle sauvegarde l'individualité des substances premières, c'est-à-dire des individus concrets (''tode ti'')<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 13, 1038b23-1039a3.</ref>. Elle unifie enfin forme et finalité : la forme est à la fois cause formelle et cause finale, ce vers quoi tend le développement naturel de la chose<ref>Aristote, ''Physique'', II, 1, 193b12-13 ; II, 7, 198a24-27.</ref>.
=== La critique de la participation et de l'imitation ===
Platon utilise principalement deux concepts pour expliquer la relation entre les choses sensibles et les Idées : la participation (''methexis'') et l'imitation (''mimêsis''). Aristote critique ces notions, qu'il juge métaphoriques et non explicatives<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22 ; M, 5, 1079b24-26.</ref>.
La notion de participation pose des problèmes conceptuels que Platon lui-même a identifiés dans le ''Parménide''<ref>Platon, ''Parménide'', 130e-134e.</ref>. Si l'Idée tout entière est présente en chaque chose qui y participe, alors l'Idée se trouve séparée d'elle-même. Mais si c'est seulement une partie de l'Idée qui est présente en chaque chose, alors l'Idée se divise<ref>Platon, ''Parménide'', 131a-e.</ref>.
Selon Aristote, Platon n'a pas résolu ces difficultés : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est ne rien dire, car participer, qu'est-ce que c'est ? »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-21.</ref>. Pour Aristote, « ce que les Pythagoriciens appelaient "imitation", les Platoniciens l'ont appelé "participation", mais tous se bornent à changer le nom sans expliquer ce que peut bien être cette participation ou cette imitation des Idées »<ref>Aristote, ''Métaphysique'', A, 6, 987b10-13, trad. J. Tricot, op. cit., t. I, p. 49.</ref>.
Pour Aristote, la ressemblance entre les individus d'une même espèce s'explique par la possession d'une même forme immanente, transmise dans la génération naturelle : « L'homme engendre l'homme » (''anthrôpos anthrôpon genna'')<ref>Aristote, ''Métaphysique'', Z, 7, 1032a25 ; Z, 8, 1033b32-1034a2 ; Λ, 3, 1070a8.</ref>. Trois facteurs interviennent dans la génération : la matière (fournie par la femelle, selon Aristote), la forme (transmise par le mâle) et la privation (l'absence initiale de la forme dans la matière)<ref>Aristote, ''Physique'', I, 7, 190b10-191a7 ; ''De la Génération des Animaux'', I, 20-21, 729a9-730a32. Cette doctrine de la « contribution » respective des sexes reflète des préjugés de l'époque qu'il importe de signaler ; voir, pour une mise au point critique, Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021.</ref>.
=== Substance, essence et ''ousia'' ===
Le terme grec ''ousia'', traduit en latin par ''substantia'' ou ''essentia'', possède des significations différentes chez Platon et Aristote. Comme le note Pellegrin, ''ousia'' est en fait « difficile à traduire, car le terme représente, chez Aristote, trois choses différentes : la forme, la matière, et le composé des deux »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Ousia / Substance », p. 175-176, citant ''Métaphysique'', Z, 3, 1029a27-33.</ref>.
Chez Platon, l{{'}}''ousia'' désigne principalement l'Idée, la réalité véritable, immuable et éternelle, par opposition aux choses sensibles<ref>Platon, ''Phédon'', 78c-d ; ''République'', V, 477a-478e ; VI, 484b-486d.</ref>. Chez Aristote, l{{'}}''ousia'' désigne avant tout, dans les ''Catégories'', la substance première : l'individu concret qui existe par lui-même<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 3, 1028b33-1029a7.</ref>. Aristote distingue alors la substance première de la substance seconde, qui désigne l'espèce ou le genre auquel appartient l'individu<ref>Aristote, ''Catégories'', 5, 2a14-17.</ref>.
Le rapport entre cette doctrine des ''Catégories'' et la théorie de la substance développée dans les livres centraux de la ''Métaphysique'' (Z, H, Θ) est l'un des points les plus discutés de l'aristotélisme contemporain. Annick Jaulin souligne que la « doctrine » aristotélicienne de la substance n'est pas une donnée stabilisée mais l'objet d'une recherche : Aristote « invente une théorie de la forme qui intègre le mouvement »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Dans la ''Métaphysique'', la forme (''eidos'') apparaît comme le meilleur candidat au titre de substance, mais cette identification soulève à son tour la question de l'unité du composé hylémorphique<ref>Pour un panorama des débats, voir Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', Stuttgart, Metzler, 2011, chap. IV.18 ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 5-7.</ref>. Comme le résume Pellegrin, « ''ousia'' signifie donc la chose (la substance) et ses causes internes, la matière et la forme ; la forme est ce qui correspond à l'essence »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 176.</ref>.
=== Éléments de continuité entre Platon et Aristote ===
Au-delà des divergences ontologiques, Platon et Aristote partagent plusieurs convictions communes. La première est la primauté de la forme sur la matière dans l'ordre de l'intelligibilité, de la réalité et de la perfection. Pour Platon comme pour Aristote, la matière pure, prise en elle-même, est indéterminée<ref>Platon, ''Timée'', 49a-52d ; Aristote, ''Métaphysique'', Z, 10, 1036a8-9.</ref>.
La deuxième est la finalité dans la nature. Platon présente le cosmos comme l'œuvre d'un Démiurge qui organise la matière en regardant vers les Idées<ref>Platon, ''Timée'', 28a-30c.</ref>. Aristote intériorise et naturalise cette téléologie : la nature elle-même agit en vue d'une fin (''hê phusis heneka tou poiei''), sans qu'il soit besoin de postuler un Démiurge extérieur ou des Idées transcendantes<ref>Aristote, ''Physique'', II, 8, 198b10-199a8 ; ''Des Parties des Animaux'', I, 1, 639b14-640a9. Pour une discussion détaillée de la téléologie aristotélicienne, voir Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012 ; James G. Lennox, ''Aristotle's Philosophy of Biology'', Cambridge, Cambridge University Press, 2001.</ref>.
La troisième est la connaissance par les causes : pour les deux philosophes, la véritable connaissance scientifique consiste à connaître les causes (''aitiai'') des choses<ref>Platon, ''Phédon'', 96a-99d ; Aristote, ''Physique'', II, 3, 194b16-195b30 ; ''Seconds Analytiques'', I, 13, 78a22-b4.</ref>. Aristote reproche cependant à Platon d'avoir négligé la cause efficiente et la cause finale<ref>Aristote, ''Métaphysique'', A, 6, 988a8-17 ; A, 9, 992a24-29 ; Λ, 10, 1075b37-1076a4.</ref>.
La quatrième concerne la définition et l'universel. Platon et Aristote s'accordent sur le fait que la définition (''horismos'' ou ''logos'') porte sur l'universel et non sur le particulier<ref>Platon, ''Théétète'', 201c-210b ; Aristote, ''Métaphysique'', Z, 15, 1039b27-1040a7.</ref>. Mais Aristote opère une distinction fondamentale entre l'ordre de l'être (où le particulier est premier) et l'ordre de la connaissance (où l'universel est premier)<ref>Aristote, ''Métaphysique'', Z, 13, 1038b8-16 ; ''Seconds Analytiques'', I, 2, 71b33-72a5.</ref>.
=== La dialectique et le rôle de l'expérience sensible ===
Platon et Aristote sont tous deux héritiers de la méthode dialectique inaugurée par Socrate, qui consiste à examiner les opinions par le dialogue argumenté<ref>Platon, ''République'', VII, 533c-534e ; Aristote, ''Topiques'', I, 1-2, 100a18-101b4.</ref>. Aristote conserve cette approche : il commence presque toujours par recenser les opinions des prédécesseurs (''doxographia''), examine les difficultés (''aporiai''), avant de proposer sa propre solution<ref>Aristote, ''Éthique à Nicomaque'', VII, 1, 1145b2-7.</ref>. Cependant, pour Aristote, la dialectique est un outil préparatoire et non une science apodictique<ref>Aristote, ''Topiques'', I, 2, 101a25-b4 ; ''Métaphysique'', Γ, 2, 1004b17-26.</ref>.
Une divergence importante porte sur le rôle de l'expérience sensible. Pour Platon, les sens nous maintiennent dans l'opinion (''doxa'')<ref>Platon, ''Phédon'', 66b ; ''République'', VII, 514a-517c.</ref>. Aristote accorde au contraire une place fondamentale à l'expérience sensible : la science porte sur l'universel, mais cet universel est abstrait à partir des données sensibles par un processus d'induction (''epagôgê'')<ref>Aristote, ''Seconds Analytiques'', II, 19, 100b3-5, trad. J. Tricot, Paris, Vrin, 1947, p. 242 ; ''De l'Âme'', III, 8, 432a3-10.</ref>.
=== Bilan : continuité et rupture ===
Une partie de l'historiographie contemporaine décrit l'aristotélisme comme une reformulation immanentiste des problèmes hérités du platonisme : la forme « descend » du ciel des Idées pour s'incarner dans les choses, le Bien se réalise dans l'accomplissement de la nature propre de chaque être, la philosophie reconnaît que seuls existent les individus concrets dans lesquels l'universel se réalise. Cette caractérisation, parfois résumée par l'expression « naturalisation du platonisme », demeure toutefois une thèse interprétative dont la portée varie selon les commentateurs ; elle ne fait pas consensus dans la recherche universitaire et doit être attribuée à des travaux secondaires précis<ref>Cette interprétation est défendue notamment par certains chercheurs proches de la tradition de Pierre Aubenque ; voir ''Le problème de l'être chez Aristote'', Paris, PUF, 1962. D'autres travaux, notamment Annick Jaulin, ''Aristote. La métaphysique'', op. cit., insistent au contraire sur l'originalité radicale de la démarche aristotélicienne et son enracinement dans la tradition des penseurs de la nature, plus que dans une « naturalisation » du platonisme.</ref>.
Plus généralement, la querelle entre Platon et Aristote est l'une des plus discutées de l'histoire de la métaphysique occidentale. La tradition philosophique ultérieure n'a jamais tranché définitivement, oscillant entre tentatives de conciliation (néoplatoniciens, Thomas d'Aquin) et radicalisations de l'opposition (nominalistes médiévaux, empiristes modernes).
== La logique : l'Organon ==
=== Les Catégories – Les genres suprêmes de l'être ===
==== La classification première de la réalité ====
Aristote propose, dans le traité des ''Catégories'', une doctrine selon laquelle toute chose qui se dit relève de l'un des « genres suprêmes » (''katêgoriai''). Le terme ''katêgoria'' signifie littéralement « prédicat » ou « attribution »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Catégorie », p. 41-42.</ref>. Comme le souligne Pellegrin, lorsque Aristote parle des « genres de l'être », il « n'emploie pas le terme "genre" en son sens technique habituel », car il pose des termes « qui peuvent être affirmés des différentes réalités sans pouvoir être subsumés sous une attribution plus haute »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 41.</ref>.
Aristote présente une liste canonique de dix catégories. « Chacun des termes qui sont dits sans aucune combinaison », écrit-il, « indique soit une substance (''ousia''), soit une certaine quantité (''poson''), soit une certaine qualité (''poion''), soit un rapport à quelque chose (''pros ti''), soit quelque part (''pou''), soit un certain moment (''pote''), soit être dans une position (''keisthai''), soit posséder (''echein''), soit faire (''poiein''), soit subir (''paschein'') »<ref>Aristote, ''Catégories'', 4, 1b25-27, trad. R. Bodéüs, Les Belles Lettres, Paris, 2001.</ref>.
Ces catégories peuvent être illustrées par les exemples qu'Aristote donne lui-même : la substance désigne ce qu'est un être (un homme, un cheval) ; la quantité, l'extension (long de deux coudées) ; la qualité, la nature (blanc, instruit) ; la relation, un rapport (double, moitié) ; le lieu (au Lycée) ; le temps (hier) ; la position (couché, assis) ; la possession (être chaussé, être armé) ; l'action et la passion (couper ou être coupé)<ref>Aristote, ''Catégories'', 4, 1b25-2a10. Voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 41.</ref>.
Il convient de noter que la liste de dix catégories n'est pas systématiquement reprise par Aristote dans tous ses traités. Comme le note Pellegrin, « Aristote n'a nulle part établi qu'il s'agissait là d'un nombre fixe et définitif »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 41.</ref>. Par ailleurs, l'authenticité même du traité des ''Catégories'' a été discutée dans l'Antiquité, sa tonalité tranchant parfois avec le reste du corpus, même si sa doctrine est jugée authentiquement aristotélicienne par la majorité des commentateurs.
==== La primauté ontologique de la substance ====
Parmi les dix catégories, l'une occupe une place privilégiée : la substance. « La substance est ce qui se dit proprement, premièrement et avant tout ; ce qui à la fois ne se dit pas d'un certain sujet et n'est pas dans un certain sujet ; par exemple tel homme ou tel cheval »<ref>Aristote, ''Catégories'', 5, 2a11-14, trad. R. Bodéüs, op. cit.</ref>.
Toutes les autres catégories présupposent l'existence de la substance. On ne peut concevoir une couleur sans un corps coloré, une grandeur sans quelque chose de grand, une action sans un agent. « Tous les autres termes, ou bien se disent de sujets qui sont les substances premières, ou bien sont dans des sujets qui sont ces mêmes substances »<ref>Aristote, ''Catégories'', 5, 2a34-2b6.</ref>. Si les substances premières n'existaient pas, rien d'autre ne pourrait exister : la substance est le substrat ultime (''hypokeimenon''), ce dont tout se dit mais qui n'est dit de rien d'autre<ref>Aristote, ''Métaphysique'', Z, 3, 1028b36-37, trad. J. Tricot, Vrin, Paris, 1953.</ref>.
==== Substance première et substance seconde ====
Aristote introduit une distinction au sein même de la notion de substance. À côté de la substance première, il reconnaît l'existence de substances secondes (''deuterai ousiai'')<ref>Aristote, ''Catégories'', 5, 2a14-17.</ref>.
La substance première désigne l'individu concret : tel homme, tel cheval. Elle possède une double caractéristique négative : elle n'est ni dite d'un sujet, ni dans un sujet. Les substances premières sont des individus numériquement uns (''arithmôi hen''), des « ceci » (''tode ti'') déterminés et séparés<ref>J. Brun, ''Aristote et le Lycée'', PUF, « Que sais-je ? », Paris, 1961, p. 95-96.</ref>.
Les substances secondes, en revanche, sont les espèces et les genres auxquels appartiennent les substances premières. L'homme (espèce) et l'animal (genre) sont des substances secondes parce qu'ils se disent des substances premières. Aristote précise que « parmi les substances secondes, l'espèce est plus substance que le genre, car elle est plus proche de la substance première »<ref>Aristote, ''Catégories'', 5, 2b7-8.</ref>.
Le rapport entre cette doctrine de la substance et celle des livres centraux de la ''Métaphysique'' (Z, H) fait l'objet de débats interprétatifs : la substance première des ''Catégories'' (l'individu concret) ne coïncide pas exactement avec la « substance » des livres centraux, où la forme (''eidos'') est souvent identifiée comme substance première<ref>Sur cette question, voir Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', op. cit., chap. IV.18 ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 7.</ref>.
==== Les propriétés caractéristiques de la substance ====
Aristote dégage plusieurs propriétés permettant d'identifier la substance et de la distinguer des accidents. Premièrement, toute substance n'est pas dans un sujet<ref>Aristote, ''Catégories'', 5, 3a7-21.</ref>. Deuxièmement, la substance et ses différences se disent de façon synonyme (''sunônuma'')<ref>Aristote, ''Catégories'', 5, 3a33-3b9.</ref>. Troisièmement, toute substance « indique un certain ceci » (''tode ti''), même si les substances secondes désignent plutôt « une certaine sorte d'objet » (''poion ti'')<ref>Aristote, ''Catégories'', 5, 3b10-21.</ref>. Quatrièmement, la substance n'admet pas le plus ou le moins<ref>Aristote, ''Catégories'', 5, 3b33-4a9.</ref>. Enfin, et surtout, la substance est capable de recevoir les contraires tout en restant la même et numériquement une<ref>Aristote, ''Catégories'', 5, 4a10-21.</ref>.
==== Catégories, langage et débats interprétatifs ====
La doctrine des catégories établit un lien étroit entre l'ontologie et le langage : les catégories sont à la fois des divisions de l'être et des types de prédication. Aristote l'affirme explicitement : « l'être se dit en autant de sens qu'il y a de catégories »<ref>Aristote, ''Métaphysique'', Δ, 7, 1017a22-24.</ref>.
L'objet même des catégories a fait l'objet de débats considérables, déjà dans l'Antiquité. Selon Pellegrin, « il est en tout cas tentant de considérer que les catégories sont à l'intersection d'une analyse logique du discours et d'une décomposition ontologique de la réalité »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 41-42.</ref>. Friedrich Trendelenburg les a interprétées comme une réflexion sur la grammaire grecque, faisant correspondre les quatre premières catégories aux noms et adjectifs, les quatre dernières aux verbes, les deux intermédiaires aux adverbes ; Thomas d'Aquin les considère, à l'inverse, comme des genres d'être<ref>Sur ces interprétations divergentes, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 41.</ref>. La recherche contemporaine a maintenu et approfondi ces désaccords, qui portent sur l'objet même des catégories, leur méthode de génération et leur rapport à la métaphysique<ref>Pour un état de la question, voir l'entrée « Aristotle's Categories » de la ''Stanford Encyclopedia of Philosophy''.</ref>.
==== L'unité problématique de l'être ====
La doctrine des catégories soulève une difficulté : si l'être se dit en plusieurs sens irréductibles, comment préserver l'unité de son concept ? L'être n'est pas un genre au sens propre, car un genre possède une définition unique qui s'applique uniformément à toutes ses espèces<ref>Aristote, ''Métaphysique'', B, 3, 998b22.</ref>.
La solution aristotélicienne consiste à reconnaître que l'être est dit selon une pluralité ordonnée. Bien que l'être n'ait pas un sens univoque, ses différentes acceptions ne sont pas non plus purement équivoques : elles se rapportent toutes à un terme premier, la substance. « L'être se dit en multiples acceptions, mais toujours relativement à un terme unique, à une nature déterminée »<ref>Aristote, ''Métaphysique'', Γ, 2, 1003a33-b10.</ref>. Selon une formule reprise par Pierre Aubenque, c'est ce que la tradition appellera l'analogie de l'être ou, dans la terminologie des commentateurs anglo-saxons, la « signification focale » (''focal meaning'') de la substance<ref>P. Aubenque, ''Le problème de l'être chez Aristote'', PUF, Paris, 1962, p. 178-195. La notion de ''focal meaning'' a été élaborée par G.E.L. Owen ; voir les commentaires de Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 176.</ref>.
=== Le ''De interpretatione'' – Le jugement et la proposition ===
Le ''De interpretatione'' (''Peri hermeneias'') constitue le deuxième traité de l'Organon aristotélicien. Aristote y examine la structure du discours déclaratif, les conditions du jugement et les rapports entre langage, pensée et réalité<ref>Aristote, ''De l'interprétation'', 1, 16a3-8, trad. J. Tricot, Paris, Vrin, 1969, p. 77. Sur ce traité et les débats interprétatifs récents, voir Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', Paris, Vrin, 2009.</ref>.
==== Le langage comme système symbolique ====
Aristote ouvre son traité par une réflexion sur le statut du langage. Les sons émis par la voix (''ta en tè phonè'') sont, écrit-il, les symboles (''symbola'') des affections de l'âme (''ta en tè psychè pathèmata''), et les mots écrits sont à leur tour les symboles des mots prononcés<ref>Aristote, ''De l'interprétation'', 1, 16a3-8.</ref>. Cette conception stratifiée établit trois niveaux : les choses (''pragmata''), les états de l'âme, et les signes vocaux ou écrits.
Cette théorie sémiotique présente plusieurs caractéristiques. Elle affirme le caractère conventionnel (''kata synthèkèn'') du rapport entre signifiant linguistique et signifié mental : « De même que l'écriture n'est pas la même pour tous les hommes, les mots parlés ne sont pas non plus les mêmes, alors que les états de l'âme dont ces expressions sont immédiatement les signes sont identiques chez tous »<ref>''Ibid.'', 16a5-8.</ref>. La diversité des langues manifeste le caractère artificiel du lien entre ''phonè'' et ''pathèma'', tandis que l'universalité supposée des états mentaux et leur rapport de ressemblance (''homoiômata'') avec les choses fonderait la possibilité d'une communication véridique.
Cette analyse permet à Aristote de prendre ses distances avec la position cratylienne d'une justesse naturelle des noms : le langage signifie d'abord les concepts par lesquels nous appréhendons l'être<ref>Voir Pierre Aubenque, ''Le problème de l'être chez Aristote'', op. cit., p. 100-110.</ref>.
==== Les éléments du discours déclaratif : nom et verbe ====
Avant d'examiner la proposition proprement dite, Aristote analyse ses constituants élémentaires. Le nom (''onoma'') est défini comme « un son vocal possédant une signification conventionnelle, sans référence au temps, et dont aucune partie, prise isolément, n'est significative par elle-même »<ref>Aristote, ''De l'interprétation'', 2, 16a19-21.</ref>. Cette définition insiste sur quatre caractères : la nature sonore (''phonè''), la signification conventionnelle, l'atemporalité, et l'absence de signification des parties prises isolément.
Aristote précise que « rien n'est par nature un nom, mais seulement quand il devient symbole »<ref>''Ibid.'', 16a27-28.</ref>. Il mentionne également les noms indéfinis (''aoriston onoma''), comme « non-homme »<ref>''Ibid.'', 2, 16a30-32.</ref>.
Le verbe (''rhèma'') se distingue du nom par deux caractères spécifiques : « Le verbe est ce qui ajoute à sa propre signification celle du temps ; aucune de ses parties n'est significative prise séparément, et il indique toujours quelque chose d'affirmé de quelque chose d'autre »<ref>''Ibid.'', 3, 16b6-8.</ref>. La consignification du temps (''prosèmainei chronon'') fait du verbe l'élément qui ancre le discours dans la temporalité.
Le verbe « être » occupe une position singulière. Pris en lui-même, « être ou ne pas être n'est pas un signe de la chose réelle, pas même si tu dis 'étant' tout court ; car en soi, ce n'est rien, mais il consignifie une certaine composition qu'on ne peut concevoir sans les composants »<ref>''Ibid.'', 3, 16b22-25.</ref>. Cette remarque suggère que le verbe « être », dans sa fonction copulative, signifie l'acte même de liaison ou de synthèse (''synthesis'') entre le sujet et le prédicat<ref>Voir Octave Hamelin, ''Le système d'Aristote'', Paris, Vrin, 1920, p. 159-160 ; pour une discussion contemporaine, Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', op. cit.</ref>.
==== La proposition déclarative (''logos apophantikos'') ====
Tout discours (''logos'') n'est pas une proposition. Aristote définit la proposition déclarative (''logos apophantikos'') comme « le discours en lequel réside le vrai ou le faux »<ref>Aristote, ''De l'interprétation'', 4, 17a2-3.</ref>. C'est l'énoncé qui « manifeste » (''apophainein'') un état de choses et peut être confronté à la réalité.
La proposition élémentaire se divise en affirmation (''kataphasis'') et négation (''apophasis''). L'affirmation est « la déclaration de quelque chose au sujet de quelque chose » (''apophansis tinos kata tinos''), tandis que la négation est « la déclaration de quelque chose séparé de quelque chose » (''apophansis tinos apo tinos'')<ref>''Ibid.'', 5, 17a25-26.</ref>.
Aristote insiste sur le fait que l'affirmation et la négation concernent la liaison ou la séparation d'un sujet et d'un prédicat. C'est précisément cette opération de composition (''synthesis'') ou de division (''diairesis'') qui rend possible la vérité ou la fausseté. Comme Aristote l'expliquera dans la ''Métaphysique'', « dire que ce qui est est et que ce qui n'est pas n'est pas, c'est le vrai ; dire que ce qui est n'est pas ou que ce qui n'est pas est, c'est le faux »<ref>Aristote, ''Métaphysique'', Γ (IV), 7, 1011b26-27.</ref>.
==== Quantité et qualité des propositions ====
Aristote distingue les propositions selon leur quantité (universelles, particulières, singulières, indéterminées) et leur qualité (affirmatives, négatives)<ref>Aristote, ''De l'interprétation'', 7, 17a38-17b12.</ref>. En croisant ces critères, on obtient quatre formes fondamentales : l'universelle affirmative (A), l'universelle négative (E), la particulière affirmative (I), et la particulière négative (O) — désignations qui ne sont pas aristotéliciennes mais scolastiques.
Cette classification permet de définir les relations d'opposition entre propositions : contradiction, contrariété, subcontrariété et subalternation<ref>''Ibid.'', 7, 17b16-26.</ref>.
==== Le problème des futurs contingents ====
Le chapitre 9 du ''De interpretatione'' soulève l'une des questions les plus discutées de l'histoire de la logique : le statut des propositions portant sur les futurs contingents. Aristote se demande si le principe de bivalence s'applique aux propositions concernant des événements futurs qui ne sont ni nécessaires ni impossibles.
Le problème se formule ainsi : « Il y aura demain une bataille navale » et « Il n'y aura pas demain une bataille navale » sont deux propositions contradictoires. D'après le principe du tiers exclu, l'une doit être vraie et l'autre fausse. Mais si l'une est dès maintenant vraie, alors il est nécessaire que l'événement se produise<ref>Aristote, ''De l'interprétation'', 9, 18b9-16.</ref>. On aboutit à un fatalisme logique.
La solution d'Aristote est subtile et a fait l'objet d'interprétations divergentes : il maintient que pour les propositions portant sur le présent et le passé, le principe de bivalence s'applique sans restriction ; mais pour les futurs contingents, « il est nécessaire que l'affirmation ou la négation soit vraie, mais non que celle-ci déterminément ou celle-là déterminément soit vraie »<ref>''Ibid.'', 19a36-39.</ref>. La disjonction est nécessaire, mais chacun des disjoints reste contingent.
Cette doctrine a suscité des controverses depuis l'Antiquité (les Stoïciens) jusqu'à la logique contemporaine (logique modale, logiques plurivalentes)<ref>Pour une discussion récente, voir Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', op. cit.</ref>.
==== Les propositions modales ====
Les chapitres 12 et 13 du ''De interpretatione'' examinent les propositions modales<ref>Aristote, ''De l'interprétation'', 12-13, 21a34-23a26.</ref>. Aristote distingue quatre modalités : le possible (''dynaton'', ''endechomenon''), l'impossible (''adynaton''), le contingent et le nécessaire (''anankaion'').
Aristote établit que « Il est possible que S soit P » ne se convertit pas comme une proposition assertorique. Il définit le nécessaire comme « ce qui ne peut pas ne pas être » (''to mè endechomenon mè einai'')<ref>''Ibid.'', 12, 21b35-36.</ref>. Les propositions modales jouent un rôle essentiel dans la théorie aristotélicienne de la science : la science porte sur le nécessaire, non sur le contingent<ref>Aristote, ''Seconds Analytiques'', I, 30, 87b19-27.</ref>.
==== Portée philosophique du ''De interpretatione'' ====
L'importance du ''De interpretatione'' dépasse le cadre de la logique formelle. Aristote y pose les bases d'une ontologie du jugement qui sera reprise par la philosophie occidentale jusqu'à Kant et au-delà. En établissant que la vérité réside dans la composition et la division opérées par l'intellect, et non dans les choses isolées ni dans les concepts isolés, Aristote fait du jugement le lieu de la manifestation de l'être<ref>Aristote, ''Métaphysique'', Θ (IX), 10, 1051b1-9.</ref>. La recherche contemporaine, notamment Suzanne Husson dans ''Interpréter le De Interpretatione'', a insisté sur la fécondité de ce traité pour la philosophie analytique du langage<ref>Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', op. cit.</ref>.
=== Les Analytiques – La science démonstrative ===
Les deux traités des ''Analytiques'' – ''Premiers Analytiques'' (''Analytica priora'') et ''Seconds Analytiques'' (''Analytica posteriora'') – exposent la théorie de la science démonstrative. Les ''Premiers Analytiques'' s'attachent à la forme du syllogisme en général, indépendamment de la vérité des prémisses ; les ''Seconds Analytiques'' traitent du syllogisme scientifique ou démonstratif (''apodeixis''), dont les prémisses doivent être vraies, premières et causales<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 9-16. Sur la distinction entre logique formelle et épistémologie chez Aristote, voir Jonathan Barnes, ''Aristotle's Posterior Analytics'', 2e éd., Oxford, Clarendon Press, 1993, p. xviii-xix.</ref>.
==== Le syllogisme : structure et figures ====
Le syllogisme (''syllogismos'') est défini par Aristote comme « un discours dans lequel, certaines choses étant posées, quelque chose d'autre que ces données en résulte nécessairement par le seul fait de ces données »<ref>Aristote, ''Premiers Analytiques'', I, 1, 24 b 18-20.</ref>. Cette définition insiste sur trois caractères essentiels : la pluralité des prémisses (au moins deux), la nécessité de la conclusion, et le fait que cette nécessité découle uniquement de la position des prémisses<ref>David Bronstein, ''Aristotle on Knowledge and Learning: The Posterior Analytics'', Oxford, Oxford University Press, 2016, p. 31-32. Pour une étude classique de la syllogistique, voir Jan Lukasiewicz, ''La syllogistique d'Aristote'', trad. fr., Paris, Vrin.</ref>.
La structure minimale du syllogisme comporte trois termes : le grand extrême ou majeur, le petit extrême ou mineur, et le moyen terme qui assure la liaison entre les extrêmes sans apparaître dans la conclusion<ref>Aristote, ''Premiers Analytiques'', I, 4, 25 b 32-36.</ref>. L'exemple canonique est : « Tout homme est mortel » (majeure), « Or Socrate est un homme » (mineure), « Donc Socrate est mortel ».
Aristote distingue trois figures du syllogisme selon la position du moyen terme dans les prémisses<ref>Aristote, ''Premiers Analytiques'', I, 4-6, 25 b 26-28 b 14.</ref>. La première figure est considérée comme la plus parfaite, car elle seule permet de conclure dans tous les modes<ref>Aristote, ''Premiers Analytiques'', I, 7, 29 a 30 ; I, 14, 32 b 38-33 a 5.</ref>.
À l'intérieur de chaque figure, Aristote détermine les modes valables. Dans la première figure, quatre modes sont concluants : Barbara, Celarent, Darii et Ferio (désignations scolastiques)<ref>Aristote, ''Premiers Analytiques'', I, 4, 25 b 37-26 b 34.</ref>. Les syllogismes des deuxième et troisième figures, dits « imparfaits », doivent être ramenés par conversion des prémisses aux syllogismes parfaits de la première figure<ref>Aristote, ''Premiers Analytiques'', I, 2-3, 25 a 1-26.</ref>.
==== La démonstration scientifique (''apodeixis'') ====
Aristote définit la science (''epistèmè'') triplement : elle est connaissance de la cause, certitude de l'adéquation entre la cause et l'effet, et conscience de la nécessité de cette liaison. « Nous estimons posséder la science d'une chose d'une manière absolue », écrit-il, « quand nous croyons que nous connaissons la cause par laquelle la chose est, que nous savons que cette cause est celle de la chose, et qu'en outre il n'est pas possible que la chose soit autre qu'elle n'est »<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 9-12.</ref>.
La démonstration est le syllogisme qui produit la science. Elle doit partir de prémisses vraies, premières (indémontrables), immédiates, plus connues que la conclusion, antérieures à elle, et causes de celle-ci<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 20-25.</ref>. Sans ces conditions, on peut avoir un syllogisme valide, mais non une démonstration scientifique<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 35-42.</ref>.
Le moyen terme joue dans la démonstration un rôle crucial : « Le moyen terme est la cause »<ref>Aristote, ''Seconds Analytiques'', II, 2, 90 a 6.</ref>. Pour démontrer que la Lune subit des éclipses, on utilisera comme moyen terme « interposition de la Terre », qui n'est pas seulement un lien logique mais la cause physique du phénomène. Aristote distingue ainsi le syllogisme du fait (''hoti'') et le syllogisme du pourquoi (''dioti'')<ref>Aristote, ''Seconds Analytiques'', I, 13, 78 a 22-b 13.</ref>.
Les causes dont traite la démonstration correspondent aux quatre types de causes exposés dans la ''Physique'' (formelle, matérielle, efficiente, finale)<ref>Aristote, ''Seconds Analytiques'', II, 11, 94 a 20-24 ; cf. ''Physique'', II, 3, 194 b 23-195 b 30. Voir Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', Oxford, Oxford University Press, 2012, p. 176-180.</ref>.
==== Les principes de la science : axiomes, hypothèses et définitions ====
Toute démonstration présuppose des principes (''archai'') qui ne peuvent être démontrés. Aristote refuse à la fois la régression à l'infini et la démonstration circulaire<ref>Aristote, ''Seconds Analytiques'', I, 3, 72 b 5-18.</ref>. Il faut donc admettre l'existence de principes premiers connus sans démonstration, qui se divisent en trois catégories<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 94-99.</ref>.
Les axiomes (''axiômata'') ou principes communs s'appliquent à toutes les sciences. Le plus fondamental est le principe de non-contradiction : « Il est impossible que le même attribut appartienne et n'appartienne pas en même temps au même sujet et sous le même rapport »<ref>Aristote, ''Métaphysique'', Γ (IV), 3, 1005 b 19-20.</ref>. Les hypothèses (''hypotheseis'') et les thèses (''theseis'') affirment l'existence ou la non-existence de certaines entités propres à chaque science<ref>Aristote, ''Seconds Analytiques'', I, 2, 72 a 14-24 ; I, 10, 76 b 23-34.</ref>. Les définitions (''horoi'') énoncent ce qu'est une chose, son essence (''ti esti'')<ref>Aristote, ''Seconds Analytiques'', II, 3, 90 b 24-27.</ref>.
Aristote examine longuement la question de savoir si l'on peut démontrer l'essence : il conclut négativement, distinguant définition et démonstration<ref>Aristote, ''Seconds Analytiques'', II, 4, 91 a 35-b 11.</ref>. Toutefois, certaines définitions peuvent découler de démonstrations : c'est le cas des définitions causales, comme celle du tonnerre comme « bruit dans les nuages causé par l'extinction du feu »<ref>Aristote, ''Seconds Analytiques'', II, 8, 93 b 7-14.</ref>.
==== Unité et diversité des sciences ====
Un principe capital est l'interdiction du passage d'un genre à un autre (''metabasis eis allo genos''). Chaque science se définit par son genre propre et ne peut emprunter ses principes ou démonstrations à une autre science<ref>Aristote, ''Seconds Analytiques'', I, 7, 75 a 38-b 2.</ref>. Cette règle garantit l'autonomie des sciences<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 177-183.</ref>.
Aristote admet trois exceptions : la subordination d'une science à une autre (l'optique à la géométrie), le partage des axiomes communs, et l'existence de sciences mixtes (''metaxu'') comme l'astronomie mathématique<ref>Aristote, ''Seconds Analytiques'', I, 7, 75 b 14-17 ; ''Physique'', II, 2, 194 a 7-12.</ref>.
Cette théorie fonde l'organisation aristotélicienne du savoir : chaque science possède une méthode adaptée à son objet. Les mathématiques procèdent par démonstration nécessaire ; la physique tient compte du changement ; la biologie observe les régularités qui se produisent « dans la plupart des cas » (''hôs epi to poly'') ; l'éthique et la politique se contentent de vérités approximatives<ref>Aristote, ''Éthique à Nicomaque'', I, 3, 1094 b 14-16.</ref>.
==== Le problème de la connaissance des principes : induction et intellection ====
La théorie de la démonstration soulève un problème : si toute science procède de principes indémontrables, comment connaître ces principes eux-mêmes ?<ref>Aristote, ''Seconds Analytiques'', I, 3, 72 b 5-18.</ref> Aristote consacre le chapitre final des ''Seconds Analytiques'' (II, 19) à cette question.
La connaissance des principes résulte d'un processus qui part de la sensation (''aisthèsis''), passe par la mémoire (''mnèmè''), puis par l'expérience (''empeiria''), pour aboutir à la saisie de l'universel<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 a 3-9.</ref>. Ce processus est appelé induction (''epagôgê''). Aristote compare ce processus à une armée en déroute où l'ordre se rétablit progressivement<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 a 12-14.</ref>. L'interprétation de ce passage difficile fait l'objet de débats : selon David Bronstein, l'induction n'est pas une opération purement logique mais un mouvement de l'âme vers l'intelligible<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 225-247.</ref>.
La saisie ultime des principes premiers relève d'une faculté qu'Aristote nomme intellect (''nous'') ou intuition intellectuelle, « la disposition par laquelle nous connaissons les principes »<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 b 12.</ref>. Aristote affirme que nous possédons en puissance la capacité de connaître les principes, qui s'actualise par la sensation et la pensée. L'intellect est la plus haute forme de connaissance, supérieure même à la science démonstrative<ref>Aristote, ''Éthique à Nicomaque'', VI, 6, 1141 a 7-8.</ref>.
Cette doctrine soulève des difficultés notoires, qu'Aristote ne résout pas explicitement. Comment l'intellect peut-il être à la fois une capacité innée et le résultat d'un processus d'apprentissage ? Les commentateurs ultérieurs (Alexandre d'Aphrodise, Avicenne, Averroès, Thomas d'Aquin) ont proposé des interprétations divergentes<ref>Orna Harari, ''Knowledge and Demonstration: Aristotle's Posterior Analytics'', Dordrecht, Springer, 2004, p. 26-31.</ref>.
==== Portée et postérité de la théorie démonstrative ====
La théorie aristotélicienne de la science démonstrative a fourni un modèle épistémologique de référence pendant deux millénaires. Les ''Éléments'' d'Euclide, avec leur méthode axiomatique-déductive, sont parfois présentés comme l'incarnation de l'idéal aristotélicien<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 3-10. Cette caractérisation est cependant nuancée par certains travaux récents, qui soulignent les différences entre la pratique mathématique grecque et la théorie aristotélicienne de la démonstration.</ref>.
À partir de la révolution scientifique moderne, la théorie aristotélicienne a fait l'objet de critiques. Descartes reproche au syllogisme de ne rien apprendre de nouveau ; Bacon dénonce la stérilité de la logique aristotélicienne. La science moderne procède par hypothèses provisoires, expérimentations et inférences probabilistes plutôt que par démonstrations nécessaires à partir de principes évidents<ref>Pour une discussion équilibrée, voir Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. xviii-xix. La recherche récente sur la philosophie naturelle de la Renaissance et la scolastique tardive nuance cependant l'idée d'une rupture frontale avec l'aristotélisme : la transition vers la science moderne combine continuités, relectures et oppositions plutôt qu'une opposition unilatérale.</ref>.
Ces critiques ne suppriment pas l'apport historique d'Aristote : il a établi les règles de la déduction valide, distingué clairement la forme et la matière du raisonnement, et montré la nécessité des principes premiers. Sa conception de l'explication scientifique comme connaissance du « pourquoi » continue de nourrir la réflexion contemporaine en philosophie des sciences<ref>Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., p. 169-202.</ref>.
=== Les ''Topiques'' – L'art de la dialectique ===
==== La dialectique et les lieux communs ====
Si les ''Analytiques'' traitent de la démonstration scientifique, les ''Topiques'' concernent le raisonnement dialectique. La dialectique part de prémisses probables (''endoxa''), c'est-à-dire d'opinions généralement admises par tous, ou par les plus nombreux, ou par les sages<ref>Aristote, ''Topiques'', I, 1, 100a29-b23.</ref>. Elle ne vise pas la certitude scientifique mais l'art de discuter de manière raisonnable.
Les ''topoi'' ou lieux sont des schèmes d'argumentation valables dans plusieurs domaines. Par exemple, le lieu « du plus et du moins » permet d'argumenter ainsi : si ce qui est plus susceptible d'appartenir à quelque chose ne lui appartient pas, ce qui l'est moins ne lui appartiendra pas non plus<ref>Aristote, ''Topiques'', II, 10, 114b37-115a3.</ref>.
==== L'utilité de la dialectique ====
Aristote assigne trois usages à la dialectique : entraînement intellectuel, utilité dans les rencontres avec autrui, et apport aux sciences philosophiques elles-mêmes<ref>Aristote, ''Topiques'', I, 2, 101a25-b4.</ref>.
La dialectique permet d'examiner de manière critique (''peirastikê'') les principes des sciences en confrontant les opinions opposées. Elle permet aussi de parcourir les difficultés (''aporiai'') et de dégager progressivement les principes véritables. Cette méthode dialectique est mise systématiquement en œuvre par Aristote dans ses traités<ref>Aristote, ''Éthique à Nicomaque'', VII, 1, 1145b2-7. Sur la dialectique aristotélicienne, voir J. Brunschwig, ''Aristote: Topiques I-IV'', Paris, Les Belles Lettres, 1967 et 2007 ; Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit.</ref>.
=== Les ''Réfutations sophistiques'' – Les paralogismes et leur réfutation ===
==== Les sophismes et leurs types ====
Les ''Réfutations sophistiques'' complètent les ''Topiques'' en examinant les raisonnements fallacieux. Aristote distingue treize types de sophismes, dont six dépendent du langage (homonymie, amphibologie, composition, division, accentuation, forme de l'expression) et sept en sont indépendants (accident, passage du qualifié à l'absolu, ignorance de la réfutation, pétition de principe, faux enchaînement, prise de l'antécédent comme conséquent, réunion de plusieurs questions en une)<ref>Aristote, ''Réfutations sophistiques'', 4, 165b23-166b19. Voir L.A. Dorion, ''Les Réfutations Sophistiques d'Aristote'', Paris, Vrin, 1995.</ref>.
L'exemple du sophisme par accident est célèbre : « Coriskos est différent de Socrate / Or Socrate est un homme / Donc Coriskos est différent d'un homme »<ref>Aristote, ''Réfutations sophistiques'', 5, 166b28-36.</ref>.
==== Logique et défense de la rationalité ====
Au-delà de son utilité pratique, l'étude des sophismes a une portée philosophique. Pour Aristote, il existe des règles objectives du raisonnement correct, indépendantes de l'habileté rhétorique<ref>Aristote, ''Réfutations sophistiques'', 11, 171b34-172a7.</ref>. Cette thèse a été souvent lue, dans la tradition interprétative, comme une réponse au relativisme attribué aux sophistes. Une partie de la recherche contemporaine nuance cependant cette lecture : la « réponse aux sophistes » est moins un combat frontal qu'une délimitation du domaine de la science par rapport à celui de l'argumentation persuasive ; il s'agit pour Aristote, comme dans la défense du principe de non-contradiction, d'établir des conditions minimales pour qu'un discours rationnel soit possible<ref>Aristote, ''Métaphysique'', Γ, 3-4, 1005b19-1008b31. Sur le rôle interprétatif joué par la figure du « sophiste » chez Aristote, voir L.A. Dorion, « Aristote et l'invention de la dialectique », dans M. Canto-Sperber et P. Pellegrin (éd.), ''Le Style de la Pensée'', Paris, Les Belles Lettres, 2002, p. 182-220.</ref>.
== La philosophie de la nature ==
=== La ''Physique'' – Les principes du mouvement et du changement ===
==== La nature comme principe interne de mouvement ====
La physique aristotélicienne n'est pas la physique au sens moderne, science mathématisée des phénomènes matériels. Elle est la science des êtres qui possèdent en eux-mêmes un principe de mouvement et de repos<ref>Aristote, ''Physique'', II, 1, 192b13-23. Pour une introduction d'ensemble à la philosophie naturelle aristotélicienne, voir Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie III ; ainsi que l'entrée « Aristotle's Natural Philosophy » de la ''Stanford Encyclopedia of Philosophy''.</ref>. Un être naturel (''phusei on'') se distingue ainsi d'un être artificiel : une plante croît et se reproduit par sa propre nature, tandis qu'un lit, fait de bois, ne produit pas naturellement d'autres lits.
Cette définition fonde l'autonomie de la nature et de son étude. Les êtres naturels ont leurs principes en eux-mêmes et ne dépendent pas de causes extérieures pour leur mouvement essentiel. Le physicien doit étudier non seulement la forme des choses, mais aussi leur matière, car la matière est le principe des mouvements naturels<ref>Aristote, ''Physique'', II, 2, 194a12-27.</ref>. Comme le souligne Larose, la défense aristotélicienne de l'autonomie de la physique constitue une contribution durable de la pensée du Stagirite : « Sa défense de l'autonomie des domaines du savoir, encore une fois contre Platon, est toujours d'actualité. Le refus de réduire la biologie aux mathématiques est bien aristotélicien »<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>.
==== Les quatre causes ====
Pour comprendre pleinement un être naturel, il faut connaître ses quatre causes. La cause matérielle est ce dont une chose est faite (le bronze est la cause matérielle de la statue). La cause formelle est l'essence ou la définition de la chose (la forme de l'Hermès est la cause formelle de la statue d'Hermès). La cause efficiente est ce qui a produit la chose (le sculpteur est la cause efficiente de la statue). La cause finale est ce en vue de quoi la chose existe (la décoration du temple est la cause finale de la statue)<ref>Aristote, ''Physique'', II, 3, 194b23-195a3.</ref>.
Ces quatre causes ne s'excluent pas mais se complètent. Plusieurs causes peuvent coïncider : la forme, le moteur et la fin peuvent être identiques. Dans la génération naturelle d'un homme, c'est la forme d'homme qui est à la fois dans le géniteur (cause efficiente), dans l'engendré (cause formelle), et visée comme fin du processus de génération<ref>Aristote, ''Physique'', II, 7, 198a24-27.</ref>.
==== Le mouvement et ses espèces ====
Le mouvement (''kinêsis'') ou changement est défini comme « l'actualité de ce qui est en puissance en tant que tel »<ref>Aristote, ''Physique'', III, 1, 201a10-11.</ref>. Cette définition signifie que le mouvement est l'acte d'un être qui n'est pas encore pleinement actualisé, mais en voie de l'être. C'est un acte imparfait, par opposition à l'acte parfait (''energeia'') qui est l'actualité achevée d'une chose.
Aristote distingue quatre espèces de changement selon les catégories : le changement substantiel (génération et corruption), le changement qualitatif (altération), le changement quantitatif (accroissement et diminution), et le changement local (déplacement)<ref>Aristote, ''Physique'', V, 1, 225a34-225b9.</ref>. Parmi ces changements, le mouvement local est premier, car il peut exister sans les autres<ref>Aristote, ''Physique'', VIII, 7, 260a26-260b7.</ref>.
==== L'éternité du mouvement et le Premier Moteur ====
Le mouvement est-il éternel ou a-t-il commencé ? Aristote argumente qu'il doit être éternel, car toute génération du mouvement supposerait un mouvement antérieur<ref>Aristote, ''Physique'', VIII, 1, 251a8-252b6.</ref>. Or tout ce qui est mû est mû par autre chose<ref>Aristote, ''Physique'', VII, 1, 241b24-242a15.</ref>. Pour éviter une régression à l'infini, il faut postuler un Premier Moteur immobile qui meut éternellement.
Ce Premier Moteur meut sans être mû, à la manière dont l'objet du désir meut le désirant. Il est donc cause finale plutôt qu'efficiente du mouvement éternel du ciel<ref>Aristote, ''Physique'', VIII, 6, 259b20-260a19.</ref>. Cette preuve « physique » du Premier Moteur prépare les développements métaphysiques du livre Λ de la ''Métaphysique''. Comme le souligne Annick Jaulin, l'interprétation de ce passage et sa relation aux livres centraux de la ''Métaphysique'' constitue l'un des problèmes les plus discutés de l'aristotélisme contemporain<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>.
=== Le ''De caelo'' – Le ciel et les éléments ===
==== La cinquième essence et l'éternité du monde ====
Le traité ''Du ciel'' étudie le mouvement circulaire du ciel et sa substance. Aristote établit qu'il existe un cinquième élément, l'éther (''aithêr''), distinct des quatre éléments sublunaires, animé d'un mouvement circulaire naturel et éternel<ref>Aristote, ''Du ciel'', I, 2, 269a2-269b17.</ref>. Cette quintessence ne connaît ni génération ni corruption, ni accroissement ni diminution.
Le ciel est, selon Aristote, éternel, sans commencement ni fin. Aristote réfute les cosmogonies qui, comme celle du ''Timée'' de Platon, faisaient naître le monde dans le temps<ref>Aristote, ''Du ciel'', I, 10-12, 279b4-284a35.</ref>. Cette thèse de l'éternité du monde entrera en conflit, au Moyen Âge, avec le dogme chrétien de la création ''ex nihilo'', donnant lieu à des tentatives de conciliation comme celles de Thomas d'Aquin.
==== La structure du cosmos ====
Aristote défend une cosmologie géocentrique. La Terre, sphérique, est immobile au centre de l'univers<ref>Aristote, ''Du ciel'', II, 14, 296b6-297b21.</ref>. Autour d'elle se trouvent les sphères concentriques des quatre éléments sublunaires (terre, eau, air, feu), puis les sphères célestes portant les astres<ref>Aristote, ''Du ciel'', II, 12, 292a14-293a11.</ref>.
Cette cosmologie restera dominante jusqu'à Copernic, Kepler et Galilée. Elle repose sur la distinction entre monde supralunaire, parfait et immuable, et monde sublunaire, siège de la génération et de la corruption. Cette distinction sera ébranlée par la découverte, au début du XVIIe siècle, des taches solaires et de la nature des comètes.
==== Les quatre éléments et leurs mouvements naturels ====
Dans le monde sublunaire, les quatre éléments possèdent des mouvements naturels rectilignes. La terre et l'eau, éléments lourds, se dirigent vers le bas, c'est-à-dire vers le centre de l'univers. L'air et le feu, éléments légers, se dirigent vers le haut, c'est-à-dire vers la périphérie du monde sublunaire<ref>Aristote, ''Du ciel'', IV, 4, 311a15-312a21.</ref>.
Comme le note Pellegrin, Aristote attache une grande importance à l'évidence sensible dans son traitement des questions physiques : il écrit lui-même, à propos de la transformation des éléments, que « le résultat final […] pour la science physique c'est l'évidence sensible qui toujours l'emporte » (''De caelo'', III, 7, 306a11)<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 94.</ref>.
Ces principes fondent la dynamique aristotélicienne, selon laquelle chaque corps tend vers son lieu propre avec une vitesse proportionnelle à son poids et inversement proportionnelle à la résistance du milieu<ref>Aristote, ''Du ciel'', I, 8, 277a27-277b8.</ref>. Cette physique sera critiquée par la révolution galiléenne, qui montrera que dans le vide tous les corps tombent à la même vitesse. Il faut cependant noter, comme l'a montré la recherche récente sur la philosophie naturelle de la Renaissance, que la transition entre la physique aristotélicienne et la mécanique moderne s'est opérée par étapes, à travers des relectures et des modifications internes au cadre péripatéticien plutôt que par un rejet abrupt et frontal<ref>Voir A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', Leiden, Brill, 2009.</ref>.
=== Le ''De generatione et corruptione'' – Génération, corruption et transformation ===
==== Les deux espèces de génération ====
La génération absolue (''genesis haplôs'') est le passage du non-être à l'être d'une substance : un homme naît. La génération relative (''genesis ti'') est l'altération d'une substance qui demeure : un homme devient musicien<ref>Aristote, ''De la génération et la corruption'', I, 3, 317a17-b18.</ref>. Aristote cherche à éviter deux écueils : l'éléatisme de Parménide, qui niait tout devenir, et l'atomisme de Démocrite, qui réduisait toute génération à une simple agrégation d'atomes éternels.
La solution réside dans les concepts de matière et de forme. Dans toute génération, quelque chose persiste (la matière) tandis que quelque chose advient (la forme). Dans la génération absolue, la matière première indéterminée reçoit une nouvelle forme substantielle. Dans la génération relative, la substance demeure identique tandis que ses accidents changent<ref>Aristote, ''De la génération et la corruption'', I, 4, 319b6-320a7.</ref>.
==== Action et passion, contact et mélange ====
Pour qu'il y ait génération, il faut qu'un agent agisse sur un patient. Mais l'action n'est pas séparée de la passion : ce sont deux aspects d'un même changement<ref>Aristote, ''De la génération et la corruption'', I, 7, 323b18-324a19.</ref>.
Le mélange (''mixis'') se distingue de la simple juxtaposition par le fait que les composants, tout en formant un nouveau corps homogène, peuvent être restitués par analyse. Aristote critique l'atomisme qui ramène le mélange à un simple entrelacement d'atomes : si les composants demeuraient inchangés, il n'y aurait pas véritable mélange<ref>Aristote, ''De la génération et la corruption'', I, 10, 327a30-328a5.</ref>. Dans le véritable mélange, les qualités des composants s'unissent pour former une nouvelle qualité intermédiaire.
=== Les ''Météorologiques'' – Les phénomènes du monde sublunaire ===
==== Le programme de la science naturelle ====
Les ''Météorologiques'' s'insèrent dans le programme de la physique aristotélicienne. Après la ''Physique'' (principes du mouvement), le ''De caelo'' (structure de l'univers), et le ''De generatione'' (transformations des éléments), Aristote étudie les phénomènes qui résultent de l'action du ciel sur le monde sublunaire<ref>Aristote, ''Météorologiques'', I, 1, 338a20-339a5.</ref>.
Le terme « météorologique » a ici un sens beaucoup plus large qu'aujourd'hui. Il désigne tous les phénomènes qui se produisent dans la région entre la surface de la terre et la sphère de la lune : phénomènes atmosphériques (pluie, vent, tonnerre), mais aussi comètes, Voie Lactée, tremblements de terre, mer et marées, fleuves et leurs crues.
==== Les deux exhalaisons ====
Le principe explicatif fondamental est celui des deux exhalaisons. Le soleil, par son mouvement et sa chaleur, produit deux sortes d'évaporations terrestres : une exhalaison humide (vapeur d'eau) et une exhalaison sèche (exhalations terrestres combustibles)<ref>Aristote, ''Météorologiques'', I, 3, 340b19-341a12.</ref>. Ces deux exhalaisons donnent naissance à la plupart des phénomènes météorologiques.
L'exhalaison humide, refroidie dans les régions supérieures, retombe en pluie. L'exhalaison sèche, enflammée au contact de la sphère du feu, produit les phénomènes ignés : étoiles filantes, comètes, Voie Lactée<ref>Aristote, ''Météorologiques'', I, 4-8, 341b6-346a34.</ref>. Ces explications, souvent fausses au regard de la science moderne, témoignent d'une démarche qui cherche à rendre compte des phénomènes par des causes naturelles, sans recourir au mythe.
=== Le ''De anima'' – L'âme, forme du corps vivant ===
==== Définition de l'âme ====
Le traité ''De l'âme'' relève à la fois de la physique – l'âme est principe de mouvement du corps vivant – et de ce qu'on appellerait aujourd'hui psychologie ou philosophie de l'esprit. Après avoir réfuté les conceptions de ses prédécesseurs, Aristote définit l'âme comme « l'entéléchie première d'un corps naturel ayant la vie en puissance »<ref>Aristote, ''De l'âme'', II, 1, 412a27-28.</ref>.
L'âme est la forme du corps vivant, son acte premier, principe de toutes ses opérations vitales. Elle n'est ni une substance séparée habitant le corps comme un pilote dans son navire (critique du dualisme platonicien), ni une simple harmonie ou arrangement du corps (critique du matérialisme), mais la forme substantielle indissociable du corps qu'elle anime<ref>Aristote, ''De l'âme'', II, 1, 413a3-10.</ref>. Cette doctrine hylémorphique de l'âme est aujourd'hui remise au premier plan par certains travaux de philosophie de l'esprit qui y voient une alternative au dualisme cartésien et au réductionnisme matérialiste<ref>Voir Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie IV ; ainsi que les travaux de Sophia Connell sur la psychologie aristotélicienne.</ref>.
==== Les trois âmes et leurs facultés ====
Il y a, selon Aristote, trois niveaux d'âme. L'âme nutritive, commune à tous les vivants (plantes, animaux, hommes), assure la nutrition, la croissance et la reproduction. L'âme sensitive, propre aux animaux, ajoute la sensation, le désir et le mouvement local. L'âme intellective, propre à l'homme, ajoute la pensée rationnelle<ref>Aristote, ''De l'âme'', II, 2-3, 413a20-414b28.</ref>.
Ces trois âmes ne sont pas trois substances séparées, mais trois niveaux de capacités, les supérieures incluant les inférieures. Un animal possède toutes les capacités de la plante plus les siennes propres ; l'homme possède celles de la plante et de l'animal plus l'intelligence.
==== La sensation et l'intellection ====
La sensation est la réception de la forme sensible sans la matière, comme la cire reçoit l'empreinte du sceau sans recevoir le métal dont il est fait<ref>Aristote, ''De l'âme'', II, 12, 424a17-21.</ref>. Chaque sens a son objet propre (la couleur pour la vue, le son pour l'ouïe). Il existe aussi un sens commun qui perçoit les sensibles communs (mouvement, repos, nombre, figure)<ref>Aristote, ''De l'âme'', III, 1-2, 425a13-427a16.</ref>.
L'intellect (''nous'') est la faculté de penser les formes intelligibles. Aristote distingue l'intellect patient, qui reçoit les formes, et l'intellect agent, qui les abstrait à partir des images sensibles<ref>Aristote, ''De l'âme'', III, 5, 430a10-25.</ref>. L'interprétation de ce passage célèbre et bref est l'une des plus controversées de l'aristotélisme : l'intellect agent est-il une partie de l'âme humaine ou une réalité séparée ? Est-il immortel ou périssable avec le corps ? Ces questions ont donné lieu, dans la tradition commentatoriale arabe et latine, à des positions divergentes (Alexandre d'Aphrodise, Avicenne, Averroès, Thomas d'Aquin).
=== Les ''Parva Naturalia'' – Les fonctions vitales ===
==== Organisation des Petits traités d'histoire naturelle ====
Les ''Parva Naturalia'' regroupent un ensemble de courts traités sur diverses fonctions vitales et leurs organes. Ils complètent le ''De anima'' en étudiant non plus l'âme en général mais ses opérations particulières<ref>Aristote, ''De la sensation'', 1, 436a1-17.</ref>.
Le ''De sensu'' traite des sensibles et des organes des sens. Le ''De memoria'' examine la mémoire et la réminiscence. Le ''De somno'' et le ''De insomniis'' étudient le sommeil et les rêves, expliqués par les mouvements qui persistent dans les organes sensoriels après la disparition des stimuli externes<ref>Aristote, ''Du sommeil'', 2, 455a12-455b2.</ref>. Le ''De divinatione'' traite de la divination dans les songes, dont Aristote nie la valeur prophétique.
==== Le cœur, principe de la vie ====
Aristote localise le principe vital et le sens commun dans le cœur plutôt que dans le cerveau<ref>Aristote, ''Des parties des animaux'', III, 4, 666a11-18.</ref>. C'est dans le cœur que réside la chaleur innée. Le cerveau, froid et humide, sert seulement à refroidir la chaleur excessive du cœur<ref>Aristote, ''Des parties des animaux'', II, 7, 652a24-652b34.</ref>.
Cette doctrine cardiocentrique est aujourd'hui jugée incorrecte du point de vue physiologique : Galien, dès l'Antiquité, reconnaîtra au cerveau un rôle dans les sensations et les mouvements volontaires. Comme le note Pellegrin, « aucune [observation] n'a amené Aristote à renverser l'une quelconque des conceptions fantaisistes qu'il a sur le fonctionnement du corps vivant »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 94.</ref>. Cette limite illustre les contraintes méthodologiques de la science aristotélicienne, tributaire des moyens techniques de son époque, sans pour autant invalider la démarche générale qui consiste à expliquer les phénomènes vitaux par des causes naturelles observables.
== La biologie et la connaissance du vivant ==
=== L'''Histoire des animaux'' – L'enquête empirique ===
==== Méthode et organisation de l'œuvre ====
L{{'}}''Histoire des animaux'' (''Peri ta zôia historiai''), en dix livres dont trois sont probablement apocryphes, constitue un travail de collection et de description des faits concernant les animaux<ref>Aristote, ''Histoire des animaux'', I, 6, 491a7-14. Pour une introduction à la biologie aristotélicienne et à son importance dans la recherche contemporaine, voir Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021.</ref>. Le terme ''historia'' signifie ici « enquête » ou « recherche », non pas histoire au sens temporel. Il s'agit d'un exposé systématique des données empiriques qui sert de fondement aux explications causales développées dans les autres traités biologiques.
Aristote y décrit l'anatomie externe et interne, le mode de reproduction, le régime alimentaire, les habitats et les comportements de plusieurs centaines d'espèces animales. Cette œuvre témoigne d'observations personnelles, complétées par des témoignages de pêcheurs, chasseurs et éleveurs<ref>D'Arcy Wentworth Thompson, introduction à sa traduction de l'''Histoire des animaux'', Oxford, 1910. Pour une mise au point récente sur le rôle de l{{'}}''Historia animalium'' dans le projet biologique aristotélicien, voir A. Gotthelf, « Data-organization, Classification, and Kinds: the Place of the History of Animals in Aristotle's Biological Enterprise », dans ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012, p. 261-292 ; ainsi que James G. Lennox, « Between Data and Demonstration: The Analytics and the Historia Animalium », dans A. Bowen (éd.), ''Science and Philosophy in Classical Greece'', New York, Garland, 1991, p. 261-295.</ref>.
La place de cet ouvrage dans le projet scientifique aristotélicien a été reconsidérée par la recherche contemporaine. La question du rapport entre les ''Seconds Analytiques'' (théorie de la science démonstrative) et la pratique effective des traités biologiques a fait l'objet de débats nourris, notamment autour des travaux de David Balme, Allan Gotthelf et James G. Lennox<ref>Voir David Balme, « Aristotle's Use of Division and Differentiae », dans A. Gotthelf et J.G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987 ; Mariska Leunissen, « History of Animals », dans Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
==== Principes de classification ====
Aristote organise les animaux selon une classification qui prend en compte plusieurs critères : mode de reproduction (vivipares, ovipares, larvipares), habitat (terrestres, aquatiques, aériens), régime alimentaire, présence ou absence de sang<ref>Aristote, ''Histoire des animaux'', I, 6, 490b7-491a6.</ref>. La division fondamentale oppose les animaux sanguins (en gros, les vertébrés) et les animaux non-sanguins (les invertébrés).
Contrairement à une idée parfois répandue, Aristote ne se contente pas d'une classification dichotomique rigide. Il reconnaît que les espèces forment un continuum, avec des formes intermédiaires qui rendent difficile le tracé de frontières nettes. Ainsi, les éponges occupent-elles une position intermédiaire entre les plantes et les animaux<ref>Aristote, ''Histoire des animaux'', I, 1, 487b6-10.</ref>. L'idée d'une ''scala naturae'' (échelle de la nature) influencera la pensée biologique jusqu'à Lamarck et Darwin, même s'il convient de ne pas projeter rétrospectivement sur Aristote des conceptions évolutionnistes qui lui sont étrangères<ref>Voir James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
=== Les ''Parties des animaux'' – La causalité finale dans le vivant ===
==== Méthode de la biologie : de la description à l'explication ====
Le traité ''Des parties des animaux'' se propose d'expliquer pourquoi les animaux possèdent telles parties avec telles configurations. Après l'''Historia'', qui répond à la question « qu'est-ce qui est ? », vient l'étude qui répond à « pourquoi est-ce ainsi ? »<ref>Aristote, ''Des parties des animaux'', I, 1, 639b7-640a9.</ref>.
Le livre I constitue un véritable traité de méthodologie scientifique. Aristote y défend la légitimité de l'étude de la nature : « il faut étudier chaque être sans dégoût, car en chacun réside quelque chose de naturel et de beau »<ref>Aristote, ''Des parties des animaux'', I, 5, 645a15-17.</ref>. Cette injonction est aujourd'hui souvent citée pour souligner l'importance accordée par Aristote à l'observation des phénomènes naturels, même dans leurs manifestations les plus humbles.
==== La priorité de la cause finale ====
Dans l'étude des vivants, la cause finale joue, selon Aristote, un rôle primordial. C'est en vue d'une fonction déterminée que chaque organe est configuré d'une certaine manière. Les dents de devant sont tranchantes pour couper, les molaires larges et plates pour broyer, parce que telle est leur fonction dans la nutrition<ref>Aristote, ''Des parties des animaux'', III, 1, 661b23-662a8.</ref>.
Aristote critique le mécanisme d'Empédocle et des atomistes, qui expliquaient les organes par des rencontres fortuites de particules matérielles. Selon lui, le hasard ne peut produire la régularité observée dans la nature, où chaque espèce reproduit invariablement la même organisation<ref>Aristote, ''Des parties des animaux'', I, 1, 639b11-640a9.</ref>. La matière joue un rôle, par ses propriétés et ses nécessités, mais elle est, dans cette perspective, au service de la forme et de la fin.
La nature de cette téléologie aristotélicienne est aujourd'hui l'un des sujets les plus discutés dans la recherche en philosophie de la biologie. Plusieurs interprétations s'opposent : la téléologie aristotélicienne est-elle « anthropocentrique » (la nature serait organisée pour le bien de l'homme), « cosmique » (le cosmos tout entier serait orienté vers une fin) ou « locale » (chaque espèce ou chaque organe a sa fin propre, sans qu'il y ait de finalité globale du vivant) ? Comme le souligne Pellegrin, « la téléologie aristotélicienne a comme horizon fondamental les espèces animales elles-mêmes »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Vivant », p. 196.</ref>. Cette lecture « locale », défendue notamment par Allan Gotthelf, James G. Lennox et Mariska Leunissen, est aujourd'hui largement partagée<ref>Voir Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', op. cit. ; James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Mariska Leunissen, ''Explanation and Teleology in Aristotle's Science of Nature'', Cambridge, Cambridge University Press, 2010.</ref>.
==== L'unité fonctionnelle de l'organisme ====
Chaque animal forme une totalité organisée dont toutes les parties coopèrent en vue de la vie de l'ensemble. Les poumons existent en vue de la respiration, qui existe en vue du refroidissement du cœur, qui existe en vue de la vie de l'animal. Réciproquement, la possession de poumons impose certaines autres caractéristiques : un animal pourvu de poumons doit avoir un sang et un cœur, doit respirer, donc doit avoir des voies aériennes<ref>Aristote, ''Des parties des animaux'', III, 6, 668b33-669a13.</ref>.
Cette conception « systémique » de l'organisme, où chaque partie trouve sa raison d'être dans sa contribution au tout, est aujourd'hui souvent rapprochée des approches fonctionnalistes en biologie contemporaine. Elle fonde aussi la possibilité d'une connaissance rationnelle du vivant : malgré la complexité des formes de vie, on peut les comprendre en dégageant les rapports fonctionnels entre les parties et le tout<ref>Voir Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit. ; Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie III.</ref>.
=== La ''Génération des animaux'' – Reproduction et hérédité ===
==== Les modes de reproduction ====
Le traité ''De la génération des animaux'' étudie la reproduction sexuée et asexuée, la formation de l'embryon, l'hérédité. Aristote distingue plusieurs modes de génération : par accouplement (la plupart des animaux), par génération spontanée (certains insectes, les anguilles qu'on croyait alors naître de la vase), par bourgeonnement (certaines plantes)<ref>Aristote, ''De la génération des animaux'', I, 1, 715a1-18.</ref>.
Dans la génération sexuée, le mâle apporte, selon Aristote, la forme et le principe du mouvement (la semence), tandis que la femelle apporte la matière (les menstrues chez les vivipares, l'œuf chez les ovipares)<ref>Aristote, ''De la génération des animaux'', I, 20, 729a9-b21.</ref>. Cette théorie reflète des préjugés androcentrés de l'époque : elle dénie à la femelle tout rôle actif dans la génération, la réduisant à fournir le substrat matériel informé par la semence mâle. La recherche contemporaine, notamment féministe, a discuté de manière approfondie ce volet de la pensée aristotélicienne ; elle souligne à la fois sa cohérence interne avec la métaphysique du composé hylémorphique et le caractère contestable de ses présupposés empiriques et sociaux<ref>Voir Sophia M. Connell, ''Aristotle on Female Animals: A Study of the Generation of Animals'', Cambridge, Cambridge University Press, 2016 ; ainsi que les contributions à Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
==== L'embryogenèse et la formation des parties ====
Aristote décrit avec précision le développement de l'embryon de poulet, qu'il a observé en ouvrant des œufs à différents stades d'incubation. Il voit d'abord se former le cœur, qui bat dès le troisième jour, puis progressivement les autres organes<ref>Aristote, ''Histoire des animaux'', VI, 3, 561a4-561b13.</ref>. Cette description fonde une conception épigénétique de l'embryologie : l'embryon se construit progressivement, par différenciation graduelle, et non par simple croissance d'un organisme préformé miniature.
La cause de cette différenciation progressive est, selon Aristote, la chaleur vitale contenue dans la semence, qui « cuit » et façonne la matière menstruelle comme la présure fait cailler le lait<ref>Aristote, ''De la génération des animaux'', II, 4, 739b20-740a4.</ref>. Ce processus n'est pas mécanique mais finalisé : c'est en vue de telle forme déterminée (l'homme adulte, le poulet adulte) que les parties se forment dans tel ordre.
==== L'hérédité et la ressemblance ====
Pourquoi les enfants ressemblent-ils à leurs parents ? Aristote explique ces phénomènes par le degré de « cuisson » et de maîtrise qu'exerce la semence mâle sur la matière femelle. Si la cuisson est parfaite, l'enfant ressemble au père ; si elle l'est moins, à la mère ; encore moins, aux grands-parents<ref>Aristote, ''De la génération des animaux'', IV, 3, 767b15-768a14.</ref>.
Ces explications, rudimentaires au regard de la génétique moderne, témoignent d'un effort pour rendre compte rationnellement de phénomènes que d'autres cultures expliquaient par l'intervention divine. Aristote pose les questions fondamentales de la biologie (qu'est-ce que la vie ? comment les formes se transmettent-elles ? pourquoi existe-t-il une telle diversité d'espèces ?) et invente des méthodes pour y répondre.
=== Le ''De motu animalium'' et le ''De incessu animalium'' – Le mouvement animal ===
==== Le principe du mouvement volontaire ====
Le ''De motu animalium'' examine comment les animaux se meuvent localement par eux-mêmes. Aristote établit qu'un animal ne peut se mouvoir que s'il s'appuie sur quelque chose d'immobile : de même qu'on ne peut pousser un bateau depuis l'intérieur du bateau, l'animal doit prendre appui sur le sol, l'eau ou l'air<ref>Aristote, ''Du mouvement des animaux'', 2, 698b7-699a11.</ref>.
Le principe moteur interne est le désir, excité par la sensation ou l'imagination d'un objet désirable. Le désir entraîne un réchauffement dans la région du cœur, qui se communique aux membres et produit leur contraction ou extension<ref>Aristote, ''Du mouvement des animaux'', 10, 703a4-b2.</ref>. Le mouvement animal, bien que produit de l'intérieur, a toujours une cause finale externe : l'objet désiré qui meut sans être mû.
==== Les modes de locomotion ====
Le ''De incessu animalium'' décrit et explique les différents modes de locomotion : marche, course, vol, nage. Aristote établit des lois générales : les animaux sanguins ne peuvent avoir plus de quatre points d'appui, car la nature ne fait rien en vain, et quatre suffisent à assurer la stabilité<ref>Aristote, ''De la marche des animaux'', 8, 708a9-708b9.</ref>. Les oiseaux ont des ailes parce qu'ils ont le corps léger et la poitrine large et musculeuse<ref>Aristote, ''De la marche des animaux'', 10, 710a10-710b7.</ref>.
Ces études relèvent de ce que nous appellerions aujourd'hui biomécanique. Elles montrent qu'Aristote ne se contente pas de contempler les formes vivantes, mais cherche à en expliquer le fonctionnement par des causes physiques, sans abandonner le cadre téléologique général qui voit dans la nature l'action d'une finalité immanente.
== La philosophie première : la métaphysique ==
=== Objet et divisions de la métaphysique ===
==== La science de l'être en tant qu'être ====
La métaphysique, qu'Aristote nomme « philosophie première » ou « sagesse », est définie comme la science de l'être en tant qu'être (''on hêi on'') et de ce qui lui appartient essentiellement<ref>Aristote, ''Métaphysique'', Γ, 1, 1003a21-22. Sur l'unité (et la possible disparité) du projet métaphysique aristotélicien, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction et chap. « La science recherchée » ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit.</ref>. Cette formulation distingue la métaphysique des sciences particulières qui étudient un aspect de l'être : la géométrie l'étudie en tant que continu, la biologie en tant que vivant. Seule la métaphysique considérerait l'être dans sa totalité.
Comme le souligne Annick Jaulin, le terme « métaphysique » lui-même n'apparaît jamais dans les traités aristotéliciens : il s'agit d'un titre éditorial donné par Andronicos<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Pellegrin recense quant à lui plusieurs définitions concurrentes de cette science chez Aristote : recherche des premiers principes et des premières causes, science de l'être en tant qu'être, science de la substance, science théologique<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Métaphysique », p. 136-137.</ref>.
Cette science est dite « première » en deux sens : elle porte sur ce qui est premier dans l'ordre de l'être (les principes et causes premiers), et elle examine les principes communs à toutes les sciences, comme le principe de non-contradiction<ref>Aristote, ''Métaphysique'', Γ, 3, 1005a19-b8.</ref>. Elle est aussi qualifiée de « science théologique » car elle porte sur ce qu'il y a de plus divin, le Premier Moteur immobile<ref>Aristote, ''Métaphysique'', Α, 2, 983a5-10.</ref>.
==== La question de l'unité de la métaphysique ====
Comment la métaphysique peut-elle être à la fois ontologie générale, étude de l'être en tant qu'être, et théologie, étude d'un être particulier (Dieu) ? Cette tension a donné lieu à plusieurs interprétations dans l'histoire de la philosophie<ref>Pour un état de la question, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit. ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 1-2.</ref>.
Une lecture, défendue notamment par Werner Jaeger, voit dans le corpus de la ''Métaphysique'' deux projets juxtaposés correspondant à deux périodes différentes de la pensée d'Aristote : une métaphysique ontologique générale, plus tardive, et une métaphysique théologique d'inspiration platonicienne, plus ancienne<ref>Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', op. cit. Cette lecture est cependant aujourd'hui largement contestée ; voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit.</ref>.
Une autre lecture, défendue par Thomas d'Aquin et reprise par toute une tradition, soutient que l'unité est assurée par le fait que Dieu est principe de tout être<ref>Thomas d'Aquin, ''In Metaphysicam Aristotelis Commentaria'', Prooemium.</ref>. C'est ce que la tradition appellera l'« onto-théologie ».
Une troisième lecture, plus récente, défendue notamment par Pierre Aubenque, considère que la synthèse entre ontologie et théologie est en fait impossible et que la ''Métaphysique'' aristotélicienne reste inachevée comme problème<ref>Pierre Aubenque, ''Le problème de l'être chez Aristote'', op. cit. Voir aussi Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 137.</ref>. Une quatrième lecture, présente notamment dans le travail d'Annick Jaulin, refuse de lire l'expression « substance séparée » au sens transcendant et soutient qu'Aristote, plutôt que d'opérer une rupture avec la physique, « réinscrit la substance immobile dans la tradition des penseurs de la nature »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>. Le débat reste ouvert.
==== Les apories de la métaphysique ====
Le livre Β de la ''Métaphysique'' expose méthodiquement les apories, c'est-à-dire les difficultés que rencontre toute tentative de construire une science de l'être et des principes premiers : Y a-t-il une science unique de toutes les causes ? La science de l'être porte-t-elle aussi sur les principes de la démonstration ? Y a-t-il seulement des substances sensibles, ou existe-t-il aussi des substances séparées ? Les principes sont-ils universels ou particuliers ? En acte ou en puissance ?<ref>Aristote, ''Métaphysique'', Β, 1, 995b4-996a17.</ref>
Cette méthode aporétique est caractéristique de la démarche aristotélicienne : « Il faut, pour bien rechercher, avoir auparavant développé les apories »<ref>Aristote, ''Métaphysique'', Β, 1, 995a24-27.</ref>.
=== La substance (livres Z-H) ===
==== Qu'est-ce que la substance ? ====
Si l'être se dit en plusieurs sens, et si la substance est le sens premier de l'être, la question centrale de la métaphysique devient : qu'est-ce que la substance (''ousia'') ?<ref>Aristote, ''Métaphysique'', Ζ, 1, 1028a10-1028b2.</ref> Quatre candidats se présentent : l'essence (''to ti ên einai''), l'universel (''to katholou''), le genre (''to genos''), et le substrat (''to hupokeimenon''). Ce dernier peut être entendu en trois sens : la matière, la forme, ou le composé des deux.
Aristote élimine d'abord l'universel et le genre : ils ne peuvent être substances parce qu'ils se prédiquent de plusieurs choses, alors que la substance de chaque chose lui est propre<ref>Aristote, ''Métaphysique'', Ζ, 13, 1038b8-16.</ref>. Cette exclusion vise notamment la théorie platonicienne des Idées.
L'interprétation de cet examen, et la question de savoir lequel des trois candidats restants (matière, forme, composé) Aristote retient finalement comme substance première, fait l'objet de débats considérables dans la recherche contemporaine. Comme le résume Christof Rapp, « les controverses interprétatives concernant l'interprétation des livres pertinents s'étendent de la question de savoir jusqu'où s'étend le traitement de l{{'}}''ousia'' (seulement le livre Z, ZH ou même ZHΘ), à la question de la structuration interne du traité de l{{'}}''ousia'', en passant par les questions sur l'objectif précis et la finalité philosophique de ces livres, jusqu'à la question de la nature de l'''eidos'' (la forme) – qui est au cours du traité plusieurs fois désignée comme ''ousia'' – et enfin la question du rapport entre matière et forme et l'unité de l{{'}}''ousia'' qui y est liée »<ref>Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', op. cit., chap. IV.18 (traduction libre).</ref>.
==== La forme, candidat à la substantialité ====
Le substrat semble avoir des titres à être appelé substance, puisqu'il est ce dont tout le reste se dit. Mais si l'on identifiait la substance à la matière pure, support ultime de toutes les déterminations, on aboutirait au paradoxe qu'une substance pourrait exister sans aucune détermination<ref>Aristote, ''Métaphysique'', Ζ, 3, 1029a10-26.</ref>.
C'est donc la forme (''morphê'', ''eidos'') qui apparaît, dans plusieurs passages des livres centraux, comme substance au sens propre. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence. Elle est aussi acte (''energeia'') par opposition à la matière qui est puissance (''dynamis''). Un morceau d'airain est en puissance une statue ; quand le sculpteur lui a donné la forme de l'Hermès, il est en acte une statue. La forme actualise la matière et lui confère l'être déterminé<ref>Aristote, ''Métaphysique'', Η, 2, 1042b9-1043a28.</ref>.
==== Le composé de matière et de forme ====
La substance concrète, l'individu réel, n'est ni la matière seule ni la forme seule, mais leur composé (''synolon''). Callias n'est ni simplement de la chair et des os, ni simplement la forme de l'homme, mais cet homme-ci composé de cette chair-ci et de ces os-ci structurés selon la forme humaine<ref>Aristote, ''Métaphysique'', Ζ, 10, 1035b14-27.</ref>.
La forme demeure cependant première en un sens, car c'est elle qui confère l'unité au composé. Sans la forme, la matière ne serait qu'un amas d'éléments disparates. C'est l'âme, forme du corps vivant, qui fait que ce corps est un organisme uni et non un simple agrégat. Dans l'ordre de la connaissance aussi, c'est par la forme qu'on définit et connaît la substance : on définit l'homme par sa forme (animal rationnel), non par sa matière (chair et os)<ref>Aristote, ''Métaphysique'', Ζ, 11, 1037a21-33. Pour une discussion approfondie, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « La substance ».</ref>.
=== Puissance et acte (livre Θ) ===
==== La distinction de la puissance et de l'acte ====
La distinction entre puissance (''dynamis'') et acte (''energeia'', ''entelecheia'') est l'une des contributions majeures d'Aristote à la philosophie. Elle permet de répondre aux apories de Parménide et de Platon concernant le devenir. Comment une chose peut-elle devenir ce qu'elle n'est pas ? En étant en puissance ce qu'elle devient en acte. Le bronze n'est pas une statue, mais il est en puissance une statue, de sorte qu'il peut le devenir sans passer du non-être à l'être<ref>Aristote, ''Métaphysique'', Θ, 6, 1048a30-1048b17.</ref>.
Une chose en puissance n'a pas encore telle propriété, mais elle a la capacité de l'acquérir. La capacité n'est ni l'absence pure (le bronze ne peut pas devenir homme), ni la présence actuelle (ce qui est actuellement chaud n'a plus la capacité de le devenir). Elle est un mode d'être intermédiaire<ref>Aristote, ''Métaphysique'', Θ, 7, 1049a1-18.</ref>.
==== La priorité de l'acte sur la puissance ====
Aristote établit que l'acte est antérieur à la puissance en plusieurs sens : dans l'ordre de la définition (on définit la puissance par l'acte correspondant), dans l'ordre de la connaissance, dans l'ordre de l'essence et du temps<ref>Aristote, ''Métaphysique'', Θ, 8, 1049b10-1050a3.</ref>.
Plus profondément, ce qui est éternellement en acte est antérieur à ce qui peut être tantôt en acte, tantôt en puissance. Or les substances divines sont éternellement en acte, tandis que les substances sensibles passent de la puissance à l'acte et de l'acte à la puissance. Les substances immobiles éternelles sont donc absolument premières<ref>Aristote, ''Métaphysique'', Θ, 8, 1050b6-28.</ref>.
Comme le souligne Annick Jaulin, cette primauté de l'acte sur la puissance n'est pas un simple point doctrinal mais structure l'ensemble de la philosophie première : « la primauté de l'acte sur la puissance permet de poser l'antériorité de la forme sur la matière », et elle « ouvre également la possibilité d'une interprétation positive du devenir »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « La science recherchée ».</ref>.
=== L'Un et le Multiple (livres I-K) ===
==== L'un se dit en plusieurs sens ====
Parallèlement à l'être, l'un aussi se dit en plusieurs sens. Il y a l'un par accident (le musicien et l'homme sont un quand le musicien est homme). Il y a l'un par soi, qui se divise en un par continuité (une route), un par indivisibilité en espèce (tout homme est un par l'espèce), un par le concept et la définition<ref>Aristote, ''Métaphysique'', Ι, 1, 1052a15-1052b14.</ref>.
Les pythagoriciens et Platon avaient fait de l'Un un principe suprême, antérieur même à l'être. Aristote critique cette position : l'un n'est pas une substance séparée, mais une propriété convertible avec l'être<ref>Aristote, ''Métaphysique'', Ι, 2, 1053b16-1054a13.</ref>. Dire qu'une chose est et dire qu'elle est une, c'est la même chose.
==== La pluralité et le nombre ====
La pluralité s'oppose à l'un comme le divisible à l'indivisible. Le nombre est une pluralité mesurée par l'un<ref>Aristote, ''Métaphysique'', Ι, 1, 1053a18-24.</ref>. Cette analyse fonde la possibilité des mathématiques et des sciences quantitatives.
=== Le Premier Moteur immobile (livre Λ) ===
==== La démonstration de l'existence du Premier Moteur ====
Le livre Λ de la ''Métaphysique'' constitue le sommet de la philosophie première aristotélicienne. Après avoir établi que les substances sont premières parmi les êtres, Aristote examine quelles substances existent. Il y a évidemment les substances sensibles, soumises au changement. Mais existe-t-il aussi une substance éternelle immobile ?<ref>Aristote, ''Métaphysique'', Λ, 6, 1071b3-5.</ref>
La démonstration procède à partir du mouvement. Il existe du mouvement, cela est manifeste. Or tout ce qui est mû est mû par autre chose. Ou bien il y a un premier moteur immobile, ou bien la série des moteurs remonte à l'infini. Mais une série infinie de causes ne peut rien expliquer, car en l'absence d'un premier il n'y aurait ni intermédiaire ni dernier<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a19-1072b4.</ref>. Il doit donc exister un premier moteur qui meut sans être mû.
==== La nature du Premier Moteur ====
Ce Premier Moteur est substance, acte pur, éternel, sans parties, sans grandeur. Il meut comme objet de désir et d'intellection : l'intellect désire le bien et se meut vers lui. Le Premier Moteur, étant le bien suprême et l'intelligible suprême, attire vers lui le premier ciel qui l'imite par son mouvement circulaire éternel<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a23-1072b4.</ref>.
Quelle est la vie de ce Premier Moteur ? Il est Pensée, mais que pense-t-il ? Il doit penser ce qu'il y a de plus excellent, donc lui-même. Il est donc Pensée de la Pensée (''noêsis noêseôs noêsis''), intellection qui se pense elle-même dans une contemplation éternellement bienheureuse<ref>Aristote, ''Métaphysique'', Λ, 9, 1074b33-35.</ref>.
==== Les moteurs des sphères ====
Le mouvement des astres requiert, outre le Premier Moteur qui meut la sphère des fixes, une pluralité de moteurs immobiles pour les sphères des planètes. Aristote, se fondant sur l'astronomie d'Eudoxe et de Callippe, compte cinquante-cinq sphères, donc cinquante-cinq moteurs<ref>Aristote, ''Métaphysique'', Λ, 8, 1073a14-1074b14.</ref>. Ces moteurs ne sont pas subordonnés les uns aux autres dans une hiérarchie, mais chacun meut directement sa sphère.
Cette pluralité d'intelligences motrices a posé un problème théologique au Moyen Âge : la tradition péripatéticienne et la scolastique médiévale ont tenté de la concilier avec l'unité divine en faisant des moteurs des substances secondes subordonnées au Premier Moteur. La recherche contemporaine, notamment Annick Jaulin, propose une lecture moins théologique : il s'agirait pour Aristote de fournir une explication causale du mouvement astronomique, sans projet théologique transcendant<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>.
=== Critique de la théorie platonicienne des Idées (livres M-N) ===
==== Les arguments contre les Idées séparées ====
Les livres M et N de la ''Métaphysique'' reprennent et développent la critique de la théorie platonicienne des Idées, déjà amorcée dans le livre A. Aristote reconnaît à Platon le mérite d'avoir affirmé l'existence de réalités intelligibles éternelles, mais lui reproche d'avoir séparé ces formes des choses sensibles et d'en avoir fait des substances subsistant par elles-mêmes<ref>Aristote, ''Métaphysique'', Μ, 4-5, 1078b7-1080a8.</ref>.
Cette séparation est, selon Aristote, inutile et impossible. Inutile, car les Idées ne servent ni à la connaissance des sensibles, ni à leur existence, ni à leur devenir<ref>Aristote, ''Métaphysique'', Α, 9, 991a8-991b9.</ref>. Impossible, car elle conduit à des apories comme l'argument du Troisième Homme<ref>Aristote, ''Métaphysique'', Α, 9, 990b17-991a8.</ref>.
==== Le statut des êtres mathématiques ====
Platon situait les êtres mathématiques (nombres, figures) dans un plan intermédiaire entre les Idées et les sensibles. Aristote refuse cette ontologie tripartite. Les objets mathématiques n'existent pas séparément, mais par abstraction<ref>Aristote, ''Métaphysique'', Μ, 3, 1078a21-31.</ref>. Le mathématicien considère les sensibles non en tant que sensibles mais en tant que continus ou quantifiés, faisant abstraction de leurs autres propriétés.
Cette solution préserve l'objectivité des mathématiques sans multiplier les êtres. Les vérités mathématiques sont nécessaires et universelles parce qu'elles portent sur des propriétés que les choses sensibles possèdent nécessairement, même si ces propriétés ne sont jamais réalisées dans les sensibles avec la perfection qu'étudie le mathématicien<ref>Aristote, ''Métaphysique'', Μ, 2, 1077a9-1077b17.</ref>.
== La philosophie pratique : éthique, politique, rhétorique, poétique ==
=== L'''Éthique à Nicomaque'' – La vie bonne ===
==== Le souverain bien et le bonheur ====
L'''Éthique à Nicomaque'' s'ouvre sur l'affirmation que toute action et toute recherche vise un bien. Parmi les biens, il y en a un qui est visé pour lui-même et en vue duquel tous les autres sont poursuivis : c'est le souverain bien, que tous appellent bonheur (''eudaimonia'')<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1095a14-26. Pour une introduction d'ensemble à l'éthique aristotélicienne, voir Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', Londres, Routledge, 2001 ; Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', Cambridge, Cambridge University Press, 2014.</ref>.
Comme le note Pellegrin, Aristote, dans le premier livre de l'''Éthique à Nicomaque'', « donne l'un des exemples les plus caractéristiques et les plus aboutis du traitement d'une notion léguée par la tradition »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Bonheur (eudaimonia) », p. 37.</ref> : il commence par exposer les opinions reçues sur le bonheur (plaisir, honneurs, richesse, vertu, contemplation), puis examine ce qu'il peut conserver de chacune.
Pour déterminer le bonheur véritable, Aristote recourt à la notion de fonction (''ergon'') : le bien pour chaque être réside dans l'accomplissement de sa fonction propre. La fonction propre de l'homme est l'activité de l'âme rationnelle selon l'excellence. Le bonheur est donc « une activité de l'âme selon la vertu parfaite, dans une vie complète »<ref>Aristote, ''Éthique à Nicomaque'', I, 7, 1098a16-18.</ref>.
L'interprétation de cette définition fait l'objet d'un débat important dans la recherche contemporaine, qui oppose une lecture « inclusiviste » à une lecture « dominante »<ref>Sur ce débat, voir Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', op. cit. ; Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit. La question fait l'objet d'une discussion approfondie dans la littérature anglo-saxonne, notamment depuis les travaux de J.L. Ackrill et T.H. Irwin.</ref>. Selon la lecture inclusiviste, le bonheur consiste en l'exercice de toutes les vertus, morales et intellectuelles, dans une vie complète. Selon la lecture dominante, le bonheur s'identifie à l'activité de la vertu la plus haute, c'est-à-dire la contemplation, comme le suggère le livre X. Cette tension entre deux perspectives au sein même de l'''Éthique à Nicomaque'' (entre les premiers livres, qui semblent privilégier une vie pratique vertueuse, et le livre X, qui exalte la vie contemplative) reste l'objet d'interprétations divergentes.
==== Les vertus éthiques et la doctrine du juste milieu ====
Aristote distingue les vertus intellectuelles (sagesse théorique, prudence) des vertus éthiques ou morales (courage, tempérance, justice). Les vertus morales sont des dispositions acquises par l'habitude à choisir le juste milieu entre deux extrêmes vicieux<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1106b36-1107a2.</ref>.
Ainsi, le courage est le juste milieu entre la lâcheté (défaut de crainte) et la témérité (excès d'audace). La tempérance est le milieu entre l'insensibilité et l'intempérance. La libéralité est le milieu entre l'avarice et la prodigalité<ref>Aristote, ''Éthique à Nicomaque'', II, 7, 1107a33-1108b10.</ref>. Ce milieu n'est pas arithmétique mais relatif à nous : il dépend des circonstances et de l'agent. Toute l'œuvre de la vertu consiste à trouver ce milieu, guidée par la droite raison (''orthos logos'') qu'incarne la prudence<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1107a1-2.</ref>.
Cette doctrine du juste milieu a connu une fortune durable dans la philosophie morale. Elle est aujourd'hui au centre du renouveau de l'éthique des vertus en philosophie morale contemporaine, à la suite des travaux d'Anscombe, MacIntyre et Nussbaum<ref>Voir les contributions à Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit.</ref>.
==== L'amitié ====
Les livres VIII et IX de l'''Éthique à Nicomaque'' traitent de l'amitié (''philia''). Aristote distingue trois espèces d'amitié : l'amitié utile, fondée sur l'intérêt réciproque ; l'amitié agréable, fondée sur le plaisir ; et l'amitié parfaite, celle des hommes vertueux qui s'aiment pour eux-mêmes<ref>Aristote, ''Éthique à Nicomaque'', VIII, 3, 1156a6-1156b7.</ref>.
Seule la dernière est véritablement amitié au sens plein, car elle est durable et réciproque. Les deux premières sont instables, car elles cessent quand cesse l'utilité ou le plaisir. L'amitié parfaite requiert du temps et de l'intimité<ref>Aristote, ''Éthique à Nicomaque'', VIII, 6, 1158a10-15.</ref>.
L'amitié n'est pas seulement agréable, elle est nécessaire à la vie bonne. L'homme est un animal politique qui ne peut s'accomplir dans l'isolement. L'ami est, selon Aristote, un autre soi-même : en conversant avec lui, en partageant ses joies et ses peines, nous nous connaissons et nous accomplissons nous-mêmes<ref>Aristote, ''Éthique à Nicomaque'', IX, 9, 1169b16-1170a4.</ref>.
==== La vie contemplative ====
Le livre X conclut l'éthique en affirmant que le bonheur suprême réside dans la vie contemplative. L'activité théorétique de l'intellect serait la plus haute et la plus autosuffisante. Elle nous apparente aux dieux, qui passent l'éternité dans la contemplation<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177a12-18.</ref>. Aristote reconnaît que cette vie purement intellectuelle dépasse les forces humaines prises isolément, mais affirme que dans la mesure où il y a en nous quelque chose de divin, nous devons tendre vers cette vie<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177b30-34.</ref>.
Comme le souligne Pellegrin, ce passage du livre X introduit la notion de « bonheur achevé » (''teleia eudaimonia'') et déclare que « le bonheur pratique, celui du citoyen vertueux, n'est bonheur "qu'à titre secondaire" »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 39, citant ''Éthique à Nicomaque'', X, 8, 1178a9.</ref>. La cohérence entre cette thèse et l'analyse de l'''eudaimonia'' développée dans les premiers livres est l'une des questions les plus discutées de l'aristotélisme moral contemporain.
=== Les ''Politiques'' – La cité et les constitutions ===
==== L'homme, animal politique ====
Les ''Politiques'' commencent par affirmer que la cité (''polis'') existe par nature et que l'homme est par nature un animal politique<ref>Aristote, ''Politiques'', I, 2, 1252b27-1253a3. Pour une vue d'ensemble de la pensée politique aristotélicienne, voir Marguerite Deslauriers et Pierre Destrée (éd.), ''The Cambridge Companion to Aristotle's Politics'', Cambridge, Cambridge University Press, 2013.</ref>. Cette affirmation s'oppose à la fois aux sophistes, qui faisaient de la société une convention artificielle, et à la tradition cynique, qui prônait l'autarcie individuelle.
L'homme ne peut, selon Aristote, ni vivre ni bien vivre en dehors de la cité, car il a besoin des autres pour satisfaire ses besoins matériels et pour actualiser sa nature rationnelle et morale. La cité n'est pas une simple alliance défensive ou commerciale, mais une communauté de vie bonne, ayant pour fin le bonheur de ses membres<ref>Aristote, ''Politiques'', III, 9, 1280b39-1281a4.</ref>.
Il faut signaler ici que les ''Politiques'' contiennent également des thèses aujourd'hui rejetées : la justification de l'esclavage par nature (livre I) et la subordination des femmes ont fait l'objet de critiques nombreuses, déjà au {{XIXe siècle}} et plus encore dans la philosophie féministe contemporaine. Comme le note Larose, « certains des textes [d'Aristote] choqueront à juste titre le lecteur, en particulier ceux qui traitent du statut de la femme et de l'esclavage. Tout philosophe qu'il soit, Aristote est bien un homme de son temps »<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>.
==== Les formes de constitution ====
Aristote distingue six formes de constitution selon deux critères : le nombre de gouvernants (un seul, quelques-uns, la multitude) et la fin poursuivie (l'intérêt commun ou l'intérêt privé des gouvernants). Les formes droites sont la royauté (gouvernement d'un seul pour le bien commun), l'aristocratie (gouvernement de quelques-uns pour le bien commun), et la république ou ''politeia'' (gouvernement de la multitude pour le bien commun). Les formes déviées sont la tyrannie, l'oligarchie et la démocratie au sens péjoratif de démagogie<ref>Aristote, ''Politiques'', III, 7, 1279a22-1279b10.</ref>.
Comme le souligne Pellegrin, l'originalité d'Aristote ne réside pas dans la quête d'une constitution idéale unique, mais dans l'idée qu'« une constitution est dite droite si elle gouverne la cité en vue de "l'avantage commun" »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Politique », p. 57.</ref>. Aucune constitution n'est absolument la meilleure en tout lieu et en tout temps : la meilleure constitution pour une cité donnée dépend des circonstances – étendue du territoire, richesses, mœurs des habitants. Aristote fait preuve ici d'un réalisme politique qui contraste avec l'utopisme de la ''République'' de Platon.
==== La constitution mixte et la classe moyenne ====
La constitution la plus stable, selon le livre IV, est celle qui mêle des éléments oligarchiques et démocratiques, donnant le pouvoir à la classe moyenne<ref>Aristote, ''Politiques'', IV, 11, 1295a25-1295b1.</ref>. Les classes moyennes ne sont ni assez pauvres pour envier les riches, ni assez riches pour mépriser les pauvres. Elles recherchent la stabilité et l'égalité plutôt que les révolutions<ref>Aristote rappelle aussi que « les bons législateurs sont sortis de la classe moyenne », citant l'exemple de Solon, Lycurgue et Charondas. Voir Daniel Larose, ''Aristote de A à Z'', op. cit., article « Constitution mixte ».</ref>.
Cette théorie de la classe moyenne et de la constitution mixte a influencé la pensée politique occidentale, de Polybe à Montesquieu. La méthode aristotélicienne, comme le souligne Pellegrin, ne se contente pas d'observer la diversité des constitutions, mais « rend la diversité intelligible en en construisant un modèle théorique » à partir d'un nombre fini de paramètres<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 60.</ref>.
==== L'éducation ====
Les derniers livres des ''Politiques'' sont consacrés à l'éducation. Celle-ci ne peut être laissée aux familles privées, car la cité a pour fin de rendre les citoyens vertueux. Il doit donc y avoir une éducation publique commune, qui forme le caractère et l'intelligence des jeunes en vue de la vie civique et de la vie bonne<ref>Aristote, ''Politiques'', VIII, 1, 1337a11-21.</ref>.
Cette éducation comprend la gymnastique pour le corps, la musique pour l'âme, les lettres pour l'usage pratique, et le dessin pour apprécier la beauté des œuvres. Mais son but ultime n'est pas l'utilité mais le loisir bien employé (''scholê''), c'est-à-dire l'activité libre de l'esprit<ref>Aristote, ''Politiques'', VIII, 3, 1337b28-1338a13.</ref>.
=== La ''Rhétorique'' – L'art de persuader ===
==== La rhétorique comme art ====
La ''Rhétorique'' étudie les moyens de persuasion dans tous les genres de discours. Elle est l'homologue (''antistrophos'') de la dialectique : de même que la dialectique enseigne à raisonner sur toute question à partir de prémisses probables, la rhétorique enseigne à persuader tout auditoire sur tout sujet<ref>Aristote, ''Rhétorique'', I, 1, 1354a1-11.</ref>.
Aristote prend ses distances avec la critique platonicienne de la rhétorique formulée dans le ''Gorgias''. Bien utilisée, la rhétorique est un art (''technê'') légitime. Elle sert à défendre la vérité et la justice, car « il serait absurde que l'incapacité de se servir de ses forces corporelles soit honteuse, mais non l'incapacité de se servir de la parole »<ref>Aristote, ''Rhétorique'', I, 1, 1355a20-24.</ref>.
==== Les trois genres rhétoriques ====
Aristote distingue trois genres de rhétorique. Le genre délibératif conseille ou dissuade concernant l'avenir (devons-nous faire la guerre ?). Le genre judiciaire accuse ou défend concernant le passé (X a-t-il commis ce crime ?). Le genre épidictique loue ou blâme concernant le présent (célébrons la vertu du héros)<ref>Aristote, ''Rhétorique'', I, 3, 1358b2-29.</ref>.
Chaque genre a ses lieux propres. Le délibératif porte sur l'utile et le nuisible. Le judiciaire porte sur le juste et l'injuste. L'épidictique porte sur le beau et le laid moral<ref>Aristote, ''Rhétorique'', I, 3, 1358b29-1359a5.</ref>.
==== Les preuves rhétoriques : ethos, pathos, logos ====
Aristote distingue trois moyens de persuasion : l'''ethos'' (le caractère de l'orateur), le ''pathos'' (les émotions de l'auditoire), et le ''logos'' (le raisonnement lui-même)<ref>Aristote, ''Rhétorique'', I, 2, 1356a1-13.</ref>.
L'''ethos'' persuade en inspirant confiance : l'orateur doit paraître prudent, vertueux et bienveillant. Le ''pathos'' persuade en suscitant des émotions favorables à la thèse défendue. Le livre II étudie systématiquement les émotions (colère, pitié, crainte, envie), leurs causes et leurs manifestations. Le ''logos'' persuade par les raisonnements, notamment l'enthymème (syllogisme rhétorique à partir de prémisses probables) et l'exemple (induction rhétorique)<ref>Aristote, ''Rhétorique'', I, 2, 1356a35-1356b5.</ref>.
Cette analyse fonde la rhétorique comme discipline rationnelle et systématique. Elle constituera la base de l'enseignement rhétorique jusqu'à l'époque moderne et nourrit aujourd'hui des recherches actives en philosophie de l'argumentation et théorie de la communication.
=== La ''Poétique'' – La création artistique ===
==== La ''mimêsis'' et la ''catharsis'' ====
La ''Poétique'' étudie l'art poétique, principalement la tragédie et l'épopée. La poésie, comme tous les arts, est imitation (''mimêsis''). Mais elle n'imite pas les choses telles qu'elles sont (c'est le rôle de l'histoire), mais telles qu'elles pourraient ou devraient être selon la vraisemblance ou la nécessité<ref>Aristote, ''Poétique'', 9, 1451a36-1451b5.</ref>. C'est pourquoi la poésie est, selon Aristote, plus philosophique que l'histoire : elle dit l'universel, alors que l'histoire dit le particulier.
La tragédie représente une action sérieuse et complète, en suscitant pitié et crainte, pour opérer la purification (''catharsis'') de ces émotions<ref>Aristote, ''Poétique'', 6, 1449b24-28.</ref>. La doctrine de la ''catharsis'' est l'une des plus discutées de toute la philosophie ancienne. L'interprétation médicale (la tragédie « purge » les émotions excessives) a été défendue notamment par Jacob Bernays au {{XIXe siècle}} ; d'autres interprétations y voient plutôt une « clarification » morale ou cognitive des émotions<ref>Sur ces interprétations divergentes, voir Stephen Halliwell, ''Aristotle's Poetics'', Londres, Duckworth, 1986 ; Christof Rapp, « Katharsis der Emotionen », dans B. Seidensticker et M. Vöhler (éd.), ''Katharsiskonzeptionen vor Aristoteles'', Berlin, De Gruyter, 2007 ; Christof Rapp, « Aristoteles über das Wesen und die Wirkung der Tragödie », dans O. Höffe (éd.), ''Aristoteles. Poetik'', Berlin, Akademie Verlag, 2009. La question demeure ouverte dans la recherche contemporaine.</ref>.
==== La structure de la tragédie ====
Aristote analyse avec précision la structure de la tragédie. Celle-ci doit former un tout avec commencement, milieu et fin. L'intrigue (''mythos'') est l'âme de la tragédie, plus importante que les caractères<ref>Aristote, ''Poétique'', 11, 1452a15-32.</ref>. L'intrigue idéale comprend une péripétie (''peripeteia''), renversement de l'action en sens contraire, et une reconnaissance (''anagnôrisis''), passage de l'ignorance à la connaissance.
Le héros tragique ne doit être ni parfaitement vertueux ni complètement vicieux, mais occuper une position intermédiaire. Son malheur doit résulter non d'un vice mais d'une erreur (''hamartia'')<ref>Aristote, ''Poétique'', 13, 1453a7-10.</ref>. Ainsi Œdipe qui, sans le savoir, tue son père et épouse sa mère, inspire-t-il pitié plutôt que répulsion.
Comme le rappelle Pellegrin, la ''Poétique'' que nous connaissons est une œuvre incomplète : « nous ne possédons qu'une partie, celle qu'Aristote a consacrée à la tragédie, et en partie à l'épopée »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 109.</ref>. La partie consacrée à la comédie est perdue. Ces analyses ont profondément influencé la théorie littéraire occidentale, notamment à la Renaissance avec la redécouverte du traité, et nourrissent encore les débats en théorie littéraire et esthétique contemporaine.
== Réception et postérité ==
L'œuvre d'Aristote a connu une transmission complexe et une réception multiforme dans l'histoire de la pensée. Dans l'Antiquité tardive, les commentateurs néoplatoniciens (Porphyre, Alexandre d'Aphrodise, Simplicius, Philopon) étudient et expliquent ses œuvres, en cherchant souvent à les harmoniser avec le platonisme.
Au IXe siècle, les philosophes et savants du monde arabo-musulman traduisent Aristote en syriaque puis en arabe. Al-Fârâbî (872-950), Avicenne (980-1037) et Averroès (1126-1198), surnommé « le Commentateur », développent un aristotélisme islamique qui sera lui-même reçu en Occident latin. À partir du XIIe siècle, les œuvres d'Aristote, accompagnées des commentaires arabes, sont traduites en latin et transforment l'enseignement universitaire médiéval.
Albert le Grand (1200-1280) et Thomas d'Aquin (1225-1274) intègrent largement Aristote dans la théologie chrétienne, montrant la possibilité d'une articulation entre la philosophie péripatéticienne et la foi. Le thomisme deviendra une philosophie de référence dans l'Église catholique. Cette domination scolastique provoquera, à la Renaissance et à l'époque moderne, des remises en cause variées.
La science moderne, de Galilée à Newton, se construit en partie en réaction à la physique aristotélicienne, mais sans en constituer la simple négation : la recherche récente sur la philosophie naturelle de la Renaissance et la scolastique tardive décrit un tableau plus nuancé, fait à la fois de continuités, de relectures et d'oppositions<ref>Voir notamment, pour les débats sur la transition entre l'aristotélisme tardif et la science moderne, A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', op. cit. ; et l'entrée « Aristotle's Natural Philosophy » de la ''Stanford Encyclopedia of Philosophy''.</ref>.
Au {{XXe siècle}} et au début du {{XXIe siècle}}, plusieurs domaines de la pensée aristotélicienne ont fait l'objet d'un regain d'attention universitaire. En philosophie morale, le renouveau de l'éthique des vertus (Anscombe, MacIntyre, Nussbaum) a remis au premier plan les analyses de l'''Éthique à Nicomaque''<ref>Voir Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit. ; Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', op. cit.</ref>. En philosophie de l'esprit, certains philosophes ont vu dans l'hylémorphisme aristotélicien une alternative aux apories du dualisme cartésien et du réductionnisme matérialiste. En métaphysique, la conception de la substance et des catégories nourrit les débats sur l'ontologie réaliste. En philosophie de la biologie, la téléologie et la conception de l'organisme comme totalité fonctionnelle font l'objet de relectures<ref>Voir notamment Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', op. cit. ; James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
Au-delà de ces actualisations, l'œuvre d'Aristote demeure un objet d'étude central de l'histoire de la philosophie. Comme le rappelle Daniel Larose, « il existe ainsi plusieurs "Aristote" selon les époques » : la pluralité des lectures (logicienne, physicienne, métaphysicienne, théologienne, éthicienne) reflète à la fois la richesse interne de son œuvre et la diversité des projets philosophiques qui s'en sont nourris<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>. La recherche universitaire actuelle aborde le corpus aristotélicien comme un ensemble cohérent sans pour autant le juger systématique au sens classique du terme.
== Notes et références ==
{{Références|colonnes = 2}}
== Bibliographie ==
=== Éditions et traductions de référence ===
* Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014.
* Bekker, Immanuel (éd.), ''Aristotelis Opera'', Berlin, Reimer, 1831-1870.
* Jonathan Barnes (éd.), ''The Complete Works of Aristotle. The Revised Oxford Translation'', Princeton, Princeton University Press, 1984.
* Aristote, ''Catégories'', éd. et trad. R. Bodéüs, Paris, Les Belles Lettres, 2001.
* Aristote, ''Topiques I-IV'', éd. et trad. J. Brunschwig, Paris, Les Belles Lettres, 1967 et 2007.
* Aristote, ''Poétique'', éd. et trad. J. Hardy, Paris, Les Belles Lettres.
* Aristote, ''De l'Âme'', éd. et trad. A. Jannone et E. Barbotin, Paris, Les Belles Lettres.
* Aristote, ''Politique'', éd. et trad. J. Aubonnet, Paris, Les Belles Lettres, 1960 et suiv.
=== Synthèses générales ===
* Pierre Aubenque, ''Le problème de l'être chez Aristote'', Paris, PUF, 1962.
* Jonathan Barnes (éd.), ''The Cambridge Companion to Aristotle'', Cambridge, Cambridge University Press, 1995.
* Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923).
* Daniel Larose, ''Aristote de A à Z'', Paris, PUF, « Que sais-je ? », 2021.
* Pierre Pellegrin, ''Dictionnaire Aristote'', Paris, Ellipses, 2007.
* Pierre Pellegrin, ''Aristote'', Paris, Bordas, 1990.
* David Ross, ''Aristotle'', London, Methuen, 1923.
=== Études spécialisées par domaine ===
* Logique et épistémologie : Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', Paris, Vrin, 2009 ; Jan Lukasiewicz, ''La syllogistique d'Aristote'', trad. fr., Paris, Vrin ; J. Brunschwig, ''Aristote: Topiques I-IV'', Paris, Les Belles Lettres, 1967 et 2007 ; L.A. Dorion, ''Les Réfutations Sophistiques d'Aristote'', Paris, Vrin, 1995.
* Métaphysique : Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', Londres-New York, Routledge, 2004 ; Annick Jaulin, ''Aristote. La métaphysique'', Paris, PUF, 1999 ; Maddalena Bonelli (dir.), ''Physique et métaphysique chez Aristote'', Paris, Vrin ; Michel Narcy et Alonso Tordesillas (dir.), ''La « Métaphysique » d'Aristote. Perspectives contemporaines'', Paris, Vrin ; Richard Bodéüs, ''Aristote et la théologie des vivants immortels'', Montréal-Paris, Bellarmin-Les Belles Lettres, 1992.
* Philosophie de la nature et biologie : Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021 ; James G. Lennox, ''Aristotle's Philosophy of Biology: Studies in the Origins of Life Science'', Cambridge, Cambridge University Press, 2001 ; Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012 ; Allan Gotthelf et James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987 ; A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', Leiden, Brill, 2009.
* Éthique et politique : Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', Cambridge, Cambridge University Press, 2014 ; Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', Londres, Routledge, 2001 ; Marguerite Deslauriers et Pierre Destrée (éd.), ''The Cambridge Companion to Aristotle's Politics'', Cambridge, Cambridge University Press, 2013 ; Pierre-Marie Morel, ''Aristote. Une philosophie de l'activité'', Paris, Flammarion, 2003.
* Synthèses de référence en langue allemande et anglaise : Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', Oxford, Oxford University Press, 2012 ; Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch. Leben – Werk – Wirkung'', Stuttgart, Metzler, 2011.
=== Ressources en ligne ===
* ''Stanford Encyclopedia of Philosophy'', entrées : « Aristotle » ; « Aristotle's Categories » ; « Aristotle's Logic » ; « Aristotle's Metaphysics » ; « Aristotle's Ethics » ; « Aristotle's Political Philosophy » ; « Aristotle's Natural Philosophy » ; « Aristotle's Biology » ; « Aristotle's Aesthetics ». [https://plato.stanford.edu/]
* ''Internet Encyclopedia of Philosophy'', entrée « Aristotle ». [https://iep.utm.edu/aristotle/]
{{Autocat}}
[[Catégorie:Philosophe]]
{{DEFAULTSORT:Aristote}}
7jcretnuojp6evh7zjgn0tbi1otspzv
765112
765039
2026-04-26T08:21:17Z
PandaMystique
119061
/* La logique : l'Organon */
765112
wikitext
text/x-wiki
{{DicoPhilo|Aristote}}
Aristote (en grec ancien Ἀριστοτέλης, ''Aristotélēs'', 384-322 av. J.-C.) est un philosophe grec dont l'œuvre conservée couvre la logique, la philosophie de la nature, la biologie, la métaphysique, l'éthique, la politique, la rhétorique et la poétique. Né à Stagire en Chalcidique, il fut élève de Platon à l'Académie d'Athènes pendant une vingtaine d'années, puis précepteur d'Alexandre de Macédoine, avant de fonder à Athènes sa propre école, le Lycée. La transmission de ses écrits, complexe et partiellement lacunaire, a fortement conditionné l'ordre dans lequel ils nous sont parvenus ainsi que les modalités de leur interprétation : les dialogues exotériques publiés de son vivant ne subsistent qu'à l'état de fragments, tandis que les traités acroamatiques que nous lisons aujourd'hui ont été édités, organisés et titrés au Ier siècle av. J.-C. par Andronicos de Rhodes<ref>Sur l'histoire de la transmission, voir Pierre Pellegrin, ''Dictionnaire Aristote'', Paris, Ellipses, 2007, p. 5-7 ; Annick Jaulin, ''Aristote. La métaphysique'', Paris, PUF, 1999, Introduction.</ref>.
L'œuvre conservée a exercé une influence durable sur la philosophie ancienne tardive, sur les traditions arabe et latine médiévales, ainsi que sur plusieurs renaissances modernes de l'aristotélisme. Sa réception se fait selon des angles variables : les commentateurs néoplatoniciens en font une propédeutique au platonisme, les théologiens médiévaux y voient « le philosophe » par excellence (''Philosophus''), tandis que la science moderne se construit en partie en réaction à la physique péripatéticienne, sans pour autant rompre toujours avec elle de manière unilatérale<ref>Sur la pluralité des « Aristote » selon les époques, voir Daniel Larose, ''Aristote de A à Z'', Paris, PUF, « Que sais-je ? », 2021, Introduction.</ref>. Au {{XXe siècle}}, le projet « génétique » de Werner Jaeger – qui distinguait trois périodes (platonicienne, critique, empirique) dans la pensée du Stagirite – a été largement abandonné par la recherche universitaire, qui aborde aujourd'hui le corpus comme un ensemble cohérent sans être pour autant systématique<ref>Daniel Larose, ''Aristote de A à Z'', op. cit. ; voir aussi Pellegrin, ''Dictionnaire Aristote'', p. 6-8.</ref>.
Le présent article expose successivement la vie et le contexte historique d'Aristote, la constitution et la transmission de son œuvre, son rapport à Platon, puis ses doctrines en logique (l{{'}}''Organon''), philosophie de la nature, biologie, métaphysique et philosophie pratique (éthique, politique, rhétorique et poétique). Une dernière section traite de la réception et de la postérité de la pensée aristotélicienne.
== Vie et contexte historique ==
=== Origines familiales et contexte macédonien ===
Aristote naquit en 384 av. J.-C. à Stagire<ref>Stagire, l'actuelle Stavro, était une colonie grecque de la Chalcidique de Thrace, située sur la côte septentrionale de la mer Égée, à proximité de la Macédoine. Voir Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923), p. 103-104.</ref>, petite cité de la Chalcidique en Macédoine, d'où son surnom de Stagirite<ref>Ce patronyme sera employé tout au long de l'Antiquité pour le désigner. Cf. Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', Göteborg, Almqvist & Wiksell, 1957, p. 253-257.</ref>. Son père, Nicomaque, était médecin et appartenait à la corporation des Asclépiadés, dont les membres prétendaient descendre du dieu de la médecine, Asclépios<ref>Les Asclépiadés formaient une famille sacerdotale de médecins héritiers d'une tradition hippocratique. Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 1, trad. sous la dir. de M.-O. Goulet-Cazé, Paris, Le Livre de Poche, 1999, p. 573.</ref>. Nicomaque exerçait la fonction de médecin personnel et ami (''philos'') du roi Amyntas III de Macédoine<ref>Cette position à la cour macédonienne conférait à la famille d'Aristote un statut privilégié et des relations avec la maison royale. Voir Jean Brun, ''Aristote et le Lycée'', Paris, PUF, « Que sais-je ? », 1961, p. 7-8.</ref><ref>Diogène Laërce, ''Vies'', V, 1, op. cit., p. 573.</ref>.
Sa mère, Phæstias (ou Phaestis), originaire de Chalcis en Eubée, était sage-femme<ref>Certaines sources antiques indiquent qu'elle descendait d'une famille chalcidienne de notables. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 259.</ref>. La famille d'Aristote s'inscrivait ainsi dans un milieu cultivé, marqué à la fois par la pratique médicale rationnelle et par des ascendances ioniennes<ref>Selon Werner Jaeger, ces origines ioniennes pourraient avoir favorisé son goût pour l'investigation scientifique de la nature (''physis''), caractéristique des premiers Physiciens d'Ionie. Voir Werner Jaeger, ''Aristote'', op. cit., p. 105-106. Cette thèse, défendue par Jaeger dans le cadre de son interprétation génétique de la pensée d'Aristote, est aujourd'hui discutée par les historiens.</ref><ref>Ernest Barker, ''The Politics of Aristotle'', Oxford, Clarendon Press, 1946, Introduction, p. XI.</ref>.
Aristote devint orphelin à un âge précoce, perdant son père alors qu'il était encore enfant<ref>Sa mère mourut également jeune, laissant Aristote orphelin de ses deux parents avant ses dix-sept ans. Voir Werner Jaeger, ''Aristote'', op. cit., p. 104.</ref>. Il fut dès lors élevé par Proxène d'Atarnée, un ami de sa famille, originaire d'Atarnée en Mysie<ref>Atarnée était une cité située en Asie Mineure, en Troade. Diogène Laërce, ''Vies'', V, 3, op. cit., p. 574.</ref>. En reconnaissance, Aristote adoptera plus tard Nicanor, le fils de Proxène, et lui destinera sa propre fille Pythias par son testament<ref>Le testament d'Aristote, conservé par Diogène Laërce (V, 11-16), témoigne de ces liens familiaux durables. Voir l'édition dans Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014, p. 2597-2600.</ref><ref>Ces nouvelles attaches familiales constitueront les premiers rapports qu'Aristote entretiendra avec la région d'Atarnée, où il rencontrera plus tard Hermias, le futur tyran du lieu. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>.
=== Formation à l'Académie de Platon (367-347 av. J.-C.) ===
À l'âge de dix-sept ans, en 367-366 av. J.-C., Aristote se rend à Athènes, qui demeure alors, malgré son déclin politique et économique après les Guerres du Péloponnèse, l'un des principaux foyers intellectuels du monde grec<ref>Sous l'archontat de Polyzélos (selon Denys d'Halicarnasse) ou de Nausigénès (selon d'autres sources). Apollodore d'Athènes, cité par Diogène Laërce, V, 9, op. cit., p. 577.</ref>. Il entre à l'Académie de Platon, école philosophique fondée vers 387 av. J.-C.<ref>L'Académie tirait son nom du gymnase d'Académos, situé dans un faubourg d'Athènes. Voir Harold Cherniss, ''The Riddle of the Early Academy'', Berkeley, University of California Press, 1945, p. 1-72.</ref>. Cette institution dispensait un enseignement encyclopédique en mathématiques, astronomie, musique, dialectique, politique et philosophie<ref>Léon Robin, ''Aristote'', Paris, PUF, 1944, p. 3.</ref>.
Aristote y demeura vingt ans, jusqu'à la mort de Platon en 348-347 av. J.-C.<ref>Apollodore d'Athènes, cité par Diogène Laërce (V, 9-10), fournit cette chronologie. Voir Diogène Laërce, ''Vies'', op. cit., p. 577-578.</ref>. La tradition antique rapporte que Platon l'aurait surnommé le Liseur (''anagnôstês'') ou l'Intelligence de l'école (''ho nous tês scholês'')<ref>Ces surnoms, qui pourraient attester la reconnaissance par le Maître des dons de son élève, sont rapportés par les sources biographiques tardives. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 325-327.</ref><ref>''Vita Marciana'', dans Valentin Rose, ''Aristoteles Pseudepigraphus'', Leipzig, Teubner, 1863, p. 428 ; Jean Philopon, dans Proclus, ''De aeternitate mundi'', VI, 27, éd. Hugo Rabe, Leipzig, Teubner, 1899, p. 145.</ref>.
La tradition d'une rupture violente entre Aristote et Platon, attestée par certaines sources tardives, est aujourd'hui considérée par la critique moderne comme issue probablement des polémiques ultérieures entre épicuriens et péripatéticiens<ref>Les récits de Diogène Laërce évoquant une rupture violente sont jugés peu fiables par la plupart des biographes modernes. Voir Werner Jaeger, ''Aristote'', op. cit., p. 113-128.</ref>. Plusieurs éléments suggèrent au contraire des liens durables entre les deux philosophes : Aristote composa une élégie en l'honneur de son ami Eudème de Chypre, où il évoque Platon comme un maître<ref>Fragment 623 (Rose), conservé par Olympiodore. Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886, p. 42-43.</ref>. Dans l{{'}}''Éthique à Nicomaque'', Aristote écrit : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels, surtout quand on est philosophe : vérité et amitié nous sont chères l'une et l'autre, mais c'est pour nous un devoir sacré d'accorder la préférence à la vérité »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096 a 12-17, trad. J. Tricot, Paris, Vrin, 1959, p. 44.</ref><ref>Cette phrase a été condensée en latin par l'adage ''Amicus Plato, sed magis amica veritas'' : « ami de Platon, mais plus encore ami de la vérité ». Voir Ammonius, ''In Categorias'', éd. Busse, Berlin, Reimer, 1895, p. 79.</ref>.
Aristote participa à l'enseignement de l'Académie. On lui attribue notamment la charge du cours de rhétorique, qu'il aurait inauguré, selon certains témoignages, par cette formule : « Il serait honteux de se taire et de laisser parler Isocrate »<ref>Cette boutade visait Isocrate, le rival de Platon en matière d'enseignement rhétorique. Voir Werner Jaeger, ''Aristote'', op. cit., p. 180-182.</ref><ref>Philodème, ''Volumina rhetorica'', II, 36, 3-5, éd. Siegfried Sudhaus, Leipzig, Teubner, 1892-1896, vol. II, p. 50 ; Cicéron, ''De Oratore'', III, 35, 141 ; Quintilien, ''Institutio oratoria'', III, 1, 14.</ref>. Cette période fut également celle de ses premières publications, sous forme de dialogues à la manière platonicienne, dont la plupart sont aujourd'hui perdus<ref>Cicéron loua plus tard la qualité littéraire de ces dialogues, parlant d'un ''flumen orationis aureum'' : « un fleuve d'or de paroles ». Cicéron, ''Academica priora'', II, 38, 119.</ref>.
=== Voyages et maturation (348-335 av. J.-C.) ===
À la mort de Platon en 347, c'est le neveu du Maître, Speusippe, qui prend la direction de l'Académie. Aristote quitte alors Athènes — selon certaines hypothèses parce qu'il aurait espéré la succession, selon d'autres en raison du climat politique antimacédonien<ref>Voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 5.</ref>. Il se rend à Atarnée et Assos, en Troade (Asie Mineure), auprès de son ami Hermias, ancien condisciple de l'Académie devenu tyran d'Atarnée<ref>Hermias avait été esclave, puis affranchi, avant de devenir maître d'Atarnée et d'Assos. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>. Aristote y séjourne trois ans (347-345), accompagné probablement de Xénocrate<ref>Strabon, ''Géographie'', XIII, 1, 57, trad. F. Lasserre, Paris, Les Belles Lettres, 1981, p. 84-85.</ref>. Il y poursuit ses recherches philosophiques et biologiques<ref>C'est durant ce séjour qu'Aristote aurait entrepris des observations sur la faune marine de la côte d'Asie Mineure, dont témoignent l{{'}}''Histoire des Animaux'' et d'autres traités zoologiques. Voir David M. Balme, « The Place of Biology in Aristotle's Philosophy », dans Allan Gotthelf & James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987, p. 9-20.</ref>.
Hermias, pris dans les luttes entre la Macédoine et la Perse, fut capturé en 341 av. J.-C. par trahison sur ordre d'Artaxerxès III, le roi de Perse, torturé et exécuté<ref>Selon les sources antiques, Hermias refusa, malgré les tortures, de trahir ses liens avec Philippe II de Macédoine. Voir Werner Jaeger, ''Aristote'', op. cit., p. 138-142.</ref><ref>Diodore de Sicile, ''Bibliothèque historique'', XVI, 52, trad. P. Goukowsky, Paris, Les Belles Lettres, 1976, p. 164-165.</ref>. Aristote composa un Hymne à la Vertu en son honneur et fit ériger une statue à Delphes portant une épigramme à sa mémoire<ref>Fragments 624 et 625 (Rose), conservés par Diogène Laërce (V, 7-8) et Athénée (''Deipnosophistes'', XV, 696 a-c). Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', op. cit., p. 43-44.</ref>. Il épousa également Pythias, nièce ou fille adoptive d'Hermias, dont il aura une fille du même nom<ref>Dans son testament, Aristote prescrit que ses cendres soient mêlées à celles de Pythias. Diogène Laërce, ''Vies'', V, 16, op. cit., p. 582.</ref>.
Après la mort d'Hermias, Aristote quitte Assos pour Mytilène, sur l'île de Lesbos, en 345-344 av. J.-C. Il y poursuit pendant deux à trois ans ses observations biologiques et zoologiques, notamment sur les lagunes de Pyrrha<ref>De nombreuses observations précises de l{{'}}''Histoire des Animaux'' se rapportent à la faune de Lesbos. Voir Pierre Louis, « Introduction », dans Aristote, ''Histoire des Animaux'', tome I, Paris, Les Belles Lettres, 1964, p. XIV-XVIII.</ref>.
=== Précepteur d'Alexandre le Grand (343-336 av. J.-C.) ===
En 343-342 av. J.-C., Philippe II de Macédoine, qui avait connu Aristote dans sa jeunesse grâce à Nicomaque, appelle le philosophe à la cour de Pella pour devenir le précepteur de son fils, le jeune prince Alexandre, alors âgé de treize ans<ref>Voir Werner Jaeger, ''Aristote'', op. cit., p. 145-148.</ref><ref>Plutarque, ''Vie d'Alexandre'', 7-8, trad. R. Flacelière & É. Chambry, Paris, Les Belles Lettres, 1975, p. 33-34.</ref>. Aristote enseigne au prince pendant deux ou trois ans, probablement à Miéza<ref>Miéza était située à l'ouest de Pella, dans un environnement champêtre propice aux études. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 15-16.</ref>.
L'enseignement donné à Alexandre portait essentiellement sur la politique, l'éthique, la poésie et les lettres grecques<ref>Selon Plutarque, Aristote aurait fait connaître à Alexandre une édition annotée de l{{'}}''Iliade''. Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref><ref>Plutarque rapporte également un mot d'Alexandre selon lequel il aimait Aristote autant que son père : « si je dois la vie à l'un, je dois à l'autre de savoir bien vivre ». Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref>. Aristote composa peut-être à cette époque un traité ''Sur la Royauté'' (''Peri basileias''), aujourd'hui perdu<ref>Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', Louvain, Éditions universitaires, 1951, p. 157-158.</ref>.
Les relations entre le maître et l'élève demeurent difficiles à reconstituer avec certitude. Alors qu'Aristote, dans ses ''Politiques'', prône une distinction entre Grecs et Barbares<ref>Aristote considère, dans certains passages, que les Barbares sont naturellement faits pour être gouvernés par les Grecs. Aristote, ''Politique'', I, 2, 1252 b 5-9, trad. J. Aubonnet, Paris, Les Belles Lettres, 1960, p. 10-11.</ref>, Alexandre adopta une politique d'intégration des peuples conquis et de fusion entre Grecs et Orientaux<ref>Sur ces divergences, voir Werner Jaeger, ''Aristote'', op. cit., p. 148-152.</ref>. En 335 av. J.-C., lors du départ d'Alexandre pour la conquête de l'Asie, Aristote propose son neveu Callisthène pour l'accompagner comme conseiller et historiographe<ref>Voir Felix Jacoby, ''Die Fragmente der griechischen Historiker'', Berlin, Weidmann, 1923-1958, 124 F 1.</ref>. Callisthène, refusant d'adopter la proskynèse exigée par Alexandre, encourut sa disgrâce et fut exécuté vers 327 av. J.-C.<ref>Diogène Laërce (V, 5) et Plutarque (''Vie d'Alexandre'', 55) rapportent cette fin. Voir Diogène Laërce, ''Vies'', op. cit., p. 575-576 ; Plutarque, ''Vie d'Alexandre'', op. cit., p. 81-83.</ref>.
=== Fondation du Lycée et enseignement à Athènes (335-323 av. J.-C.) ===
En 335-334 av. J.-C., après la défaite athénienne face à la Macédoine à Chéronée (338 av. J.-C.), Aristote retourne à Athènes. Il y fonde sa propre école, le Lycée (''Lykeion''), nommé d'après le temple d'Apollon Lycien situé à proximité<ref>Le Lycée était un gymnase entouré de jardins et de promenoirs couverts (''peripatoi''), d'où le nom d'« école péripatéticienne » donné aux disciples d'Aristote. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 21-24.</ref><ref>Le site archéologique du Lycée fut découvert fortuitement en 1996 lors de travaux au centre d'Athènes. Voir Effi Lygouri, « The Lyceum of Aristotle in Athens », dans ''Acta Musei Nationalis Pragae. Series A – Historia'', 60, 1-2, 2006, p. 47-52.</ref>.
Aristote y enseigne pendant douze ou treize ans, de 335 à 323 av. J.-C., période durant laquelle il rédige la plupart des traités systématiques (''pragmateiai'') qui nous sont parvenus<ref>Ces traités, dits « acroamatiques » ou « ésotériques », étaient destinés à l'enseignement interne, par opposition aux dialogues « exotériques » écrits pour un large public. Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', op. cit., p. 3-85.</ref>. Selon Aulu-Gelle, son enseignement comportait deux modalités : le matin, des leçons approfondies sur la philosophie, la physique et la métaphysique, réservées aux disciples avancés ; l'après-midi, des cours plus accessibles de rhétorique et de dialectique, ouverts à un public plus large<ref>Aulu-Gelle, ''Nuits attiques'', XX, 5, trad. R. Marache, Paris, Les Belles Lettres, 1978, tome IV, p. 185-186.</ref>.
Aristote professait, selon la tradition, en se promenant (''peripatein'') avec ses disciples dans les allées du gymnase, d'où le nom d'école péripatéticienne donné à son école<ref>Diogène Laërce, ''Vies'', V, 2, op. cit., p. 574.</ref>. Il constitua au Lycée une bibliothèque et des collections d'histoire naturelle (animaux, plantes, minéraux, cartes géographiques)<ref>Selon Pline l'Ancien, Alexandre aurait aidé son ancien maître en lui envoyant d'Asie des spécimens zoologiques et botaniques. Pline l'Ancien, ''Histoire naturelle'', VIII, 17, trad. A. Ernout, Paris, Les Belles Lettres, 1952, p. 23. Cette tradition est cependant tardive et son authenticité est discutée.</ref>. Il entreprit également avec ses collaborateurs la rédaction des 158 Constitutions (''Politeiai'') des cités grecques et barbares, dont seule la ''Constitution d'Athènes'' nous est parvenue<ref>Cette œuvre fut probablement un travail collectif sous la direction d'Aristote. Voir Mortimer Chambers, « Aristotle's Forms of Democracy », dans ''Transactions and Proceedings of the American Philological Association'', 92, 1961, p. 20-36.</ref>.
=== Exil et mort (323-322 av. J.-C.) ===
À la mort d'Alexandre le Grand, survenue à Babylone en juin 323 av. J.-C., une réaction antimacédonienne éclate à Athènes<ref>Voir Werner Jaeger, ''Aristote'', op. cit., p. 387-390.</ref>. Aristote, en tant que métèque proche de la Macédoine, se trouve menacé<ref>En tant que métèque, Aristote n'avait jamais eu le droit de cité athénien. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 32-33.</ref>. Un certain Démophile, peut-être prêtre d'Éleusis, l'accuse d'impiété (''asebeia''), lui reprochant d'avoir composé l'Hymne à la Vertu en l'honneur d'Hermias, honneur normalement réservé aux dieux<ref>Cette accusation rappelle évidemment le procès de Socrate en 399 av. J.-C. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 346-350.</ref><ref>Diogène Laërce, ''Vies'', V, 5-6, op. cit., p. 575-576.</ref>.
Sans attendre le jugement, Aristote quitte Athènes et se réfugie à Chalcis, en Eubée, ville natale de sa mère<ref>Selon Aulu-Gelle, Aristote aurait déclaré vouloir « empêcher les Athéniens de commettre un second crime contre la philosophie », allusion au procès de Socrate. Aulu-Gelle, ''Nuits attiques'', III, 3, 10, op. cit., tome I, p. 151.</ref>. Il confie la direction du Lycée à Théophraste d'Érèse<ref>Théophraste dirigera le Lycée pendant trente-cinq ans, jusqu'en 288-287 av. J.-C. Voir Diogène Laërce, ''Vies'', V, 36-57, op. cit., p. 590-601.</ref>.
Aristote meurt à Chalcis en 322 av. J.-C., à l'âge de soixante-deux ans, probablement des suites d'une maladie d'estomac<ref>La légende d'un suicide par absorption de ciguë, rapportée par certaines sources tardives, n'est pas retenue par les historiens modernes. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 350-355.</ref><ref>Son testament, conservé par Diogène Laërce (V, 11-16), prescrit notamment que ses cendres soient mêlées à celles de sa première épouse Pythias. Voir Diogène Laërce, ''Vies'', op. cit., p. 579-582.</ref>. Ses cendres furent inhumées à Stagire<ref>Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 355-358.</ref>.
Aristote laissait deux enfants : Pythias, née de son premier mariage, destinée à épouser Nicanor, le fils adoptif du philosophe, et Nicomaque, né de son second mariage avec Herpyllis d'Assos<ref>C'est à ce dernier que fut dédiée l'''Éthique à Nicomaque'' — sans qu'il soit certain que ce titre traduise une dédicace personnelle plutôt qu'un choix éditorial postérieur. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 35-36.</ref><ref>Dans son testament, Aristote témoigne d'une grande reconnaissance envers Herpyllis. Diogène Laërce, ''Vies'', V, 12-13, op. cit., p. 580.</ref>.
== L'œuvre aristotélicienne : constitution et transmission ==
La constitution et la transmission de l'œuvre d'Aristote représentent l'un des dossiers les plus complexes de l'histoire de la philosophie antique. L'accès à la pensée du Stagirite est tributaire d'un processus historique long, marqué par des péripéties qui ont conditionné la forme sous laquelle nous lisons aujourd'hui ses écrits<ref>Pour une synthèse récente, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 5-7 ; Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>.
=== La double nature de l'œuvre aristotélicienne ===
L'œuvre d'Aristote se composait à l'origine de deux types d'écrits distincts. D'une part, les écrits exotériques (ἐξωτερικοὶ λόγοι), destinés à un public extérieur à l'école et composés sous forme de dialogues à la manière platonicienne entre 360 et 345 av. J.-C.<ref>Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 22-27.</ref>. Ces dialogues de jeunesse, dont Cicéron louait les qualités littéraires en qualifiant le style d'Aristote de « fleuve d'or » (''flumen aureum'')<ref>Cicéron, ''Academica'', II, 38, 119.</ref>, comprenaient notamment le ''Gryllos ou De la rhétorique'', l'''Eudème ou De l'âme'' sur l'immortalité de l'âme, le ''Protreptique'' et le traité ''Sur la philosophie''<ref>Fragments rassemblés dans V. Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886.</ref>. Ces œuvres ne nous sont parvenues que sous forme de fragments.
D'autre part, les écrits acroamatiques ou ésotériques (ἀκροαματικοί, ἐσωτερικοί), réservés aux disciples du Lycée et destinés à un usage interne à l'école<ref>Sur cette distinction, voir Aulu-Gelle, ''Nuits attiques'', XX, 5 ; Plutarque, ''Vie d'Alexandre'', 7.</ref>. Ces textes constituent l'essentiel du corpus aristotélicien tel que nous le connaissons aujourd'hui. Ils prennent vraisemblablement la forme de notes de cours, de résumés ou de mémoires de recherche élaborés par Aristote et ses collaborateurs. Selon Pierre Pellegrin, on pourrait considérer en termes modernes que « le texte aristotélicien que nous lisons aujourd'hui est plutôt le compte-rendu d'un séminaire donné par Aristote, qu'un ouvrage rédigé en bonne et due forme »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>.
=== Le sort de la bibliothèque d'Aristote ===
L'histoire de la transmission est intimement liée au destin de la bibliothèque personnelle d'Aristote. À sa mort en 322 av. J.-C., Aristote légua sa bibliothèque à son successeur à la tête du Lycée, Théophraste d'Érèse<ref>Diogène Laërce, ''Vies'', V, 51-52.</ref>. Selon le récit de Strabon, à la mort de Théophraste vers 288 av. J.-C., la bibliothèque fut léguée à Nélée de Scepsis, fils de Coriscos et disciple d'Aristote et de Théophraste<ref>Strabon, ''Géographie'', XIII, 1, 54 (608-609 C) ; voir aussi Plutarque, ''Sylla'', 26, 1-3.</ref>.
Nélée, en quittant Athènes pour retourner à Scepsis en Troade, emporta avec lui les manuscrits autographes d'Aristote et de Théophraste. Ses descendants, peu instruits selon Strabon, auraient caché ces livres dans une cave pour éviter qu'ils ne soient confisqués par les rois Attalides de Pergame<ref>Strabon, ''Géographie'', XIII, 1, 54.</ref>. Les ouvrages auraient ainsi été enfouis pendant près de deux siècles. Ce récit de Strabon, longtemps accepté tel quel, est aujourd'hui partiellement contesté : la recherche moderne souligne qu'il ne faut pas conclure de la dispersion d'une partie des manuscrits autographes que les œuvres d'Aristote auraient été totalement inaccessibles avant Andronicos<ref>Voir P. Moraux, ''Der Aristotelismus bei den Griechen'', vol. I, Berlin-New York, De Gruyter, 1973, p. 3-31. La critique moderne souligne que les philosophes hellénistiques (stoïciens, épicuriens) connaissaient et discutaient certaines thèses aristotéliciennes, ce qui suppose un accès au moins partiel aux écrits du Stagirite.</ref>.
Ce n'est qu'au début du Ier siècle av. J.-C. que ces textes furent redécouverts et achetés par Apellicon de Téos, un riche bibliophile athénien<ref>Athénée, ''Deipnosophistes'', V, 214d = Posidonios, FGrHist 87 F 36.</ref>. Apellicon entreprit de restaurer les manuscrits endommagés, mais aurait, selon Strabon, commis de nombreuses erreurs en comblant les lacunes<ref>Strabon, ''Géographie'', XIII, 1, 54.</ref>.
=== Le transfert à Rome et l'édition d'Andronicos ===
En 86 av. J.-C., lors de la prise d'Athènes, le général Sylla s'empara de la bibliothèque d'Apellicon et la fit transporter à Rome<ref>Plutarque, ''Sylla'', 26, 2 ; Strabon, ''Géographie'', XIII, 1, 54.</ref>. À Rome, ces manuscrits furent confiés au grammairien Tyrannion d'Amisos<ref>Strabon, ''Géographie'', XIII, 1, 54 ; Cicéron, ''Lettres à Atticus'', IV, 10, 1.</ref>.
C'est finalement Andronicos de Rhodes, onzième scholarque du Lycée et philosophe péripatéticien actif vers 60 av. J.-C., qui établit la première édition systématique des œuvres d'Aristote et de Théophraste<ref>Porphyre, ''Vie de Plotin'', 24 ; voir aussi David l'Arménien, ''Prolégomènes'', CAG XVIII, 2, p. 32-33.</ref>. Andronicos ne se contenta pas de publier les textes : il les organisa selon un ordre thématique probablement différent de celui voulu par Aristote, en regroupant les traités par affinité de contenu. La division traditionnelle du corpus en écrits logiques (réunis plus tard sous le titre d'Organon), physiques, biologiques, métaphysiques, éthiques et politiques en résulte<ref>Voir Simplicius, ''In Categorias'', CAG VIII, p. 4, 28-5, 4 ; Alexandre d'Aphrodise, ''In Metaphysica'', CAG I, p. 171, 5-8.</ref>. Comme le souligne Pellegrin, Andronicos « a uni des passages qui étaient originairement disjoints, gommé des contradictions, ménagé des transitions », et il a probablement « introduit dans le texte des matériaux issus de discussions et de critiques » faites en marge des cours du Lycée<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>.
C'est également à Andronicos que l'on doit le titre de Métaphysique (τὰ μετὰ τὰ φυσικά), qui signifie littéralement « ce qui vient après les [livres] physiques »<ref>Voir ''Métaphysique'', éd. W.D. Ross, Oxford, Clarendon Press, 1924, vol. I, p. XXXII-XLIII ; Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Aristote lui-même n'utilisait jamais ce terme, préférant parler de « philosophie première » (πρώτη φιλοσοφία) ou de « science théologique » (θεολογική)<ref>Aristote, ''Métaphysique'', E (VI), 1, 1026a19-23 ; K (XI), 7, 1064b1-3.</ref>.
=== Les conséquences pour notre accès au texte ===
Cette histoire éditoriale a eu des conséquences majeures pour notre connaissance de la pensée d'Aristote. La perte quasi totale des écrits exotériques nous prive d'un pan de son œuvre, celui qui était le mieux connu dans l'Antiquité<ref>Sur l'« autre » Aristote perdu, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>. L'état fragmentaire des manuscrits retrouvés et leur restauration introduisent des incertitudes textuelles. L'organisation systématique imposée par Andronicos, bien qu'elle ait permis la préservation et la diffusion de l'œuvre, ne correspond probablement pas à l'ordre de composition ni à l'organisation originelle voulue par Aristote.
La reconstruction d'une chronologie relative des œuvres pose des difficultés méthodologiques. Werner Jaeger, dans son ouvrage ''Aristoteles. Grundlegung einer Geschichte seiner Entwicklung'' (1923), a proposé de dater les textes selon leur plus ou moins grande proximité avec le platonisme<ref>Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', op. cit.</ref>. Cette « approche génétique » a été largement critiquée et n'est plus acceptée dans son ensemble : le « degré de platonicité » d'un texte est difficile à évaluer, et le corpus aristotélicien se prête mal aux examens stylométriques utilisés pour le corpus platonicien<ref>Pour une critique de l'approche génétique de Jaeger, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6-8 ; Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction. La recherche actuelle aborde l'œuvre comme un tout cohérent sans pour autant la juger systématique.</ref>.
Le texte d'Aristote tel que nous le connaissons est ainsi le produit d'une longue chaîne de transmission, qui passe par les commentateurs néoplatoniciens (Alexandre d'Aphrodise, Simplicius, Philopon), la tradition arabe médiévale (Al-Fârâbî, Avicenne, Averroès), puis la redécouverte occidentale à partir du XIIIe siècle<ref>Pour l'histoire de la transmission médiévale, voir F.E. Peters, ''Aristoteles Arabus'', Leiden, Brill, 1968 ; L. Minio-Paluello, ''Opuscula. The Latin Aristotle'', Amsterdam, Hakkert, 1972.</ref>.
== Aristote et Platon : continuité et rupture ==
La relation entre Aristote et Platon a fait l'objet d'interprétations divergentes dans l'histoire de la philosophie. Les commentateurs néoplatoniciens, de Porphyre à Simplicius, ont insisté sur l'harmonie fondamentale entre les deux philosophes<ref>Simplicius, ''In Categorias'', CAG VIII, éd. K. Kalbfleisch, Berlin, Reimer, 1907, p. 7, 23-32.</ref>. À l'inverse, une partie de la tradition occidentale, depuis la Renaissance, a mis l'accent sur leurs divergences. Coleridge résume cette opposition dans la formule : « Tout homme est né aristotélicien ou platonicien »<ref>Samuel Taylor Coleridge, ''Table Talk'', 2 juillet 1830, dans ''The Table Talk and Omniana of Samuel Taylor Coleridge'', Londres, Oxford University Press, 1917, p. 90.</ref>.
La recherche contemporaine privilégie une approche plus nuancée, qui examine simultanément les points de continuité et de rupture. Aristote s'oppose à Platon sur des questions ontologiques fondamentales, tout en demeurant tributaire de l'héritage académicien. Comme il l'écrit lui-même : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096a11-17, trad. J. Tricot, op. cit., p. 44.</ref>.
=== La critique aristotélicienne des Idées platoniciennes ===
==== Le rejet de la séparation (''chôrismos'') ====
L'un des points de rupture entre Aristote et Platon concerne le statut ontologique des Idées ou Formes (''eidos''). Pour Platon, les Idées constituent un monde intelligible séparé (''chôristos'') du monde sensible. Elles sont immuables, éternelles, et possèdent une existence autonome et transcendante. Les choses sensibles ne sont que des copies imparfaites qui participent (''methexis'') aux Idées ou les imitent (''mimêsis'')<ref>Platon, ''Phédon'', 74a-75d, 100c-102a ; ''République'', VI, 509d-511e, trad. É. Chambry, Paris, Les Belles Lettres, 1932-1934.</ref>. Dans le ''Phédon'', Platon affirme ainsi que « rien d'autre ne rend belle une chose que la présence ou la communion (on ne sait comment elle se fait) avec le Beau en soi »<ref>Platon, ''Phédon'', 100d, trad. M. Dixsaut, Paris, Flammarion, 1991, p. 315.</ref>.
Aristote refuse cette séparation des Idées. Dans la ''Métaphysique'', il consacre plusieurs chapitres à une critique systématique de la théorie platonicienne<ref>Aristote, ''Métaphysique'', A, 6, 987a29-988a17 ; A, 9, 990a34-993a10 ; M, 4-5, 1078b7-1080a11 ; N, 2, 1088b35-1090a2.</ref>. Ses objections portent sur trois points principaux<ref>Pour une analyse détaillée de ces critiques, voir Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', Londres-New York, Routledge, 2004, chap. 3-4.</ref>.
Premièrement, l'inutilité explicative des Idées séparées. Aristote soutient que les Idées ne peuvent rendre compte ni de l'existence ni du devenir des choses sensibles : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est prononcer des mots vides et faire des métaphores poétiques »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22, trad. J. Tricot, Paris, Vrin, 1953, t. I, p. 61.</ref>. Les Idées platoniciennes, étant immobiles et éternelles, ne peuvent expliquer le mouvement et le changement observés. Selon Aristote, Platon n'a pas identifié la cause efficiente (''archê tês kinêseôs'')<ref>Aristote, ''Métaphysique'', A, 9, 992a24-29.</ref>.
Deuxièmement, l'argument du « Troisième Homme ». Aristote reprend ici une objection déjà formulée dans le ''Parménide'' de Platon lui-même<ref>Platon, ''Parménide'', 132a-b.</ref>. Si l'on postule une Idée séparée de l'Homme pour expliquer ce que plusieurs hommes ont en commun, alors on doit également postuler une troisième Idée pour expliquer ce que l'Idée de l'Homme et les hommes particuliers ont en commun, et ainsi à l'infini<ref>Aristote, ''Métaphysique'', A, 9, 990b15-17 ; Z, 13, 1039a2-3 ; ''De la Sophistique'', 22, 178b36-179a10.</ref>.
Troisièmement, le dédoublement inutile du monde. Postuler un monde intelligible d'Idées séparées revient, selon Aristote, à « doubler les difficultés » sans les résoudre<ref>Aristote, ''Métaphysique'', A, 9, 990b1-4.</ref>. « Les Platoniciens font exister autant de substances séparées qu'il y a de choses naturelles, comme si quelqu'un, voulant compter des objets, estimait qu'il ne le pourrait pas quand ils sont en petit nombre, et croyait y parvenir en les multipliant »<ref>Aristote, ''Métaphysique'', A, 9, 990b4-8, trad. J. Tricot, op. cit., p. 60.</ref>.
==== L'hylémorphisme aristotélicien ====
À la théorie platonicienne de la participation, Aristote oppose la théorie hylémorphique. Selon cette conception, les êtres sensibles ne sont pas des copies imparfaites d'Idées transcendantes, mais des composés (''sunolon'') de matière (''hulê'') et de forme (''morphê'' ou ''eidos'')<ref>Aristote, ''Métaphysique'', Z, 3, 1029a1-7 ; H, 1-3, 1042a24-1043b23 ; ''Physique'', II, 1-2, 192b8-194a12.</ref>.
La forme aristotélicienne n'est pas séparée des choses sensibles : elle est immanente à la matière qu'elle informe. La forme du cheval n'existe pas dans un monde intelligible séparé, mais uniquement dans les chevaux individuels concrets. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence (''to ti ên einai'')<ref>Aristote, ''Métaphysique'', Z, 4-6, 1029b13-1031b14 ; Z, 7, 1032b1-2.</ref>. « Par forme, j'entends l'essence de chaque chose et sa substance première »<ref>Aristote, ''Métaphysique'', Z, 7, 1032b1-2, trad. J. Tricot, op. cit., t. I, p. 372.</ref>.
Cette conception hylémorphique permet de répondre à plusieurs problèmes posés par la théorie platonicienne. Elle explique le devenir : la génération d'une substance est le passage de la puissance (''dunamis'') à l'acte (''energeia''), l'actualisation d'une forme dans une matière. Elle sauvegarde l'individualité des substances premières, c'est-à-dire des individus concrets (''tode ti'')<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 13, 1038b23-1039a3.</ref>. Elle unifie enfin forme et finalité : la forme est à la fois cause formelle et cause finale, ce vers quoi tend le développement naturel de la chose<ref>Aristote, ''Physique'', II, 1, 193b12-13 ; II, 7, 198a24-27.</ref>.
=== La critique de la participation et de l'imitation ===
Platon utilise principalement deux concepts pour expliquer la relation entre les choses sensibles et les Idées : la participation (''methexis'') et l'imitation (''mimêsis''). Aristote critique ces notions, qu'il juge métaphoriques et non explicatives<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22 ; M, 5, 1079b24-26.</ref>.
La notion de participation pose des problèmes conceptuels que Platon lui-même a identifiés dans le ''Parménide''<ref>Platon, ''Parménide'', 130e-134e.</ref>. Si l'Idée tout entière est présente en chaque chose qui y participe, alors l'Idée se trouve séparée d'elle-même. Mais si c'est seulement une partie de l'Idée qui est présente en chaque chose, alors l'Idée se divise<ref>Platon, ''Parménide'', 131a-e.</ref>.
Selon Aristote, Platon n'a pas résolu ces difficultés : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est ne rien dire, car participer, qu'est-ce que c'est ? »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-21.</ref>. Pour Aristote, « ce que les Pythagoriciens appelaient "imitation", les Platoniciens l'ont appelé "participation", mais tous se bornent à changer le nom sans expliquer ce que peut bien être cette participation ou cette imitation des Idées »<ref>Aristote, ''Métaphysique'', A, 6, 987b10-13, trad. J. Tricot, op. cit., t. I, p. 49.</ref>.
Pour Aristote, la ressemblance entre les individus d'une même espèce s'explique par la possession d'une même forme immanente, transmise dans la génération naturelle : « L'homme engendre l'homme » (''anthrôpos anthrôpon genna'')<ref>Aristote, ''Métaphysique'', Z, 7, 1032a25 ; Z, 8, 1033b32-1034a2 ; Λ, 3, 1070a8.</ref>. Trois facteurs interviennent dans la génération : la matière (fournie par la femelle, selon Aristote), la forme (transmise par le mâle) et la privation (l'absence initiale de la forme dans la matière)<ref>Aristote, ''Physique'', I, 7, 190b10-191a7 ; ''De la Génération des Animaux'', I, 20-21, 729a9-730a32. Cette doctrine de la « contribution » respective des sexes reflète des préjugés de l'époque qu'il importe de signaler ; voir, pour une mise au point critique, Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021.</ref>.
=== Substance, essence et ''ousia'' ===
Le terme grec ''ousia'', traduit en latin par ''substantia'' ou ''essentia'', possède des significations différentes chez Platon et Aristote. Comme le note Pellegrin, ''ousia'' est en fait « difficile à traduire, car le terme représente, chez Aristote, trois choses différentes : la forme, la matière, et le composé des deux »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Ousia / Substance », p. 175-176, citant ''Métaphysique'', Z, 3, 1029a27-33.</ref>.
Chez Platon, l{{'}}''ousia'' désigne principalement l'Idée, la réalité véritable, immuable et éternelle, par opposition aux choses sensibles<ref>Platon, ''Phédon'', 78c-d ; ''République'', V, 477a-478e ; VI, 484b-486d.</ref>. Chez Aristote, l{{'}}''ousia'' désigne avant tout, dans les ''Catégories'', la substance première : l'individu concret qui existe par lui-même<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 3, 1028b33-1029a7.</ref>. Aristote distingue alors la substance première de la substance seconde, qui désigne l'espèce ou le genre auquel appartient l'individu<ref>Aristote, ''Catégories'', 5, 2a14-17.</ref>.
Le rapport entre cette doctrine des ''Catégories'' et la théorie de la substance développée dans les livres centraux de la ''Métaphysique'' (Z, H, Θ) est l'un des points les plus discutés de l'aristotélisme contemporain. Annick Jaulin souligne que la « doctrine » aristotélicienne de la substance n'est pas une donnée stabilisée mais l'objet d'une recherche : Aristote « invente une théorie de la forme qui intègre le mouvement »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Dans la ''Métaphysique'', la forme (''eidos'') apparaît comme le meilleur candidat au titre de substance, mais cette identification soulève à son tour la question de l'unité du composé hylémorphique<ref>Pour un panorama des débats, voir Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', Stuttgart, Metzler, 2011, chap. IV.18 ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 5-7.</ref>. Comme le résume Pellegrin, « ''ousia'' signifie donc la chose (la substance) et ses causes internes, la matière et la forme ; la forme est ce qui correspond à l'essence »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 176.</ref>.
=== Éléments de continuité entre Platon et Aristote ===
Au-delà des divergences ontologiques, Platon et Aristote partagent plusieurs convictions communes. La première est la primauté de la forme sur la matière dans l'ordre de l'intelligibilité, de la réalité et de la perfection. Pour Platon comme pour Aristote, la matière pure, prise en elle-même, est indéterminée<ref>Platon, ''Timée'', 49a-52d ; Aristote, ''Métaphysique'', Z, 10, 1036a8-9.</ref>.
La deuxième est la finalité dans la nature. Platon présente le cosmos comme l'œuvre d'un Démiurge qui organise la matière en regardant vers les Idées<ref>Platon, ''Timée'', 28a-30c.</ref>. Aristote intériorise et naturalise cette téléologie : la nature elle-même agit en vue d'une fin (''hê phusis heneka tou poiei''), sans qu'il soit besoin de postuler un Démiurge extérieur ou des Idées transcendantes<ref>Aristote, ''Physique'', II, 8, 198b10-199a8 ; ''Des Parties des Animaux'', I, 1, 639b14-640a9. Pour une discussion détaillée de la téléologie aristotélicienne, voir Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012 ; James G. Lennox, ''Aristotle's Philosophy of Biology'', Cambridge, Cambridge University Press, 2001.</ref>.
La troisième est la connaissance par les causes : pour les deux philosophes, la véritable connaissance scientifique consiste à connaître les causes (''aitiai'') des choses<ref>Platon, ''Phédon'', 96a-99d ; Aristote, ''Physique'', II, 3, 194b16-195b30 ; ''Seconds Analytiques'', I, 13, 78a22-b4.</ref>. Aristote reproche cependant à Platon d'avoir négligé la cause efficiente et la cause finale<ref>Aristote, ''Métaphysique'', A, 6, 988a8-17 ; A, 9, 992a24-29 ; Λ, 10, 1075b37-1076a4.</ref>.
La quatrième concerne la définition et l'universel. Platon et Aristote s'accordent sur le fait que la définition (''horismos'' ou ''logos'') porte sur l'universel et non sur le particulier<ref>Platon, ''Théétète'', 201c-210b ; Aristote, ''Métaphysique'', Z, 15, 1039b27-1040a7.</ref>. Mais Aristote opère une distinction fondamentale entre l'ordre de l'être (où le particulier est premier) et l'ordre de la connaissance (où l'universel est premier)<ref>Aristote, ''Métaphysique'', Z, 13, 1038b8-16 ; ''Seconds Analytiques'', I, 2, 71b33-72a5.</ref>.
=== La dialectique et le rôle de l'expérience sensible ===
Platon et Aristote sont tous deux héritiers de la méthode dialectique inaugurée par Socrate, qui consiste à examiner les opinions par le dialogue argumenté<ref>Platon, ''République'', VII, 533c-534e ; Aristote, ''Topiques'', I, 1-2, 100a18-101b4.</ref>. Aristote conserve cette approche : il commence presque toujours par recenser les opinions des prédécesseurs (''doxographia''), examine les difficultés (''aporiai''), avant de proposer sa propre solution<ref>Aristote, ''Éthique à Nicomaque'', VII, 1, 1145b2-7.</ref>. Cependant, pour Aristote, la dialectique est un outil préparatoire et non une science apodictique<ref>Aristote, ''Topiques'', I, 2, 101a25-b4 ; ''Métaphysique'', Γ, 2, 1004b17-26.</ref>.
Une divergence importante porte sur le rôle de l'expérience sensible. Pour Platon, les sens nous maintiennent dans l'opinion (''doxa'')<ref>Platon, ''Phédon'', 66b ; ''République'', VII, 514a-517c.</ref>. Aristote accorde au contraire une place fondamentale à l'expérience sensible : la science porte sur l'universel, mais cet universel est abstrait à partir des données sensibles par un processus d'induction (''epagôgê'')<ref>Aristote, ''Seconds Analytiques'', II, 19, 100b3-5, trad. J. Tricot, Paris, Vrin, 1947, p. 242 ; ''De l'Âme'', III, 8, 432a3-10.</ref>.
=== Bilan : continuité et rupture ===
Une partie de l'historiographie contemporaine décrit l'aristotélisme comme une reformulation immanentiste des problèmes hérités du platonisme : la forme « descend » du ciel des Idées pour s'incarner dans les choses, le Bien se réalise dans l'accomplissement de la nature propre de chaque être, la philosophie reconnaît que seuls existent les individus concrets dans lesquels l'universel se réalise. Cette caractérisation, parfois résumée par l'expression « naturalisation du platonisme », demeure toutefois une thèse interprétative dont la portée varie selon les commentateurs ; elle ne fait pas consensus dans la recherche universitaire et doit être attribuée à des travaux secondaires précis<ref>Cette interprétation est défendue notamment par certains chercheurs proches de la tradition de Pierre Aubenque ; voir ''Le problème de l'être chez Aristote'', Paris, PUF, 1962. D'autres travaux, notamment Annick Jaulin, ''Aristote. La métaphysique'', op. cit., insistent au contraire sur l'originalité radicale de la démarche aristotélicienne et son enracinement dans la tradition des penseurs de la nature, plus que dans une « naturalisation » du platonisme.</ref>.
Plus généralement, la querelle entre Platon et Aristote est l'une des plus discutées de l'histoire de la métaphysique occidentale. La tradition philosophique ultérieure n'a jamais tranché définitivement, oscillant entre tentatives de conciliation (néoplatoniciens, Thomas d'Aquin) et radicalisations de l'opposition (nominalistes médiévaux, empiristes modernes).
== La logique : l’''Organon''==
===Présentation générale===
L’''Organon'' désigne le groupe des six traités logiques d’Aristote : les ''Catégories'', le ''De interpretatione'' (ou ''Peri hermeneias''), les ''Premiers Analytiques'', les ''Seconds Analytiques'', les ''Topiques'' et les ''Réfutations sophistiques''. Ces ouvrages couvrent l’étude des termes simples, celle des propositions, la théorie générale du syllogisme, la théorie de la science démonstrative, l’art de la dialectique et la critique des raisonnements fallacieux. Ils ont fourni à la pensée occidentale, pendant deux millénaires, le cadre dominant pour analyser les conditions du raisonnement valide, l’architecture du savoir scientifique et les règles du débat rationnel.
L’importance historique de l’ensemble est grande. C’est dans ces traités qu’Aristote dégage pour la première fois la notion de syllogisme, distingue formellement la validité d’un raisonnement de la vérité de ses prémisses, élabore les instruments logiques liés à la contradiction, au tiers exclu et à la bivalence, et propose une théorie de l’explication scientifique fondée sur la connaissance des causes. La défense philosophique du principe de non-contradiction se trouve, elle, surtout dans la ''Métaphysique'' (livre Γ), et non dans l’''Organon'' lui-même. La syllogistique aristotélicienne a été enseignée dans les écoles et les universités jusqu’au XIX{{e}} siècle, et ses concepts continuent de nourrir des débats contemporains en philosophie de la logique, en métaphysique modale et en philosophie des sciences.
L’unité de l’ensemble est cependant problématique. Aristote n’a jamais composé un ouvrage intitulé ''Organon'' ; le terme et le regroupement sont des opérations éditoriales tardives, attribuées à la tradition péripatéticienne et notamment à Andronicos de Rhodes au I{{er}} siècle avant notre ère. L’ordre traditionnel des traités, qui place la théorie de la science démonstrative au cœur du dispositif, traduit un choix interprétatif qui n’est probablement pas celui d’Aristote lui-même : la recherche contemporaine tend à attribuer aux ''Topiques'' une ancienneté relative et à voir dans la syllogistique formelle un développement plus tardif. Lire la logique aristotélicienne demande donc de tenir compte simultanément de la lettre des traités, de la tradition exégétique qui les a reçus et organisés, et des hypothèses de la recherche actuelle qui en renouvelle les enjeux.
===Architecture et destinée de l’''Organon''===
====Le titre « ''Organon'' » : une création tardive====
Le terme grec ''organon'' signifie « instrument », « outil ». La désignation des six traités logiques sous ce titre commun obéit à une tradition qui ne remonte pas, semble-t-il, à Aristote lui-même.<ref>Pellegrin, P., « Introduction générale à l’''Organon'' », dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007, p. 7-50.</ref> Pierre Pellegrin rappelle, dans son introduction générale à l’''Organon'' paru chez Flammarion, que « "logique", "instrument" sont des termes qu’Aristote emploie en leurs acceptions ordinaires », et non au sens technique que leur ont donné les commentateurs néo-platoniciens. Quand le biologiste Aristote parle d’''organon'', il pense d’abord à l’organe corporel et accessoirement à l’instrument artificiel ; c’est avec la lecture stoïcienne et péripatéticienne que cet « instrument » devient l’instrument ''par excellence'' de la philosophie, c’est-à-dire la logique.
L’enjeu de cette précision dépasse l’érudition. Si la qualification de « logique » et le regroupement des six traités sous l’étiquette « Organon » sont des opérations posthumes, l’ordre traditionnel dans lequel on lit aujourd’hui ces textes (''Catégories'', ''De interpretatione'', ''Premiers Analytiques'', ''Seconds Analytiques'', ''Topiques'', ''Réfutations sophistiques'') n’a rien d’évident ni de nécessaire. Cet ordre s’impose à partir du IV{{e}} siècle de notre ère, et il porte la marque d’un choix interprétatif fondamental.
====L’intervention d’Andronicos de Rhodes====
Vers le milieu du I{{er}} siècle avant notre ère, Andronicos de Rhodes entreprend une édition systématique du corpus aristotélicien à laquelle nous devons en grande partie le texte que nous possédons aujourd’hui. Selon une lecture défendue notamment par Pellegrin et Brunschwig, et qui doit être présentée comme une interprétation forte plutôt que comme un fait définitivement établi, l’intervention d’Andronicos aurait avant tout consisté à réduire la part de la dialectique au profit de celle de l’analytique.<ref>Voir Pellegrin, P., « Introduction générale à l’''Organon'' », dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007, p. 26-44 ; Brunschwig, J., introduction à Aristote, ''Topiques'' (livres I-IV), Les Belles Lettres, 1967, rééd. 2007, p. XXXIII-XLVIII.</ref> Pellegrin résume ainsi ce travail : la « logique » d’Aristote, qu’il n’appelait peut-être pas ainsi mais qui reçut très rapidement ce nom sous l’influence de la division stoïcienne de la philosophie, était avant Andronicos principalement un ensemble de traités consacrés à des activités dialectiques et notamment réfutatives.
Cette réorganisation, si on l’admet, a des conséquences théoriques importantes. En plaçant les ''Seconds Analytiques'' (la théorie du syllogisme scientifique) au centre de gravité de l’''Organon'', Andronicos oriente la lecture de la logique aristotélicienne vers une épistémologie de la science démonstrative à laquelle tous les autres traités servent de propédeutique. Les ''Catégories'' préparent à l’étude des termes, le ''De interpretatione'' à celle des propositions, les ''Premiers Analytiques'' à l’analyse formelle du syllogisme en général ; les ''Topiques'' et les ''Réfutations sophistiques'' apparaissent comme un appendice consacré aux formes secondaires du raisonnement (raisonnements à partir de prémisses simplement probables, raisonnements fallacieux). Or, comme l’a soutenu Brunschwig dans son édition des ''Topiques'', il est très probable que la chronologie de la composition aristotélicienne aille en partie dans le sens inverse : les ''Topiques'' seraient un traité ancien, écrit du temps où Aristote était encore membre de l’Académie platonicienne, et la syllogistique formelle des ''Premiers Analytiques'' représenterait un développement théorique postérieur, élaboré à partir des problèmes rencontrés dans la pratique dialectique. Pellegrin écrit, en synthétisant cette hypothèse : « Le syllogisme scientifique serait alors une forme particulière du syllogisme en général qui aurait des contraintes supplémentaires, au moins au nombre de deux : avoir des prémisses vraies, antérieures à la conclusion et plus connues qu’elle, et donner dans le moyen terme la cause de la conclusion. »
Si cette hypothèse est correcte, ce que nous appelons la « logique aristotélicienne » serait, dans son projet originel, une codification de l’affrontement dialectique, c’est-à-dire d’une pratique d’argumentation entre un ''questionneur'' et un ''répondant'' ; la théorie du syllogisme scientifique en constituerait une spécification ultérieure. Comme l’écrit Brunschwig, cité par Pellegrin, le questionneur dialectique « doit construire une argumentation formellement contraignante, ayant pour prémisses des propositions auxquelles le répondant ne puisse refuser son assentiment, et pour conclusion la proposition contradictoire de celle que soutient le répondant. » Toute la logique aristotélicienne, dans cette perspective, naîtrait du souci de codifier cet exercice argumentatif et de distinguer les bons arguments des mauvais.
====Logique : partie de la philosophie ou instrument ?====
Une question agitée dès l’Antiquité, et sur laquelle Aristote lui-même ne se prononce jamais explicitement, est celle du statut de la logique. Est-elle une ''partie'' de la philosophie, comme le soutiendront les Stoïciens (qui distinguent éthique, physique et logique), ou en est-elle un ''instrument'' (organon), c’est-à-dire un outil méthodologique préalable à toute investigation philosophique ? La tradition péripatéticienne, et notamment Alexandre d’Aphrodise, défend la seconde thèse : la logique n’est pas une science indépendante avec son propre objet, mais une discipline formelle qui prépare à l’étude de tout objet. Cette conception coïncide avec le statut subordonné qu’Aristote accorde lui-même à l’analyse logique : la logique étudie les ''formes'' du raisonnement valide, indépendamment du ''contenu'' particulier des propositions.
Cette caractérisation appelle une nuance. La logique aristotélicienne n’est pas purement formelle au sens contemporain du terme. Comme l’a montré Paolo Crivelli, « bien qu’on puisse créditer Aristote de la thèse selon laquelle la logique est formelle, la manière dont elle est formelle pour lui diffère de celle dont elle l’est pour beaucoup de philosophes et logiciens modernes ».<ref>Crivelli, P., « Truth and Formal Validity in the Prior Analytics », dans A. P. Mesquita et R. Santos (dir.), ''New Essays on Aristotle’s Organon'', Routledge, 2024, chap. 4.</ref> La forme du raisonnement, chez Aristote, n’est pas une pure structure syntaxique substituable à n’importe quelle matière : elle implique des relations sémantiques entre les termes, des relations qui présupposent une certaine ontologie. La logique aristotélicienne est traversée, du début à la fin, par des questions qui, du point de vue moderne, relèvent plutôt de la sémantique, de l’ontologie et de la métaphysique.
====Ce qu’il faut retenir====
L’''Organon'' n’est pas un livre composé par Aristote mais un regroupement éditorial dû à la tradition péripatéticienne. L’ordre traditionnel des traités traduit une lecture orientée vers la science démonstrative, contre laquelle la recherche contemporaine (Brunschwig, Pellegrin) propose une hypothèse alternative selon laquelle la dialectique des ''Topiques'' serait antérieure et la syllogistique formelle un développement postérieur. La logique aristotélicienne se présente comme un instrument plutôt qu’une partie de la philosophie, mais elle reste, dans son fonctionnement même, traversée par des questions sémantiques et ontologiques.
===Chapitre I. ''Les Catégories'' : les genres suprêmes de l’être===
====Le titre, l’objet et l’authenticité du traité====
Le traité que la tradition désigne sous le titre de ''Catégories'' (en grec ''Katêgoriai'', plus rarement ''Pro tôn topôn'', « Préliminaire aux ''Topiques'' ») se présente comme une œuvre brève, divisée en deux parties hétérogènes.<ref>Sur le titre ''Pro tôn topôn'' et son sens, voir Bodéüs, R., introduction à Aristote, ''Catégories'', Les Belles Lettres, 2002.</ref> La première (chapitres 1 à 9) traite des « antéprédicaments » (homonymes, synonymes, paronymes ; choses dites avec ou sans combinaison) puis des dix catégories proprement dites, avec une attention particulière portée à la substance, à la quantité, à la relation et à la qualité. La seconde partie (chapitres 10 à 15), appelée « post-prédicaments », traite de notions plus diverses : les opposés, l’antériorité, la simultanéité, le mouvement et les sens du verbe « avoir ». L’authenticité de cette seconde partie a été contestée dès Andronicos, et elle continue de l’être.
L’authenticité même de la première partie a été discutée dès l’Antiquité. Pellegrin, à la fin de son introduction au traité, conclut prudemment que le fait, indéniable, que la philosophie d’Aristote serait inintelligible sans la doctrine des catégories n’établit nullement l’authenticité du traité éponyme.<ref>Pellegrin, P., « Présentation des ''Catégories'' », dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007, p. 67-92, ici p. 90-92.</ref> Que la doctrine soit aristotélicienne, et qu’elle soit centrale pour l’aristotélisme, est indubitable ; mais cela ne prouve pas que ce traité particulier ait été composé par Aristote en personne. Il pourrait s’agir d’un manuel péripatéticien tardif fidèle à la pensée du maître. Pour notre propos, peu importe : nous nous attacherons à exposer la doctrine telle qu’elle se présente dans le texte canonique.
====Les antéprédicaments : homonymes, synonymes, paronymes====
Le traité s’ouvre sur trois définitions qui paraissent, au premier abord, purement linguistiques mais qui ont en réalité une portée ontologique réelle.
Sont dits homonymes, écrit Aristote, « les objets dont le nom seul est commun, alors que l’énonciation correspondant à ce nom est différente ».<ref>Aristote, ''Catégories'' 1, 1a1-2.</ref> L’exemple canonique est celui du mot grec ''zôion'', qui désigne aussi bien l’animal vivant que la figure peinte ou dessinée (le peintre, en grec, se dit ''zôgraphos'', de ''graphein'' qui peut signifier écrire, tracer, dessiner ou peindre). Un homme et la représentation peinte d’un homme reçoivent l’un et l’autre le nom ''zôion'', mais la définition de ce qu’est, pour chacun, « être un ''zôion'' » est radicalement différente : pour l’homme, ''zôion'' signifie « être animé doué de sensation » ; pour la peinture, ''zôion'' signifie « figure représentée sur une surface ». L’homonymie n’est donc pas seulement un fait linguistique : elle révèle que ce qui partage un même nom peut relever d’essences entièrement distinctes.
Sont dits synonymes au contraire « les objets dont le nom est commun, et pour lesquels l’énonciation correspondant à ce nom est la même ».<ref>Aristote, ''Catégories'' 1, 1a6-12.</ref> Un homme et un bœuf sont tous deux « animal », et l’énonciation de ce que c’est, pour eux, qu’être animal (vivant doué de sensation) est identique. L’usage aristotélicien de ''sunônumon'' est donc presque l’inverse du nôtre : la synonymie ne désigne pas deux mots qui ont le même sens, mais deux objets qui appartiennent à la même espèce ou au même genre.
Sont dits enfin paronymes « les objets qui tiennent leur appellation d’un certain objet, alors qu’ils en diffèrent par la dérivation » : ''grammatikos'' (le lettré) tient son nom de ''grammatikê'' (le savoir-lire), ''andreios'' (le courageux) tient son nom de ''andreia'' (le courage).<ref>Aristote, ''Catégories'' 1, 1a12-15.</ref> Le paronyme partage la racine du nom de la qualité dont il est porteur, mais il s’en distingue par sa flexion morphologique.
Ces trois catégories ne sont pas de simples préliminaires : elles structurent toute la suite du traité. L’homonymie permettra de distinguer entre des emplois irréductibles d’un même mot ; la synonymie sera invoquée pour caractériser le rapport entre la substance première et la substance seconde ; la paronymie permettra de comprendre comment des qualités donnent lieu à des qualifications. La question de l’« unité de l’être », sur laquelle nous reviendrons, prend également racine dans cette opposition entre homonymie et synonymie : si l’être est dit en plusieurs sens, est-il homonyme purement et simplement, ou s’agit-il d’une ''homonymie focale'' (selon la terminologie introduite par G.E.L. Owen) où plusieurs sens se rapportent à un sens premier ?
====Termes dits avec et sans combinaison ; les quatre classes d’étants====
Au chapitre 2, Aristote introduit deux distinctions importantes. La première oppose ce qui « est dit selon une combinaison » (par exemple « un homme court », « un homme gagne ») à ce qui « est dit sans combinaison » (par exemple « homme », « bœuf », « court », « gagne »). Cette distinction prépare l’analyse des catégories qui, comme termes simples, sont précisément ce qui est dit ''sans combinaison''. L’analyse des combinaisons (c’est-à-dire des propositions) sera réservée au ''De interpretatione''.
La seconde distinction est plus subtile et constitue l’épine dorsale de la doctrine ontologique du traité. Aristote distingue, parmi les étants, ceux qui « se disent d’un sujet » et ceux qui « sont dans un sujet ».<ref>Aristote, ''Catégories'' 2, 1a20-1b9.</ref> Il en résulte quatre classes :
(1) Ce qui se dit d’un sujet ''et'' est dans un sujet : par exemple le ''savoir'' (en général), qui se dit d’un sujet (par exemple le savoir-lire dont il est le genre) et qui est dans l’âme (sujet d’inhérence). Ce sont les universels non substantiels.
(2) Ce qui se dit d’un sujet mais n’est dans aucun sujet : par exemple l’''homme'' en tant qu’espèce, qui se dit de tel homme particulier (Socrate) mais n’est pas une qualité ou un accident ''inhérent'' à un substrat. Ce sont les universels substantiels.
(3) Ce qui est dans un sujet mais ne se dit d’aucun sujet : par exemple ''tel savoir-lire particulier'' qui réside dans une âme particulière, ou ''tel blanc particulier'' présent dans un corps particulier. Ce sont les individus accidentels (parfois appelés « tropes » dans la philosophie analytique contemporaine).
(4) Ce qui ne se dit d’aucun sujet et n’est dans aucun sujet : c’est ''Socrate'', ''tel cheval'', ''tel arbre'', les substances premières au sens strict.
La distinction fondamentale est ici celle entre prédication (« se dire de ») et inhérence (« être dans »). La prédication transporte avec elle la définition : si « animal » se dit de Socrate, alors la définition d’« animal » s’applique à Socrate (Socrate est un être animé doué de sensation). L’inhérence, en revanche, ne transporte pas la définition : « blanc » est dans Socrate, mais Socrate n’est pas la définition de « blanc ». Cette différence est centrale pour comprendre comment les genres et les espèces sont des « substances secondes » alors que la couleur ou la qualité ne le sont pas.
====Les dix catégories : une liste, deux interprétations====
Le chapitre 4 livre la liste canonique des dix « genres suprêmes ». Aristote écrit que « chacun des termes qui sont dits sans aucune combinaison indique soit une substance (''ousia''), soit une certaine quantité (''poson''), soit une certaine qualité (''poion''), soit un rapport à quelque chose (''pros ti''), soit quelque part (''pou''), soit un certain moment (''pote''), soit être dans une position (''keisthai''), soit posséder (''echein''), soit faire (''poiein''), soit subir (''paschein'') ».<ref>Aristote, ''Catégories'' 4, 1b25-27.</ref> Les exemples qu’il donne sont volontairement concrets : un homme, un cheval (substance) ; long de deux coudées, long de trois coudées (quantité) ; blanc, instruit (qualité) ; double, moitié (relation) ; au Lycée, sur l’Agora (lieu) ; hier, l’an dernier (temps) ; couché, assis (position) ; chaussé, armé (possession) ; couper, brûler (action) ; être coupé, être brûlé (passion).
Cette liste a posé, dès l’Antiquité, deux types de problèmes. Premièrement, elle n’est pas systématiquement reprise par Aristote : dans plusieurs autres traités, on trouve des listes plus courtes (à huit ou six catégories), et Aristote ne fournit nulle part une justification rigoureuse du nombre dix. Deuxièmement, son objet même est contesté : s’agit-il de divisions du langage, de divisions de la pensée, ou de divisions de la réalité ?
Pellegrin rappelle dans son introduction la pluralité des interprétations historiques. Friedrich Trendelenburg, au XIX{{e}} siècle, a soutenu une interprétation grammaticale : les catégories correspondraient aux parties du discours grec, les quatre premières (substance, quantité, qualité, relation) aux noms et adjectifs, les quatre dernières (action, passion, position, possession) aux verbes, les deux intermédiaires (lieu, temps) aux adverbes. Cette lecture a l’avantage de réduire l’apparent désordre de la liste, mais elle a été critiquée par Émile Benveniste qui a objecté que la grammaire grecque ne propose pas exactement cette division. Une lecture ontologique, au contraire, voit dans les catégories les genres suprêmes de l’étant : Franz Brentano, dans sa thèse de 1862 ''Von der mannigfachen Bedeutung des Seienden nach Aristoteles'' (''De la diversité des acceptions de l’être d’après Aristote''), en a donné l’exposition la plus achevée. Mais cette lecture, comme le note Pellegrin, peine à expliquer le rapport étroit entre catégories et prédication.
La solution la plus juste consiste sans doute à reconnaître, avec Pellegrin, que les catégories sont à l’intersection d’une analyse logique du discours et d’une décomposition ontologique de la réalité. Elles sont à la fois des types de prédication et des genres de l’être : la double dimension est constitutive de la doctrine, et toute tentative de réduire l’une à l’autre manque l’originalité du projet aristotélicien.
Un éclairage supplémentaire vient des ''Topiques'' (I, 9), où Aristote distingue ce que ''katègoria'' peut désigner : tantôt les dix « catégories » (ce que c’est, qualité, quantité, etc.), tantôt les quatre prédicables (accident, genre, propre, définition), tantôt encore les catégories que l’on signifie quand on signifie une essence. Comme l’explique Pellegrin, quand on dit d’un homme particulier qu’il est un homme, on lui donne comme prédicat essentiel une substance ; quand on dit de telle couleur blanche qu’elle est du blanc, on lui donne comme prédicat essentiel une qualité. La doctrine des catégories articule indissociablement une typologie des relations prédicatives et une typologie des genres d’être : elle est au croisement de la logique et de la métaphysique.
====La substance première et la substance seconde====
Parmi les dix catégories, l’une occupe une position privilégiée : la substance (''ousia''). Aristote écrit, au début du chapitre 5 : « La substance est ce qui se dit proprement, premièrement et avant tout ; ce qui à la fois ne se dit pas d’un certain sujet et n’est pas dans un certain sujet ; par exemple tel homme ou tel cheval ».<ref>Aristote, ''Catégories'' 5, 2a11-14.</ref> La substance première est donc l’individu concret, ce que la tradition appellera plus tard ''tode ti'', « ceci », « ce quelque chose-ci ». Elle se distingue par une double caractéristique négative : elle n’est ni dite d’un sujet (elle n’est pas un prédicat) ni dans un sujet (elle n’est pas une qualité ou un accident inhérent à un substrat).
Cette définition a une conséquence ontologique importante : sans les substances premières, rien d’autre ne pourrait exister. « Tous les autres termes, ou bien se disent de sujets qui sont les substances premières, ou bien sont dans des sujets qui sont ces mêmes substances ».<ref>Aristote, ''Catégories'' 5, 2a34-2b6.</ref> Si l’on supprime les hommes et les chevaux particuliers, on supprime du même coup l’espèce « homme » et l’espèce « cheval », qui se disent d’eux ; on supprime également les couleurs, les qualités, les actions, qui sont dans eux. La substance première est le substrat ultime (''hypokeimenon''), ce dont tout se dit mais qui n’est dit de rien d’autre.<ref>Cf. Aristote, ''Métaphysique'' Z, 3, 1028b36-37.</ref>
Mais Aristote reconnaît également l’existence de substances secondes : ce sont les espèces et les genres auxquels appartiennent les substances premières. L’homme (espèce) et l’animal (genre) sont des substances secondes parce qu’ils se disent des substances premières. Aristote précise que « parmi les substances secondes, l’espèce est plus substance que le genre, car elle est plus proche de la substance première » : un homme particulier est plus immédiatement reconnu comme « un homme » que comme « un animal », et la définition d’« homme » est plus précise que celle d’« animal ».
Cette articulation entre substance première et substance seconde est l’une des thèses les plus originales du traité. D’un côté, Aristote affirme la primauté ontologique de l’individu sur l’universel, ce qui le distingue du Platon des dialogues médians, pour qui les Idées (universelles) sont plus réelles que les choses sensibles. D’un autre côté, il reconnaît à l’espèce et au genre une réalité substantielle, ce qui ne les réduit pas à de purs concepts mentaux. La synonymie y joue un rôle important : la substance et ses différences se disent de façon synonyme de la substance première, c’est-à-dire avec partage de la définition. Quand je dis que « Socrate est homme » et que « Socrate est animal », je transporte sur Socrate les définitions complètes de « homme » et d’« animal » ; ce n’est pas le cas quand je dis « Socrate est blanc », car je n’attribue pas à Socrate la définition de la blancheur (Socrate n’est pas la couleur blanche).
Il faut signaler que la doctrine de la substance présentée dans les ''Catégories'' n’est pas identique à celle que développeront les livres centraux de la ''Métaphysique'' (Z, H, Θ). Dans la ''Métaphysique'', Aristote cherche dans la forme ou l’essence (''eidos'') le principe de substantialité de l’individu : la forme n’est pas simplement identifiée à un universel au sens d’un genre ou d’une espèce ; elle est ce qui, dans l’individu lui-même, en fait ce qu’il est et le rend connaissable. Cette recherche d’un principe immanent de substantialité crée une tension avec la doctrine des ''Catégories'', qui assignait la primauté à l’individu concret comme totalité indivise. Cette tension nourrit l’un des grands débats interprétatifs de l’aristotélisme contemporain : la doctrine des ''Catégories'' est-elle une étape antérieure et moins mûre, qu’Aristote dépasse dans la ''Métaphysique'' ? Ou bien les deux doctrines coexistent-elles dans le système, chacune ayant son domaine de validité ? Bodéüs, dans son introduction de l’édition des Belles Lettres, défend une lecture compatibiliste où la substance première des ''Catégories'' (l’individu) reste première en un sens, tandis que la ''Métaphysique'' cherche, à l’intérieur de l’individu, ce qui en fait la substantialité (sa forme).
====Les propriétés caractéristiques de la substance====
Les chapitres 5 à 9 des ''Catégories'' dégagent ensuite plusieurs propriétés permettant d’identifier la substance et de la distinguer des accidents. Ces « propriétés topiques » ne visent pas à donner une définition de la substance, mais, comme le précise une note de l’édition Flammarion, à préparer le lecteur à construire et à utiliser les lieux appropriés à un type de prédication donné. Elles sont des outils dialectiques utiles dans la discussion.
Première propriété : toute substance n’est pas dans un sujet. Cette propriété ne lui est cependant pas exclusive ; les différences (''diaphorai'') ne sont pas non plus dans un sujet, sans être pour autant des substances. Aristote précise aussi que les parties des substances (la main, le pied) sont elles-mêmes des substances, contre une objection qui pourrait les considérer comme des qualités du tout.
Deuxième propriété : la substance et ses différences se disent de façon synonyme. Quand je dis que « Socrate est homme » et que « Socrate est bipède » (où « bipède » est une différence spécifique de l’homme), je transporte la définition complète de chacun de ces termes sur Socrate.
Troisième propriété : toute substance « indique un certain ceci » (''tode ti''). Cette caractéristique vaut éminemment pour les substances premières, qui sont des individus numériquement uns. Pour les substances secondes (espèce, genre), Aristote précise qu’elles désignent plutôt « une certaine sorte d’objet » (''poion ti'') : non pas un individu particulier, mais le type auquel des individus appartiennent. Les substances secondes sont substances en ce qu’elles fondent l’identité essentielle des substances premières, mais elles ne sont pas des « ceci » au même titre.
Quatrième propriété : la substance n’admet pas le plus ou le moins. On ne dit pas qu’un homme est « plus homme » qu’un autre, ni qu’un cheval est « moins cheval » : être homme ou être cheval ne souffre pas de degrés. Au contraire, les qualités admettent le plus ou le moins (un homme peut être plus blanc qu’un autre, plus instruit, plus juste).
Cinquième propriété, la plus remarquable : la substance est capable de recevoir les contraires tout en restant la même et numériquement une. Le même Socrate peut être tantôt assis, tantôt debout ; tantôt en bonne santé, tantôt malade ; tantôt joyeux, tantôt triste. Cette capacité à supporter le changement tout en demeurant identique à soi-même constitue, selon Aristote, le « caractère le plus propre » de la substance ; c’est ce qui en fait précisément le substrat (''hypokeimenon'') du devenir. Une qualité particulière ne peut pas recevoir les contraires : telle blancheur ne peut devenir noirceur (elle est remplacée par une noirceur, qui est une autre qualité). Seule la substance traverse le changement sans cesser d’être ce qu’elle est.
====L’être n’est pas un genre : l’unité problématique de l’étant====
La doctrine des catégories soulève une difficulté philosophique : si l’être se dit en plusieurs sens irréductibles (être substance, être qualité, être quantité, etc.), comment préserver l’unité de son concept ? Cette question, qu’Aristote pose dans la ''Métaphysique'' (B, 3, 998b22), reçoit une réponse qui structure son ontologie : l’être n’est pas un genre.
La raison en est, comme l’explique l’''Aristoteles-Handbuch'', un argument technique sous forme de ''reductio ad absurdum'' : si l’être était un genre, alors les différences spécifiques qui le diviseraient en espèces seraient elles-mêmes des étants ; or aucun genre ne peut être prédiqué de ses différences spécifiques (sinon les différences seraient déjà comprises dans le genre, et la division spécifique serait impossible) ; donc, si l’être était un genre, ses différences ne seraient pas des étants, ce qui est absurde.<ref>Rapp, C., et Corcilius, K. (dir.), ''Aristoteles-Handbuch'', Stuttgart, J. B. Metzler, 2021, partie IV.</ref> L’être ne peut donc pas être un genre au sens propre.
Mais alors, l’être est-il purement homonyme ? Aristote refuse cette conséquence. Il développe, principalement dans le livre Γ de la ''Métaphysique'', une troisième voie : les différentes acceptions de l’être ne sont ni univoques (comme à l’intérieur d’un genre) ni purement équivoques (comme dans le cas de l’homonymie au sens strict), mais elles se rapportent toutes à un terme premier, la substance. « L’être se dit en multiples acceptions, mais toujours relativement à un terme unique, à une nature déterminée » (Γ, 2, 1003a33-b10). Une qualité ne peut être qu’en tant qu’elle est ''qualité d’une substance'' ; une quantité ne peut être qu’en tant qu’elle est ''quantité d’une substance''. La substance constitue le pôle de référence par rapport auquel les autres significations de l’être se définissent.
Cette structure est ce que la tradition appelle ''homonymie focale'' ou ''signification focale'' (''focal meaning'', dans la formulation de G.E.L. Owen). L’''Aristoteles-Handbuch'' l’illustre par un exemple aristotélicien : la santé est dite, en sens divers, du teint, de la gymnastique, de la médecine, et de l’homme. Ces sens ne sont pas univoques (un teint sain et un homme sain ne sont pas « sains » de la même façon), mais ils ne sont pas non plus purement homonymes : tous se rapportent à la santé de l’homme (le teint ''signe'' cette santé, la gymnastique la ''préserve'', la médecine la ''produit''). De même pour l’être : tous les modes d’être se rapportent à la substance, qui constitue le « cas privilégié » par rapport auquel les autres se définissent.
====Ce qu’il faut retenir====
Les ''Catégories'' opèrent au croisement de la logique, de la grammaire et de l’ontologie. Le traité distingue homonymes, synonymes et paronymes ; il présente quatre classes d’étants articulées par les relations de prédication et d’inhérence ; il dresse la liste des dix catégories ; il accorde la primauté à la substance première (l’individu concret) tout en reconnaissant l’existence des substances secondes (espèces et genres). La doctrine de l’''homonymie focale'' permet à Aristote de préserver une unité conceptuelle de l’être sans en faire un genre univoque, ouvrant ainsi la voie à la métaphysique.
===Chapitre II. ''Le De interpretatione'' (Peri hermeneias) : le jugement et la proposition===
====Titre, objet et méthode du traité====
Le titre grec du traité, ''Peri hermeneias'', désigne « ce qui concerne l’interprétation », mais avec une nuance importante : ''hermeneia'' ne renvoie pas à un ''acte'' (qui serait ''hermeneusis''), mais à ''son produit'' ; non pas l’interpréter, mais l’interprété. Catherine Dalimier, dans son introduction à l’édition Flammarion, propose d’y voir un traité « sur l’expression de la proposition déclarative » (''Peri tou logou apophantikou hermeneias''), c’est-à-dire sur cette forme particulière de discours qui est susceptible d’être vraie ou fausse.<ref>Dalimier, C., introduction au ''De l’interprétation'', dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007.</ref>
L’objet du traité, à la différence des ''Catégories'' qui s’intéressaient aux termes simples (atomes logiques), est la proposition déclarative comme unité minimale de la connaissance et de la communication. Aristote y examine la structure du discours qui peut être validé comme vrai ou faux, les conditions du jugement, les rapports entre langage, pensée et réalité.
C.W.A. Whitaker, dans une interprétation que Pellegrin et Dalimier trouvent éclairante, a proposé de lire l’ensemble du traité comme une exploration systématique de la contradiction (''antiphasis''), du « couple de contradictoires ».<ref>Whitaker, C.W.A., ''Aristotle’s'' De Interpretatione: ''Contradiction and Dialectic'', Oxford, Clarendon Press, 1996.</ref> La proposition serait étudiée non pas pour elle-même, mais en tant qu’elle s’inscrit dans un couple affirmation/négation qui constitue l’unité minimale de toute évaluation logique. Cette lecture restitue au ''De interpretatione'' sa cohérence interne et le rattache aux ''Topiques'' et aux ''Réfutations sophistiques'', où la contradiction joue un rôle central.
====Le triangle sémiotique : choses, pensées, mots====
Le traité s’ouvre, au chapitre 1, sur une réflexion sur le statut du langage qui constitue l’un des textes fondateurs de la philosophie occidentale du signe. Aristote y établit un triangle sémiotique à trois étages.
Les sons émis par la voix (''ta en tê phonê'') sont des symboles (''symbola'') des affections de l’âme (''ta en tê psychê pathêmata''), c’est-à-dire des pensées, des concepts mentaux. Les mots écrits sont à leur tour des symboles des mots prononcés. Les pensées, enfin, sont des ressemblances (''homoiômata'') des choses (''pragmata'').<ref>Aristote, ''De l’interprétation'' 1, 16a3-8.</ref>
On obtient donc trois niveaux : les choses ; les concepts mentaux qui leur ressemblent ; les sons et les écritures qui symbolisent ces concepts. Ce qui importe, c’est la ''différence de relation'' entre les niveaux. La relation entre les sons (ou les écritures) et les pensées est conventionnelle (''kata sunthêkên'') : « De même que l’écriture n’est pas la même pour tous les hommes, les mots parlés ne sont pas non plus les mêmes ». La diversité des langues humaines manifeste précisément ce caractère conventionnel : il n’y a pas de raison naturelle pour laquelle telle pensée devrait être exprimée par tel son plutôt que par tel autre. En revanche, la relation entre les pensées et les choses est une relation de ressemblance : les états de l’âme « sont identiques chez tous », parce qu’ils reflètent la structure même du réel, qui est, elle, universelle.
Cette doctrine a plusieurs conséquences. D’abord, elle prend ses distances avec le naturalisme cratylien : aucun mot n’est par nature le nom de telle chose, c’est l’institution sociale qui assigne tel signe à tel signifié. Ensuite, elle fonde la possibilité d’une communication véridique : si les pensées sont des reflets fidèles des choses, alors la traduction et la compréhension interlinguistique sont possibles, parce qu’au-delà de la diversité des conventions linguistiques, on retrouve une communauté de concepts mentaux qui est elle-même garantie par l’unité du réel. Enfin, elle implique une certaine subordination du langage à la pensée : ce que le langage fait, c’est exprimer (par signes conventionnels) des pensées qui, elles, ressemblent aux choses ; le langage n’est pas le lieu primaire de la vérité, mais sa manifestation extérieure.
Aristote précise immédiatement, au chapitre 1, que la vérité et la fausseté n’apparaissent qu’avec la composition ou la séparation. Un mot isolé (« homme », « blanc », « cheval ») ne peut être ni vrai ni faux. Même un mot qui désigne quelque chose d’inexistant (« bouc-cerf », hybride imaginaire) signifie quelque chose, mais n’est ni vrai ni faux : il faut, pour qu’un énoncé soit susceptible d’être vrai ou faux, qu’on y ajoute « être » ou « ne pas être », qu’on attribue ou qu’on nie quelque chose de quelque chose. La vérité est d’abord propositionnelle.
====Le nom (''onoma'')====
Avant d’examiner la proposition, Aristote analyse ses constituants. Le nom (''onoma'') est défini, au chapitre 2, comme « un vocable signifiant par convention, sans référence à un temps, et dont aucune partie, considérée séparément, n’est signifiante ».<ref>Aristote, ''De l’interprétation'' 2, 16a19-21.</ref>
Cette définition condense quatre caractères :
(1) Le nom est un vocable (''phonê''), une réalité phonique. Cette précision exclut, par exemple, les sons des animaux (qui ne sont pas des mots) ou les bruits inarticulés.
(2) Il est signifiant : il a un sens, il indique quelque chose.
(3) Il signifie par convention (''kata sunthêkên'') : aucun vocable n’est nom par nature ; il ne le devient que lorsqu’il est institué comme symbole.
(4) Il est sans référence au temps : c’est précisément ce qui le distingue du verbe. « Santé » est un nom, parce qu’il signifie quelque chose sans indiquer si cette chose existe maintenant, a existé ou existera ; « est-en-bonne-santé » est un verbe, parce qu’il consignifie le temps présent.
(5) Aucune de ses parties n’est signifiante prise séparément. Aristote prend l’exemple grec ''Kalippos'' (« Beaucheval », un nom propre) : ''kalos'' (beau) signifie quelque chose hors du nom composé, ''hippos'' (cheval) aussi ; mais dans ''Kalippos'', ces parties ne signifient plus rien : le nom propre est une unité signifiante qui n’est pas la somme de ses constituants apparents.
Aristote introduit également deux notions dérivées. Les noms indéfinis (''aoriston onoma''), comme « non-homme », ne sont pas des noms à proprement parler, mais ils ont une fonction logique importante (notamment dans la négation et dans certaines opérations de la syllogistique). Les noms fléchis (''ptôseis''), comme « de Philon », « à Philon », formes casuelles du nom propre, ne sont pas non plus des noms au sens strict, parce qu’ils n’entrent pas dans une affirmation ou une négation simple : « est-Philon » est susceptible de vrai ou de faux ; « est-à-Philon » ne l’est pas (il manque quelque chose).
====Le verbe (''rhêma'')====
Le verbe (''rhêma''), examiné au chapitre 3, se distingue du nom par deux caractères spécifiques :
(1) Il consignifie le temps : « Santé est un nom, est-en-bonne-santé est un verbe ; car il signifie en plus que c’est un attribut maintenant. »<ref>Aristote, ''De l’interprétation'' 3, 16b6-8.</ref> Le terme « consignifier » (''prossêmainein'') est important : le verbe ne signifie pas le temps comme son objet propre (sinon « hier » serait un verbe), mais il signifie quelque chose ''en plus'' de ce qu’il signifie principalement, et ce supplément est le temps. Ce qu’un verbe signifie principalement, c’est une action ou un état (la santé, le fait de marcher) ; ce qu’il consignifie, c’est l’ancrage temporel de cette action ou de cet état dans le présent.
(2) Il est toujours signe d’attribution : « il est toujours signe d’attributs, par exemple de choses qu’on dit d’un sujet ». Le verbe, autrement dit, indique toujours quelque chose qu’on attribue à autre chose ; il a une fonction prédicative inscrite dans sa nature même.
Catherine Dalimier note dans ses commentaires à l’édition Flammarion que le terme grec ''rhêma'' ne recouvre pas exactement notre concept de « verbe ». Pour Aristote, « marcher » à l’infinitif est encore un nom (parce qu’il n’a, à lui seul, ni valeur temporelle déterminée, ni valeur d’attribution effective) ; il faut « marche » (présent de l’indicatif) pour avoir un ''rhêma'' au sens strict. C’est pourquoi certains traducteurs renoncent à traduire ''rhêma'' par « verbe » et préfèrent calquer le grec.
Aristote distingue, comme pour les noms, des rhèmes indéfinis (« n’est-pas-en-bonne-santé », « n’est-pas-malade ») et des rhèmes fléchis (« était-en-bonne-santé », « sera-en-bonne-santé », formes au passé ou au futur). Les rhèmes indéfinis ne sont pas des verbes proprement dits parce qu’ils peuvent appartenir indifféremment à un être existant ou à un non-existant ; ils manquent de la détermination ontologique du verbe authentique. Les rhèmes fléchis ne sont pas des verbes au sens strict parce qu’ils n’ancrent pas l’attribution dans le présent.
====Le verbe « être » : la copule problématique====
Un cas particulier mérite une attention spéciale : le verbe « être » (''einai''), examiné à la fin du chapitre 3.
Aristote affirme que « être ou ne pas être n’est pas un signe de la chose réelle, pas même si tu dis "étant" tout court ; car en soi, ce n’est rien, mais il consignifie une certaine composition qu’on ne peut concevoir sans les composants ».<ref>Aristote, ''De l’interprétation'' 3, 16b22-25.</ref> Cette phrase fait l’objet de débats interprétatifs intenses. Selon la lecture traditionnelle (Waitz, Sisson), Aristote suggérerait que le verbe « être » est purement copulatif, c’est-à-dire vide de signifié conceptuel propre : il n’aurait qu’une fonction grammaticale de liaison entre sujet et prédicat. Selon Ammonius et la lecture néo-platonicienne, « être » aurait une signification propre (la « participation » ou la « privation » de l’étant) mais seulement en seconde place ; en première place, il signale la composition qui constitue la proposition.
Cette difficulté est centrale pour deux raisons. Premièrement, elle touche à la nature même de la proposition prédicative : qu’est-ce qui se passe, ontologiquement, quand je dis « Socrate est blanc » ? Le « est » ajoute-t-il quelque chose au monde ou est-il un pur outil syntaxique ? Deuxièmement, elle prépare la doctrine, développée dans la ''Métaphysique'', selon laquelle « être » se dit en plusieurs sens (sens copulatif, sens existentiel, sens véritatif), et selon laquelle ces différents sens correspondent à autant de modalités différentes de l’analyse.
====La proposition déclarative (''logos apophantikos'')====
Aristote distingue, au chapitre 4, plusieurs sortes de discours (''logos''). Tout discours n’est pas susceptible d’être vrai ou faux : la prière, l’ordre, la question, l’exclamation sont des discours signifiants mais qui ne se prêtent pas à l’évaluation alèthique. Seul le discours déclaratif (''logos apophantikos''), celui qui ''manifeste'' (du verbe ''apophainein'') un état de choses, peut être vrai ou faux. Aristote précise que les autres formes de discours relèvent plutôt de la rhétorique ou de la poétique.
La proposition déclarative se divise en deux espèces : l’affirmation (''kataphasis'') et la négation (''apophasis''). L’affirmation est « la déclaration de quelque chose au sujet de quelque chose » (''apophansis tinos kata tinos'') ; la négation est « la déclaration de quelque chose séparé de quelque chose » (''apophansis tinos apo tinos'').<ref>Aristote, ''De l’interprétation'' 5, 17a25-26.</ref> Ce qui distingue donc une affirmation d’une négation, ce n’est pas simplement la présence d’une particule négative : c’est l’opération mentale de composition (''synthesis'') ou de division (''diairesis'') qui s’y effectue. Affirmer, c’est ''unir'' mentalement deux termes ; nier, c’est ''séparer'' mentalement deux termes.
C’est cette opération qui rend possible la vérité ou la fausseté, comme l’expliquera plus tard la ''Métaphysique'' (Γ, 7, 1011b26-27) : « dire que ce qui est est et que ce qui n’est pas n’est pas, c’est le vrai ; dire que ce qui est n’est pas ou que ce qui n’est pas est, c’est le faux ». La vérité est une ''correspondance'' entre la composition mentale et la composition réelle ; quand l’âme unit ce qui, dans le réel, est uni, elle dit vrai ; quand elle sépare ce qui, dans le réel, est uni, ou unit ce qui, dans le réel, est séparé, elle dit faux.
====La contradiction (''antiphasis'')====
Le chapitre 6 introduit la notion de contradiction, au cœur du traité selon l’interprétation de Whitaker. La contradiction, c’est précisément le couple formé par une affirmation et la négation qui lui correspond, où l’on affirme et nie « la même chose de la même chose », sans homonymie, et avec toutes les précisions nécessaires « pour nous défendre des sophistes ».<ref>Aristote, ''De l’interprétation'' 6, 17a33-37.</ref>
Cette définition technique cache une thèse philosophique de fond : pour qu’il y ait débat rationnel, il faut que les énoncés qu’on confronte forment un véritable couple de contradictoires, c’est-à-dire qu’ils portent vraiment sur le même sujet sous le même rapport. Aristote précise les conditions à respecter : il faut affirmer et nier la même chose, du même sujet, au même moment, sous le même rapport, et selon le même sens des termes. Si ces conditions ne sont pas réunies, l’apparente contradiction n’en est pas une véritable, et le débat risque de tomber dans le sophisme. Par exemple, « Socrate est assis » et « Socrate n’est pas assis » ne sont pas réellement contradictoires si l’une concerne hier et l’autre aujourd’hui ; ils ne le sont pas non plus si « assis » est pris dans deux sens différents (assis sur une chaise / assis comme on dit d’un raisonnement bien « assis »).
La doctrine de la contradiction n’est pas une simple règle formelle : elle est le fondement de la possibilité même d’une discussion rationnelle, et elle structure aussi bien la dialectique que la science.
====Quantité, qualité et le carré logique====
Le chapitre 7 introduit deux distinctions qui, croisées, donneront naissance au carré logique de la tradition scolastique.
La première distinction concerne la quantité des propositions. Une proposition peut être universelle (« tout homme est blanc », « aucun homme n’est blanc »), particulière (« quelque homme est blanc », « quelque homme n’est pas blanc »), singulière (« Callias est blanc »), ou indéterminée (« l’homme est blanc », sans préciser tous, certains, ou tel homme particulier).
La seconde distinction concerne la qualité : affirmative ou négative.
En croisant les deux distinctions principales (universelle/particulière × affirmative/négative), on obtient quatre formes de propositions catégoriques que la tradition désignera par les voyelles A, E, I, O (désignations qui ne sont pas aristotéliciennes mais scolastiques, dérivées des verbes latins ''Affirmo'' et ''Nego'') : A pour l’universelle affirmative (« tout homme est mortel ») ; E pour l’universelle négative (« aucun homme n’est immortel ») ; I pour la particulière affirmative (« quelque homme est juste ») ; O pour la particulière négative (« quelque homme n’est pas juste »).
Aristote établit, au chapitre 7, les relations qui existent entre ces formes. A et O sont contradictoires : elles ne peuvent être simultanément vraies ni simultanément fausses. E et I sont également contradictoires. A et E sont contraires : elles ne peuvent être simultanément vraies, mais elles peuvent être simultanément fausses (« tout homme est juste » et « aucun homme n’est juste » sont peut-être toutes deux fausses). I et O sont sub-contraires : elles ne peuvent être simultanément fausses, mais elles peuvent être simultanément vraies. Enfin, A entraîne I (et E entraîne O) : c’est la subalternation. Si tous les hommes sont mortels, alors quelque homme est mortel.
Ce dispositif, qui paraît élémentaire, est la base de toute la logique des propositions catégoriques et préfigure une bonne partie de la syllogistique des ''Premiers Analytiques''.
====Les futurs contingents : le chapitre 9====
Le chapitre 9 du ''De interpretatione'' est, comme l’écrit Catherine Dalimier, l’objet de spéculations qui mobilisent depuis l’Antiquité « des générations de logiciens ». Il pose l’une des questions les plus profondes de la logique modale : le principe de bivalence (toute proposition est vraie ou fausse) s’applique-t-il aux propositions portant sur des événements futurs contingents ?
Le problème se formule avec une grande clarté. Considérons deux propositions contradictoires : « Il y aura demain une bataille navale » et « Il n’y aura pas demain une bataille navale ». D’après le principe du tiers exclu, l’une de ces deux propositions est vraie et l’autre est fausse. Or, si l’une d’elles est ''dès maintenant'' vraie, alors l’événement qu’elle décrit est ''dès maintenant'' déterminé : il ''doit'' se produire (ou ne pas se produire) demain. Mais cela conduit à un fatalisme logique : tout ce qui doit arriver est déjà fixé, la délibération humaine est illusoire, le hasard et la liberté sont supprimés. Or il est manifeste, pour Aristote, que certains événements à venir sont contingents (ils peuvent se produire comme ne pas se produire) et que la délibération a un sens.
L’''Aristoteles-Handbuch'' résume avec précision la structure de l’argument fataliste. La prémisse en est une version ''temporalisée'' du principe de bivalence : tout énoncé est, ''à tout moment'', soit vrai soit faux ; donc, dès aujourd’hui, l’énoncé « il y aura demain une bataille navale » est vrai ou faux. Si cet énoncé est dès aujourd’hui vrai, alors sa vérité est déjà ''advenue'' aujourd’hui ; or ce qui est advenu est immuable (« nécessaire » en un certain sens) ; donc il est nécessaire que demain ait lieu une bataille navale. Le raisonnement, généralisé à tous les énoncés sur l’avenir, conduit à la nécessité de tout ce qui doit arriver, c’est-à-dire au déterminisme intégral.
La solution d’Aristote est, comme le note Dalimier, subtile. Il maintient le principe de bivalence pour les propositions portant sur le présent et le passé : ce qui est, est ; ce qui n’est pas, n’est pas ; le passé est immuable. Mais pour les futurs contingents, il propose une distinction délicate : « il est nécessaire que l’affirmation ou la négation soit vraie, mais non que celle-ci déterminément ou celle-là déterminément soit vraie ».<ref>Aristote, ''De l’interprétation'' 9, 19a36-39.</ref> La disjonction « il y aura ou il n’y aura pas demain une bataille navale » est nécessairement vraie (parce que l’un des deux disjoints doit être vrai) ; mais aucun des disjoints pris séparément n’est encore ''déterminément'' vrai ou faux. Selon l’interprétation classique, cette thèse revient à ''suspendre'' l’application déterminée de la bivalence aux futurs contingents, sans pour autant abandonner le principe du tiers exclu pour leur disjonction.
L’interprétation de cette doctrine reste discutée. Certains commentateurs (Hintikka) ont contesté que le chapitre 9 ait pour objet de réfuter le fatalisme et ont vu dans Aristote un partisan d’un certain principe de plénitude (selon lequel tout ce qui est possible doit s’actualiser à un moment ou à un autre). D’autres (Crivelli, Weidemann) maintiennent l’interprétation classique : Aristote rejette la version temporalisée de la bivalence pour les énoncés sur les contingents futurs. La logique formelle contemporaine a élaboré, à partir de cette discussion, des logiques plurivalentes (Łukasiewicz) et des logiques temporelles (Prior) qui formalisent cette thèse de la suspension de la bivalence pour le futur.
L’enjeu philosophique est important : la doctrine aristotélicienne des futurs contingents prépare une articulation entre logique, métaphysique de la causalité, et philosophie de l’action. Elle préserve la possibilité du hasard, de la délibération, et de la liberté humaine, sans pour autant renoncer aux principes de la rationalité.
====Les propositions modales====
Les chapitres 12 et 13 du ''De interpretatione'' examinent les propositions modales, c’est-à-dire les propositions qui ne se contentent pas d’affirmer ou de nier qu’un prédicat appartient à un sujet, mais qui qualifient cette appartenance comme nécessaire, possible, contingente ou impossible. Aristote distingue quatre modalités fondamentales. Le ''possible'' (''dynaton'', ''endechomenon'') désigne ce qui peut être ; l’''impossible'' (''adynaton''), ce qui ne peut pas être ; le ''contingent'', ce qui peut être ou ne pas être (possibilité bilatérale, dont on dira plus loin un mot) ; le ''nécessaire'' (''anankaion''), ce qui ne peut pas ne pas être.
L’analyse aristotélicienne des modalités présente plusieurs particularités sur lesquelles Richard Patterson a particulièrement insisté.<ref>Patterson, R., ''Aristotle’s Modal Logic: Essence and Entailment in the Organon'', Cambridge, Cambridge University Press, 1995.</ref> La première est la distinction entre ''possibilité unilatérale'' et ''possibilité bilatérale'' (ou contingence). Quand je dis « il est possible que S soit P » au sens unilatéral, je veux dire seulement que S peut être P, sans exclure que S soit nécessairement P (la possibilité unilatérale est compatible avec la nécessité). Quand je dis « il est possible que S soit P » au sens bilatéral (la contingence proprement dite), je veux dire à la fois que S peut être P ''et'' que S peut ne pas être P : la chose est possible mais pas nécessaire, elle peut tomber d’un côté ou de l’autre. Cette distinction est cruciale parce qu’elle commande des règles d’inférence et de conversion différentes : « Tout S peut être P » au sens unilatéral n’a pas la même force logique que « Tout S peut être P » au sens bilatéral, et certains syllogismes valides dans un cas ne le sont plus dans l’autre.
Aristote observe également que les propositions modales ne se convertissent pas comme les propositions assertoriques. Une proposition assertorique de type I (« quelque S est P ») se convertit simplement en « quelque P est S ». Mais une proposition modale du type « il est possible que quelque S soit P » ne se convertit pas toujours, ou ne se convertit qu’à condition de spécifier le mode de possibilité. Aristote consacre de longs développements, dans les ''Premiers Analytiques'', à examiner ces règles particulières.
Patterson met également en évidence la dimension essentialiste de la logique modale aristotélicienne. Quand Aristote dit qu’un énoncé est nécessaire, il ne pense pas, comme la logique modale contemporaine, à un opérateur abstrait s’appliquant à une proposition entière (« il est nécessaire que P »). Il pense à une relation entre des termes qui exprime une connexion essentielle. « Il est nécessaire que tout homme soit animal » ne signifie pas seulement que dans tous les mondes possibles, tout homme est animal ; cela signifie qu’« être animal » fait partie de l’''essence'' de « être homme », et que cette appartenance à l’essence rend la prédication nécessaire. La nécessité est ancrée dans la nature même des choses, dans leur ''quiddité''. Cette caractéristique rend délicate la transposition de la logique modale aristotélicienne dans les langages formels modernes, qui utilisent des opérateurs propositionnels faisant abstraction de la structure essentielle des termes.
Les propositions modales jouent un rôle important dans la théorie de la science, comme l’expliqueront les ''Seconds Analytiques'' : la science porte sur le nécessaire, non sur le contingent. Une démonstration scientifique part de prémisses nécessaires et conclut à des nécessités, parce qu’elle vise des vérités universelles et invariables. La théorie modale s’articule ainsi à l’épistémologie aristotélicienne, et les chapitres 12-13 du ''De interpretatione'' préparent les développements plus techniques que livrera Aristote dans la syllogistique modale des ''Premiers Analytiques''.
====Portée philosophique du ''De interpretatione''====
L’importance du ''De interpretatione'' dépasse son objet apparent. Catherine Dalimier souligne, en conclusion de son introduction, que le traité dessine le cadre logique de toute science possible pour Aristote. En établissant que la vérité réside dans la composition et la division opérées par l’intellect, et non dans les choses isolées ni dans les concepts isolés, Aristote fait du jugement le lieu propre de la manifestation de l’être. Cette doctrine sera reprise et développée par toute la philosophie occidentale jusqu’à Kant (qui en fera la base de sa logique transcendantale) et au-delà.
Le traité a également une portée pour la philosophie du langage. La distinction entre nom et verbe, l’analyse du caractère conventionnel du signe linguistique, la théorie de la signification et de la référence, la doctrine des futurs contingents : autant de thèmes qui ont nourri la philosophie analytique contemporaine, comme l’a montré Suzanne Husson dans ''Interpréter le De Interpretatione''.<ref>Husson, S. (éd.), ''Interpréter le'' De Interpretatione, Paris, Vrin, 2009.</ref>
====Ce qu’il faut retenir====
Le ''De interpretatione'' fixe l’unité minimale du jugement, la proposition déclarative, et en analyse les composants (nom, verbe, copule). Il définit la contradiction comme couple affirmation/négation et établit les quatre formes catégoriques A, E, I, O. Il pose deux problèmes qui occuperont la postérité : celui des futurs contingents (suspension de la bivalence pour les énoncés sur l’avenir) et celui des modalités (nécessaire, possible, contingent, impossible), avec des règles de conversion propres. La théorie aristotélicienne y montre son caractère sémantique, ancré dans une métaphysique des essences plutôt que dans un formalisme abstrait.
===Chapitre III. ''Les Premiers Analytiques'' : la théorie formelle du syllogisme===
====Le projet des ''Premiers Analytiques''====
Les ''Premiers Analytiques'' (''Analytica priora'') exposent la théorie du syllogisme dans sa généralité. Leur objet, comme l’explique Aristote dès la première phrase du livre I, est la ''démonstration'', et plus particulièrement le ''syllogisme'' en tant qu’instrument de toute démonstration. Ce qui distingue les ''Premiers'' des ''Seconds Analytiques'', c’est que l’analyse y porte sur la ''forme'' du syllogisme indépendamment de la vérité de ses prémisses. Un syllogisme valide est un syllogisme dont la conclusion suit nécessairement des prémisses, ''que ces prémisses soient vraies ou fausses''. La théorie est donc, en un certain sens, formelle : elle s’intéresse à la structure du raisonnement, non à son contenu particulier.
Comme l’observe Pellegrin, cette caractérisation des ''Premiers Analytiques'' comme étude formelle ne doit pas être prise au sens contemporain, où la formalité signifie généralement la possibilité de substituer n’importe quel contenu à une structure syntaxique. Pour Aristote, le formalisme est plus mesuré : il s’agit de dégager les règles qui permettent de dire qu’un raisonnement ''conclut'' à partir de ses prémisses, et ces règles présupposent encore une certaine sémantique des termes.
====La définition du syllogisme====
Aristote définit le syllogisme (''syllogismos''), au chapitre 1 du livre I, dans une formule devenue célèbre : « un discours dans lequel, certaines choses étant posées, quelque chose d’autre que ces données en résulte nécessairement par le seul fait de ces données ».<ref>Aristote, ''Premiers Analytiques'' I, 1, 24b18-20.</ref>
Cette définition condense plusieurs conditions qu’il faut prendre soin de distinguer.
Première condition : pluralité des prémisses. Un syllogisme suppose au moins deux propositions posées (les prémisses). Aristote ne considère pas comme syllogisme l’inférence à partir d’une seule prémisse.
Deuxième condition : la conclusion doit être ''autre chose'' que les prémisses (« quelque chose d’autre que ces données »). Cette clause exclut, en principe, les raisonnements purement tautologiques.
Troisième condition : la conclusion doit suivre nécessairement. La nécessité du syllogisme est essentielle : il ne suffit pas que la conclusion soit en fait vraie quand les prémisses sont vraies, il faut qu’elle ne ''puisse pas'' ne pas être vraie quand les prémisses le sont.
Quatrième condition, la plus subtile, mise en lumière par Crivelli : la conclusion doit suivre « par le seul fait de ces données » (''tô tauta einai''). Cette clause ajoute à la nécessité une exigence supplémentaire : non seulement la conclusion suit nécessairement, mais elle suit ''en vertu'' des prémisses elles-mêmes, et non d’une autre raison. Crivelli interprète cette clause comme exigeant que le caractère d’avoir la conclusion résultant nécessairement des prémisses devrait être partagé par toutes les inférences de la même structure, ou « forme ». C’est une exigence de ''formalité'' : le syllogisme conclut non pas accidentellement (parce qu’il se trouve, par hasard, que ces prémisses-là ont cette conclusion-là), mais en vertu de la structure formelle du raisonnement.
Cette clause permet à Aristote de distinguer le syllogisme d’autres formes d’inférence nécessaire. Comme le rappelle Orna Harari, Aristote affirme explicitement, en ''Premiers Analytiques'' I, 32 (47a31-35) : « tout syllogisme est nécessaire, mais tout ce qui suit nécessairement n’est pas un syllogisme ».<ref>Harari, O., ''Knowledge and Demonstration: Aristotle’s Posterior Analytics'', Dordrecht, Springer / Kluwer, 2004, chap. 3.</ref> Il existe des inférences valides (par exemple les déductions hypothétiques, ou les raisonnements ''par l’absurde'') qui ne sont pas des syllogismes parce qu’elles ne respectent pas la structure formelle requise.
====Termes, prémisses et structure du syllogisme====
Le syllogisme aristotélicien possède une structure rigoureusement délimitée. Il comprend trois termes : le grand terme (ou ''majeur''), le petit terme (ou ''mineur''), et le moyen terme (''mesos'') qui assure la liaison entre les deux extrêmes. Il comporte deux prémisses : la ''majeure'' (qui contient le grand terme) et la ''mineure'' (qui contient le petit terme). Chaque prémisse contient également le moyen terme. Il aboutit enfin à une conclusion qui relie le petit terme au grand terme, sans contenir le moyen terme.
L’exemple le plus connu, repris par toute la tradition scolastique, est celui qui prend Socrate comme petit terme : « Tout homme est mortel ; or Socrate est un homme ; donc Socrate est mortel ». Il faut noter qu’il s’agit là d’un exemple à terme singulier, scolaire et postérieur à Aristote ; la syllogistique aristotélicienne traite d’abord des propositions catégoriques entre termes généraux. Une formulation plus conforme à l’analyse aristotélicienne serait : « Tout animal est mortel ; tout homme est animal ; donc tout homme est mortel », où les trois termes (animal, homme, mortel) sont tous généraux et se prêtent aux quantifications universelles.
Le moyen terme joue, dans cette structure, un rôle central. Il est ce ''par quoi'' la conclusion est établie. Comme le résume Pellegrin, l’analytique tout entière peut se comprendre comme une technique de recherche du moyen terme : trouver des termes qui permettent de relier deux extrêmes de manière universelle et nécessaire.
====Les trois figures du syllogisme====
Aristote distingue, selon la position du moyen terme dans les prémisses, trois figures syllogistiques. Dans la première figure, le moyen terme est sujet dans la majeure et prédicat dans la mineure : « M est P ; S est M ; donc S est P ». Exemple (Barbara) : « Tout animal est mortel ; tout homme est animal ; donc tout homme est mortel ». Dans la deuxième figure, le moyen terme est prédicat dans les deux prémisses : « P est M ; S est M » (avec l’une des deux prémisses négative). Exemple (Cesare) : « Aucune pierre n’est animée ; tout cheval est animé ; donc aucun cheval n’est une pierre ». Dans la troisième figure, le moyen terme est sujet dans les deux prémisses : « M est P ; M est S ». Exemple (Darapti) : « Tout homme est rationnel ; tout homme est animal ; donc quelque animal est rationnel ».
Aristote considère la première figure comme la plus parfaite, et il faut bien comprendre pourquoi. Une figure est dite « parfaite » quand la nécessité de la conclusion est immédiatement évidente, sans qu’il soit besoin de justifier cette nécessité par un détour. Or la première figure exprime de manière directe le principe que la tradition scolastique appellera le ''dictum de omni et nullo'' (« le dit du tout et du rien ») : ce qui est affirmé (ou nié) de tout un genre est affirmé (ou nié) de tout ce qui tombe sous ce genre. Si « tout animal est mortel » et « tout homme est un animal », alors on voit immédiatement que « tout homme est mortel », parce que les hommes, étant des animaux, héritent de tout ce qu’on dit de tous les animaux. Le moyen terme « animal », en se trouvant entre le grand terme (mortel) et le petit terme (homme), permet à la propriété « mortel » de descendre par transitivité jusqu’aux hommes.
Les syllogismes des deuxième et troisième figures, en revanche, sont qualifiés d’« imparfaits » non parce qu’ils seraient invalides, mais parce que leur validité ne se voit pas immédiatement : on doit la ''dériver''. Pour cela, Aristote les ramène, par diverses opérations (notamment la conversion des prémisses), à des syllogismes parfaits de la première figure. Démontrer la validité d’un syllogisme de la deuxième figure, c’est montrer qu’il peut être traduit en un syllogisme équivalent de la première figure, où la nécessité de la conclusion est immédiatement saisie.
====Les modes valables : Barbara, Celarent, Darii, Ferio====
À l’intérieur de chaque figure, Aristote détermine les modes qui permettent de conclure validement, en croisant les quantités (universelle/particulière) et les qualités (affirmative/négative) des prémisses. La tradition scolastique a inventé des noms mnémotechniques (Barbara, Celarent, Darii, Ferio pour la première figure ; Cesare, Camestres, Festino, Baroco pour la deuxième ; Darapti, Felapton, Disamis, Datisi, Bocardo, Ferison pour la troisième), où les voyelles indiquent les types des prémisses et de la conclusion (A, E, I, O).
Pour la première figure, les quatre modes valables sont : Barbara (AAA), « Tout M est P ; tout S est M ; donc tout S est P » ; Celarent (EAE), « Aucun M n’est P ; tout S est M ; donc aucun S n’est P » ; Darii (AII), « Tout M est P ; quelque S est M ; donc quelque S est P » ; et Ferio (EIO), « Aucun M n’est P ; quelque S est M ; donc quelque S n’est pas P ».
Aristote considère également les autres combinaisons et montre lesquelles ne concluent pas (par la méthode des contre-exemples : on trouve une combinaison de termes qui rend les prémisses vraies et la conclusion fausse).
====La conversion et l’ekthèse====
Pour ramener les modes des deuxième et troisième figures à la première, Aristote emploie principalement deux techniques.
La conversion (''antistrophê'') consiste à transformer une prémisse en interchangeant son sujet et son prédicat. Aristote établit, au début du livre I, des règles de conversion. La E (universelle négative) se convertit simplement : « Aucun S n’est P » se convertit en « Aucun P n’est S ». La I (particulière affirmative) se convertit simplement aussi : « Quelque S est P » se convertit en « Quelque P est S ». La A (universelle affirmative) se convertit ''par accident'' : « Tout S est P » se convertit en « Quelque P est S » (mais non en « Tout P est S »). La O (particulière négative), enfin, ne se convertit pas. Ces règles permettent de transformer un syllogisme imparfait en un syllogisme parfait de la première figure, et donc de prouver sa validité.
L’''ekthèse'' (''ekthesis'', mot grec qui signifie littéralement « exposition », au sens d’« exposer », « mettre en avant ») est une technique plus rare, utilisée notamment pour valider Baroco et Bocardo, deux modes que la conversion ne suffit pas à ramener à la première figure. Le procédé consiste à introduire un terme supplémentaire, plus restreint, qui ''exemplifie'' la condition exprimée par une prémisse particulière. Si l’on a, par exemple, « quelque S n’est pas P », l’ekthèse pose un terme N qui désigne précisément cette portion de S qui n’est pas P, puis raisonne sur N comme sur un nouveau sujet. Le syllogisme se trouve ainsi reformulé sous une forme qui se prête à un raisonnement direct. Comme l’a montré Jonathan Lear, l’ekthèse n’implique pas une « imagination » au sens moderne, ni un appel à l’intuition sensible : c’est une procédure logique rigoureuse qui pose un cas particulier auquel s’appliquent les conditions de la prémisse, et qui permet de rendre manifeste une nécessité qui était implicitement contenue dans les prémisses originales.<ref>Lear, J., ''Aristotle and Logical Theory'', Cambridge, Cambridge University Press, 1980, chap. 1.</ref> Sa parenté avec certaines techniques de preuve mathématique (raisonner sur un cas particulier représentatif) est manifeste.
====La syllogistique modale (Patterson)====
Aux chapitres 3 et 8 à 22 du livre I, Aristote étend la syllogistique aux propositions modales (nécessaires, possibles, contingentes). Cette extension a été l’un des grands chantiers de l’aristotélisme contemporain, et Richard Patterson a proposé une lecture qui permet de comprendre la cohérence d’un système qui a souvent paru aux interprètes (Łukasiewicz, McCall, Hintikka) traversé de contradictions internes.
La thèse centrale de Patterson est qu’Aristote fait usage de ce qu’il appelle un ''modal copula'' : la modalité ne s’applique pas à la proposition entière (''de dicto'' : « il est nécessaire que tout homme soit animal »), ni au seul prédicat (''de re'' : « tout homme est nécessairement-animal »), mais à la copule elle-même qui relie sujet et prédicat. Au lieu de dire « tout homme ''est'' animal » (forme assertorique), on dirait « tout homme ''est-nécessairement'' animal » : c’est le « est » lui-même, la liaison prédicative, qui est qualifié modalement. Cette structure est elle-même ambiguë entre deux lectures : une lecture forte (''strong cop'') et une lecture faible (''weak cop'').
Dans la lecture forte, la proposition « Animal Ns (nécessaire selon copule forte) Tout-Homme » signifie qu’il existe une connexion ''per se'', c’est-à-dire essentielle, entre les termes : « animal » entre dans la définition d’« homme », c’est sa nature même d’être animal. Les propositions de la science démonstrative, telles que les ''Seconds Analytiques'' les caractérisent, sont des propositions à ''strong cop necessity''.
Dans la lecture faible, « Animal Nw Tout-Blanc » par exemple signifie seulement que tout ce qui est blanc est nécessairement animal, non pas parce qu’il y aurait une connexion essentielle entre blancheur et animalité, mais parce que ''de fait'', dans le monde considéré, tout ce qui est blanc se trouve être animal. Cette lecture ''de re'' étendue est plus large : elle inclut des cas où le prédicat appartient nécessairement au sujet sans pour autant entrer dans son essence.
Patterson montre que cette dualité éclaire une foule de difficultés que Łukasiewicz avait considérées comme des incohérences. La validité des syllogismes modaux dépend de la lecture qu’on adopte : certains modes sont valides en lecture forte mais non en lecture faible, et inversement. La syllogistique modale aristotélicienne n’est pas un système formel inconsistant ; c’est un système ancré dans une métaphysique essentialiste où la distinction entre essence et accident détermine les règles d’inférence valides.
Cette interprétation a également l’intérêt de montrer comment les ''Premiers Analytiques'' préparent les ''Seconds Analytiques''. Les syllogismes scientifiques de la démonstration sont ''par excellence'' des syllogismes modaux à ''strong cop necessity'', où les termes sont liés par des connexions ''per se''. La logique modale n’est pas une curiosité périphérique chez Aristote : elle est l’instrument logique de sa théorie de la science.
====Syllogisme et déduction : une équivalence problématique====
Un point souvent débattu, sur lequel Harari et Crivelli ont apporté des éclairages utiles, concerne la prétention d’Aristote à identifier syllogisme et déduction. Aristote affirme, en ''Premiers Analytiques'' I, 23 (40b20), que tous les syllogismes se forment dans les trois figures, et il ajoute que toute déduction est en principe réductible à un syllogisme. Cette thèse, que Lear appelle « la thèse d’Aristote », est plus forte qu’il n’y paraît.
D’un côté, Aristote reconnaît certaines exceptions : les déductions hypothétiques (« si A alors B ; or A ; donc B ») et les raisonnements ''par l’absurde'' ne se ramènent pas à la forme syllogistique standard. D’un autre côté, il maintient que toute ''démonstration scientifique'' directe, dans la mesure où elle vise à établir une connexion essentielle entre des termes, peut être recoulée dans une forme syllogistique.
Comme le montre Harari, la logique syllogistique aristotélicienne n’est pas une logique des propositions au sens contemporain (où les prémisses peuvent être de structures variées), mais une logique des prédications. Elle suppose que toute proposition se laisse analyser en sujet-prédicat (« A appartient à B », « A n’appartient pas à B », etc.), et que la combinaison des termes via un moyen terme est l’opération fondamentale du raisonnement valide. C’est précisément cette restriction qui fait sa puissance et son intérêt, mais aussi ses limites par rapport aux logiques modernes plus expressives.
====Ce qu’il faut retenir====
Les ''Premiers Analytiques'' fournissent la théorie générale du syllogisme. Aristote en donne la définition technique (trois termes, deux prémisses, conclusion nécessaire), distingue trois figures (selon la position du moyen terme), identifie les modes valides à l’intérieur de chacune, et propose des techniques (conversion, ekthèse) pour ramener les figures imparfaites à la première, considérée comme parfaite parce qu’elle exprime directement le principe ''dictum de omni et nullo''. La syllogistique modale, lue avec Patterson, révèle une logique ancrée dans une métaphysique essentialiste. Aristote prétend identifier syllogisme et déduction, mais il reconnaît des inférences valides qui ne sont pas des syllogismes (déductions hypothétiques, raisonnements par l’absurde).
===Chapitre IV. ''Les Seconds Analytiques'' : la science démonstrative===
====Le projet des ''Seconds Analytiques'' et la définition de la science====
Les ''Seconds Analytiques'' (''Analytica posteriora'') prolongent les ''Premiers Analytiques'' mais opèrent un déplacement important. Là où les ''Premiers'' étudiaient le syllogisme dans sa forme générale, les ''Seconds'' s’attachent à une espèce particulière du syllogisme : le syllogisme démonstratif ou scientifique (''apodeixis''). C’est cette espèce qui produit la science, c’est-à-dire la connaissance véritable.
Aristote ouvre le traité, au chapitre 2 du livre I, par une définition triple de la science : « Nous estimons posséder la science d’une chose d’une manière absolue quand nous croyons que nous connaissons la cause par laquelle la chose est, que nous savons que cette cause est celle de la chose, et qu’en outre il n’est pas possible que la chose soit autre qu’elle n’est ».<ref>Aristote, ''Seconds Analytiques'' I, 2, 71b9-12.</ref>
Cette définition condense trois exigences. Premièrement, la science est connaissance ''par les causes''. Savoir qu’il pleut n’est pas avoir la science de la pluie ; savoir ''pourquoi'' il pleut, ''par quelle cause'', c’est avoir la science. Deuxièmement, cette connaissance doit être ''certaine'' : il faut savoir que la cause est ''bien'' la cause, et non se contenter d’opinions plausibles. Troisièmement, elle porte sur des nécessités : ce qui est connu scientifiquement « ne peut pas être autrement ». La science ne porte pas sur le contingent (qui peut être ou ne pas être), mais sur ce qui est nécessairement ce qu’il est.
Orna Harari soulève une question importante quant au sens du terme ''epistêmê''. La traduction traditionnelle par « science » ou « connaissance » a été contestée : certains commentateurs contemporains soutiennent que le sens d’''epistêmê'' chez Aristote serait plus proche de l’''understanding'' (compréhension) que de la ''knowledge'' (connaissance) au sens moderne, parce qu’Aristote serait moins préoccupé par le problème de la justification que par celui de la saisie des structures explicatives. Harari elle-même propose de distinguer deux types de compréhension chez Aristote : une compréhension perceptuelle, liée à l’expérience sensible, et une compréhension conceptuelle, qui saisit les essences universelles. La science aristotélicienne intègre ces deux dimensions : elle part de la perception pour aboutir à la saisie de structures essentielles.
====La démonstration : structure et conditions des prémisses====
La démonstration est, selon Aristote, le syllogisme qui produit la science. Mais tout syllogisme valide n’est pas une démonstration : il faut, pour cela, que les prémisses satisfassent à des exigences supplémentaires. Aristote en énumère six, dans le chapitre 2 du livre I (71b20-25). Les prémisses de la démonstration doivent être vraies (une démonstration ne peut produire la science si elle part du faux : ce serait une démonstration apparente, non réelle). Elles doivent être premières (''prôta'') et immédiates (''amesa'') : elles ne dérivent pas elles-mêmes d’une démonstration, et il n’y a pas de moyen terme entre leur sujet et leur prédicat. Ce sont les principes (''archai'') à partir desquels toute démonstration procède. Elles doivent être plus connues que la conclusion : la connaissance de la conclusion repose sur la connaissance des prémisses ; il faut donc que celles-ci soient mieux connues, faute de quoi nous expliquerions l’obscur par le plus obscur. Elles doivent être antérieures à la conclusion (antériorité non chronologique mais ontologique et explicative : les prémisses sont ce qui rend la conclusion vraie, ce qui la fonde). Elles doivent être causes de la conclusion (''aitia tou symperasmatos'') : la démonstration ne se contente pas de prouver que quelque chose est ; elle explique ''pourquoi'' c’est. Cette exigence, qui distingue la démonstration scientifique du simple syllogisme valide, est ce qu’Aristote oppose au « syllogisme du fait » (''syllogismos tou hoti'') : un syllogisme du fait peut prouver qu’un état de choses existe, mais s’il ne donne pas la cause, il n’est pas un syllogisme du ''pourquoi'' (''syllogismos tou dioti''), et il n’est pas démonstration. Elles doivent être enfin mieux connaissables par nature, même si elles peuvent être moins connues par nous. La science consiste à passer de ce qui nous est plus familier (les phénomènes sensibles, les conclusions immédiates) à ce qui est plus connaissable en soi (les principes universels, les essences).
Comme le montre David Bronstein, ces conditions sont liées entre elles : c’est parce que les prémisses sont causes de la conclusion qu’elles lui sont antérieures, et c’est parce qu’elles sont premières qu’elles sont mieux connaissables par nature.<ref>Bronstein, D., ''Aristotle on Knowledge and Learning: The Posterior Analytics'', Oxford, Oxford University Press, 2016.</ref>
====Le rôle du moyen terme : prouver le pourquoi====
Le moyen terme joue, dans la démonstration scientifique, un rôle qui dépasse celui qu’il a dans le syllogisme général. Aristote affirme, en ''Seconds Analytiques'' II, 2 (90a6) : « le moyen terme est la cause ». Cette identification a des implications importantes.
L’exemple classique qu’Aristote donne, dans le livre II, est celui de l’éclipse de la lune. Si l’on cherche à ''démontrer'' que la lune subit des éclipses, on construit un syllogisme : tout ce qui est privé de lumière par interposition de la Terre subit une éclipse ; la lune est privée de lumière par interposition de la Terre ; donc la lune subit des éclipses.
Le moyen terme (« être privé de lumière par interposition de la Terre ») n’est pas seulement un ''lien logique'' qui permet de relier le sujet (la lune) au prédicat (subir une éclipse). Il est la cause physique réelle de l’éclipse. C’est l’interposition de la Terre qui ''fait'' qu’il y a éclipse ; le syllogisme, pour être démonstratif, doit identifier cette cause et la mettre dans le moyen terme.
Pellegrin a souligné, dans son étude des ''Seconds Analytiques'', que connaître scientifiquement les choses, c’est les connaître sous la forme ou dans l’ordre où elles se trouvent dans la démonstration. La démonstration n’est pas une procédure heuristique pour découvrir des explications nouvelles ; elle est plutôt la forme canonique du savoir scientifique, où les relations causales sont déployées de la manière la plus claire et la plus explicite.
Aristote distingue, en ''Seconds Analytiques'' II, 11, quatre types de causes correspondant aux quatre causes de la ''Physique'' (II, 3) : la cause matérielle, la cause formelle, la cause efficiente (ou motrice) et la cause finale. La démonstration scientifique peut faire intervenir l’une ou l’autre de ces causes selon la nature de l’explication recherchée. Pellegrin a consacré un article remarqué à l’analyse de ce chapitre, soulignant les difficultés particulières que pose la démonstration de la cause finale, où le syllogisme doit faire intervenir un ''en vue de quoi'' qui ne se laisse pas réduire à un simple lien logique.<ref>Pellegrin, P., « Causal Explanation and Demonstration in ''Posterior Analytics'' II 11 », dans A. P. Mesquita et R. Santos (dir.), ''New Essays on Aristotle’s Organon'', Routledge, 2024, chap. 7.</ref>
====Les principes : axiomes, hypothèses et définitions====
Toute démonstration présuppose, comme on l’a vu, des principes (''archai'') qui ne peuvent être eux-mêmes démontrés. Aristote rejette à la fois la possibilité d’une régression infinie (qui ferait de chaque prémisse l’objet d’une démonstration ultérieure, sans terme) et celle d’une démonstration circulaire (où A serait démontré par B et B par A). Il faut donc admettre l’existence de principes premiers connus ''sans'' démonstration.
Aristote distingue trois catégories de principes.
Les axiomes (''axiômata'') ou principes communs sont des principes qui s’appliquent à toutes les sciences. Le plus fondamental est le principe de non-contradiction (« il est impossible que le même attribut appartienne et n’appartienne pas en même temps au même sujet et sous le même rapport », ''Métaphysique'' Γ, 3, 1005b19-20). Vient ensuite le principe du tiers exclu (« entre deux contradictoires, il n’y a pas de moyen terme »). Aristote considère ces axiomes comme des principes que toute pensée rationnelle présuppose nécessairement : les contester reviendrait à contester la possibilité même de penser et de parler. Il défend le principe de non-contradiction, dans le livre Γ de la ''Métaphysique'', par une ''réfutation dialectique'' de ses adversaires : dès lors que celui qui le conteste « dit quelque chose de déterminé », il présuppose le principe qu’il prétend nier.
Les hypothèses (''hypotheseis'') et les thèses (''theseis'') sont des principes propres à chaque science. Aristote distingue les hypothèses, qui affirment l’existence de certaines entités (les points en géométrie, les unités en arithmétique), et les thèses, qui prennent position sans nécessairement affirmer une existence. En géométrie, l’hypothèse selon laquelle « il existe des points » est un principe que la science ne démontre pas, mais qu’elle pose comme condition de possibilité de ses démonstrations.
Les définitions (''horoi'') sont des énoncés qui disent ce qu’est une chose, son essence (''ti esti''). Aristote consacre une grande partie du livre II des ''Seconds Analytiques'' à examiner si l’essence peut être démontrée. Il conclut négativement : la définition n’est pas une démonstration, parce qu’elle ne procède pas par syllogisme et qu’elle pose plutôt qu’elle ne prouve. Toutefois, certaines définitions peuvent ''découler'' de démonstrations : c’est le cas des définitions causales. La définition du tonnerre, par exemple (« bruit dans les nuages causé par l’extinction du feu »), peut être obtenue à partir d’une démonstration qui établit la cause (l’extinction du feu) du phénomène (le bruit dans les nuages).
====L’unité et la diversité des sciences====
Une thèse importante des ''Seconds Analytiques'' est l’interdiction du passage d’un genre à un autre (''metabasis eis allo genos''). Chaque science se définit par son genre propre (le genre des objets dont elle traite), et elle ne peut emprunter ses principes ou ses démonstrations à une autre science. La géométrie ne peut démontrer une vérité d’arithmétique ; la physique ne peut démontrer une vérité de biologie en utilisant des principes physiques.
Cette règle, expliquée en ''Seconds Analytiques'' I, 7, garantit l’autonomie des sciences. Chaque science a ses propres principes, son propre objet, ses propres méthodes adaptées à la nature de son objet. Comme l’écrira Aristote dans l’''Éthique à Nicomaque'' (I, 3) : il faut chercher dans chaque domaine la précision que cet objet permet ; il serait absurde d’exiger d’un mathématicien la rigueur d’un orateur, et tout aussi absurde d’exiger d’un orateur la précision du mathématicien.
Aristote admet cependant trois exceptions à cette règle d’autonomie. La première est la subordination d’une science à une autre : l’optique est subordonnée à la géométrie, en ce qu’elle utilise les théorèmes géométriques mais les applique à un objet particulier (la lumière). Il ne s’agit pas d’un transfert illicite, parce que la science subordonnée prend ses principes d’une science supérieure dont elle dépend. La deuxième est le partage des axiomes communs : le principe de non-contradiction n’est pas le monopole d’une science particulière, il est utilisé par toutes. Aristote précise toutefois que chaque science l’utilise « dans la mesure » où son objet l’exige. La troisième est l’existence des sciences mixtes (''metaxu'') : l’astronomie mathématique, la mécanique, l’harmonique sont des sciences qui utilisent les mathématiques pour étudier des phénomènes physiques. Ce sont des cas particuliers où la transition d’un genre à un autre est légitime parce que les phénomènes étudiés ont une structure mathématique intrinsèque.
Cette théorie de l’unité-diversité des sciences fonde l’organisation aristotélicienne du savoir. Chaque science possède une méthode adaptée à son objet : les mathématiques procèdent par démonstration nécessaire à partir d’axiomes ; la physique tient compte du changement et des causes naturelles ; la biologie observe les régularités qui se produisent « dans la plupart des cas » (''hôs epi to poly''), formule importante parce qu’elle reconnaît que le vivant n’obéit pas à une nécessité aussi rigoureuse que la matière inerte ; l’éthique et la politique se contentent de vérités qui valent « pour la plupart », parce que leur objet (l’action humaine) est essentiellement contingent.
====La connaissance des principes : induction et intellection====
Si toute science procède de principes indémontrables, comment pouvons-nous connaître ces principes eux-mêmes ? Cette question, posée dès le chapitre 3 du livre I, reçoit sa réponse dans le dernier chapitre des ''Seconds Analytiques'' (II, 19), l’un des textes les plus discutés de l’aristotélisme.
La réponse d’Aristote articule plusieurs étapes. La connaissance des principes ne peut pas être innée (comme le voudrait Platon avec sa théorie de la réminiscence), parce qu’il serait absurde que nous possédions une connaissance plus exacte que la science et que nous l’ignorions. Mais elle ne peut pas non plus naître de rien, parce que toute connaissance présuppose une certaine connaissance préalable.
La solution est qu’il existe en nous une ''capacité'' (''dynamis'') de connaître les principes, capacité qui n’est pas elle-même une connaissance déterminée mais qui se déploie progressivement à partir de la sensation. Aristote décrit ce processus en plusieurs étapes. La sensation (''aisthêsis'') est la base : elle saisit les choses singulières. La sensation laisse des traces qui constituent la mémoire (''mnêmê'') : nous nous souvenons des choses perçues. L’accumulation et l’organisation des souvenirs produisent l’expérience (''empeiria'') : nous reconnaissons des régularités, des cas semblables. À partir de l’expérience se forme l’universel (''katholou'') qui « se repose dans l’âme » et constitue l’art (''technê'') ou la science (''epistêmê'').<ref>Aristote, ''Seconds Analytiques'' II, 19, 100a3-9.</ref>
Aristote compare ce processus, dans une image célèbre, à une armée en déroute : « comme dans une bataille, quand une déroute se produit, un soldat fait halte, puis un autre, puis un autre, jusqu’à ce que se reconstitue le rang originel ». De même, à partir d’une multitude d’impressions sensorielles d’abord confuses, l’âme construit progressivement la saisie de l’universel.
Le terme qu’Aristote emploie pour ce processus est ''epagôgê'', qu’on traduit traditionnellement par induction. Mais Orna Harari a montré, dans une analyse minutieuse, que ce terme a chez Aristote (au moins) deux sens distincts.
Dans un premier sens, l’induction argumentative, ''epagôgê'' désigne un type d’inférence qui établit (ou justifie) une proposition universelle à partir de cas particuliers. C’est l’usage qu’on trouve dans les ''Topiques'' et dans les ''Premiers Analytiques'' II, 23. Cette induction est une ''forme de raisonnement'' qui peut être confrontée au syllogisme.
Dans un second sens, l’induction cognitive ou perceptuelle, ''epagôgê'' désigne un acte cognitif par lequel l’esprit reconnaît dans le particulier l’aspect universel. C’est cet usage qu’on trouve, selon Harari, en ''Seconds Analytiques'' II, 19 et I, 1. Quand Aristote dit que nous saisissons les principes par induction, il ne veut pas dire que nous les ''prouvons'' à partir de cas particuliers ; il veut dire que la perception elle-même, en saisissant un cas particulier, nous ouvre l’accès à l’universel qui s’y manifeste.
La saisie ultime des principes premiers relève d’une faculté qu’Aristote nomme intellect (''nous'') ou intuition intellectuelle. C’est, écrit-il en ''Seconds Analytiques'' II, 19 (100b12), « la disposition par laquelle nous connaissons les principes ». Le ''nous'' est, selon Aristote, supérieur même à la science démonstrative, parce qu’il saisit ce qui rend la science possible. Comme le formule l’''Éthique à Nicomaque'' VI, 6 : « l’intellect a pour objet les principes, dont aucune définition ne peut rendre compte ».
Cette doctrine soulève des difficultés notoires que les commentateurs ont longuement débattues. Comment l’intellect peut-il être à la fois une ''capacité innée'' (en puissance, depuis la naissance) et le ''résultat d’un apprentissage'' (en acte, à partir de l’expérience) ? Comment articuler le rôle de l’induction (qui est un processus discursif) et celui de l’intellect (qui est, selon l’''Éthique à Nicomaque'', ''non discursif'') ? Harari propose une articulation : l’induction est la ''procédure'' qui prépare la saisie ; l’intellect est l’''état cognitif'' qui résulte de cette préparation et qui ''saisit'' effectivement les principes. Les deux sont nécessaires : l’induction sans intellect est aveugle ; l’intellect sans induction n’a pas de matière à saisir.
====Le statut épistémologique des ''Seconds Analytiques'' : démonstration ou méthode ?====
Une question importante, sur laquelle Pellegrin et d’autres commentateurs (Brunschwig, Bronstein) ont insisté, concerne le statut même de la démonstration aristotélicienne. La démonstration est-elle une méthode de découverte, un instrument heuristique pour trouver des vérités nouvelles ? Ou est-elle plutôt la forme canonique du savoir établi, c’est-à-dire la manière dont une science déjà constituée s’expose et se transmet ?
La lecture traditionnelle, dominante depuis l’Antiquité jusqu’à la Renaissance, voyait dans la démonstration une méthode de découverte. La science moderne, à partir de Bacon et de Descartes, a critiqué cette lecture : la démonstration syllogistique, disait Bacon, ne fait que tirer ce qu’on a déjà mis dans les prémisses ; elle ne produit pas de connaissance nouvelle.
La lecture contemporaine, esquissée par Pellegrin et défendue par Bronstein, propose une autre interprétation. La démonstration n’est pas une méthode de ''découverte'', mais la ''forme du savoir scientifique constitué''. Une fois qu’une science a identifié ses principes (par induction et intellection) et a établi les connexions causales entre les phénomènes qu’elle étudie, elle peut ''exposer'' ce savoir sous la forme d’une chaîne de syllogismes démonstratifs. La démonstration est l’organisation rationnelle d’un savoir, son architecture logique, et non pas la procédure par laquelle ce savoir a été acquis.
Cette interprétation a deux mérites. D’abord, elle dissout l’objection baconienne-cartésienne : si la démonstration n’est pas une méthode de découverte, elle ne peut pas être critiquée pour ne pas en être une. Ensuite, elle restitue l’unité du projet aristotélicien : les ''Topiques'' (méthode dialectique de découverte des prémisses), les ''Premiers Analytiques'' (forme générale du syllogisme) et les ''Seconds Analytiques'' (forme spécifique du syllogisme scientifique) ne sont pas des projets disjoints, mais les pièces d’un dispositif où la dialectique fournit les matériaux que la science organise sous forme démonstrative.
====Ce qu’il faut retenir====
Les ''Seconds Analytiques'' développent la théorie de la science démonstrative. La science est connaissance par les causes, certaine et nécessaire ; la démonstration est le syllogisme qui la produit, à six conditions ; le moyen terme est la cause. Les principes (axiomes, hypothèses, définitions) ne sont pas démontrables, et chaque science a son genre propre (interdiction de la ''metabasis''). La connaissance des principes procède par induction sensorielle et culmine dans l’intellect (''nous''). La démonstration s’entend mieux, selon une lecture contemporaine, comme forme du savoir constitué que comme méthode heuristique de découverte.
===Chapitre V. ''Les Topiques'' : l’art de la dialectique===
====La dialectique : définition et statut====
Les ''Topiques'' constituent, selon l’hypothèse défendue notamment par Brunschwig, le traité chronologiquement parmi les plus anciens de l’''Organon'' (bien que l’arrangement andronicien l’ait relégué à la fin). Ils sont consacrés à l’art de la dialectique (''dialektikê''), c’est-à-dire à la pratique de la discussion réglée entre deux interlocuteurs.
Aristote distingue dès le premier chapitre du livre I trois types de raisonnement selon la nature de leurs prémisses. Le syllogisme démonstratif part de prémisses ''vraies et premières'', ou de prémisses qui sont elles-mêmes connues par des prémisses vraies et premières : c’est l’objet des ''Seconds Analytiques''. Le syllogisme dialectique part de prémisses qui sont des opinions valables (''endoxa''), c’est-à-dire « des opinions qui sont admises par tous, ou par la plupart, ou par les sages, et parmi les sages, par tous, ou par la plupart, ou par les plus connus et les plus reconnus ».<ref>Aristote, ''Topiques'' I, 1, 100a29-b23.</ref> Le syllogisme éristique ou sophistique, enfin, part de prémisses qui ''paraissent'' être des opinions valables sans l’être réellement : c’est l’objet des ''Réfutations sophistiques''.
La distinction entre démonstration et dialectique n’est pas une distinction de ''forme'' (les deux sont des syllogismes au sens des ''Premiers Analytiques'') mais de ''matière'' : ce qui les distingue, c’est la nature des prémisses qu’elles utilisent. Cette différence a néanmoins des conséquences importantes. La démonstration vise la connaissance scientifique ; la dialectique vise une argumentation rationnelle dans les domaines où la certitude scientifique n’est pas accessible, c’est-à-dire la grande majorité des domaines de la pensée et de la vie humaine.
====La structure du débat dialectique====
Le débat dialectique aristotélicien possède une structure formellement très précise. Comme l’a montré Brunschwig dans son introduction à l’édition des ''Topiques'' (Belles Lettres), il met en présence deux protagonistes : le questionneur et le répondant.
Le répondant (en grec, ''apokrinomenos'') commence par défendre une thèse, c’est-à-dire une proposition à laquelle il s’engage. Cette thèse peut être affirmative ou négative ; le répondant est libre de la choisir. Une fois la thèse posée, son rôle consiste à la ''défendre'' contre les attaques du questionneur, en accordant ou en refusant les prémisses que celui-ci lui propose.
Le questionneur (en grec, ''erôtôn'') a la tâche la plus lourde : il doit, écrit Brunschwig, « construire une argumentation formellement contraignante, ayant pour prémisses des propositions auxquelles le répondant ne puisse refuser son assentiment, et pour conclusion la proposition contradictoire de celle que soutient le répondant ».<ref>Brunschwig, J., introduction à Aristote, ''Topiques'' (livres I-IV), Les Belles Lettres, 1967, rééd. 2007, p. XXXVIII.</ref> Autrement dit, le questionneur doit ''réfuter'' la thèse du répondant en tirant, à partir de prémisses que le répondant ne peut refuser, la contradictoire de cette thèse.
Cette structure n’est pas un simple jeu : elle est le modèle aristotélicien du débat rationnel. Toute discussion philosophique sérieuse, toute confrontation intellectuelle où l’on cherche à éprouver la solidité d’une opinion, peut être analysée selon ce modèle. Et la fonction des ''Topiques'' est de fournir au questionneur (et secondairement au répondant) un manuel pratique pour mener ce type de discussion avec efficacité.
====Les quatre prédicables====
Avant de présenter les ''topoi'' eux-mêmes, Aristote introduit, au livre I, une distinction importante : celle des quatre prédicables. Quand on attribue un prédicat à un sujet, on peut le faire de quatre manières.
Par accident (''sumbebêkos''), le prédicat n’est ni essentiel au sujet ni de même extension que lui : « Socrate est blanc » ; « blanc » est un accident de Socrate, qui peut être remplacé par un autre attribut sans que Socrate cesse d’être Socrate. Par genre (''genos''), le prédicat est essentiel au sujet mais d’une extension plus large que lui : « Socrate est animal » ; « animal » est le genre auquel appartient l’espèce « homme », et Socrate, en tant qu’homme, hérite de tout ce qui appartient à l’animal. Par propre (''idion''), le prédicat n’est pas essentiel au sujet mais lui est coextensif (il s’applique à tout le sujet et seulement à lui) : « L’homme est rieur » ; être rieur n’entre pas dans la définition de l’homme, mais tout homme est rieur et tout rieur est homme. Par définition (''horos''), enfin, le prédicat est à la fois essentiel et coextensif au sujet : « L’homme est animal raisonnable » ; la définition exprime l’essence de manière exhaustive, en composant le genre et la différence spécifique.
Cette classification fournit un cadre pour organiser les ''topoi''. Les livres II et III des ''Topiques'' sont consacrés aux topoi de l’accident, le livre IV aux topoi du genre, le livre V à ceux du propre, les livres VI et VII à ceux de la définition. Pour chaque type de prédication, on dispose d’arguments qui permettent soit de l’établir soit de la réfuter. Pour démontrer qu’un prédicat est ''accidentel'' à un sujet, par exemple, on n’utilisera pas les mêmes outils que pour démontrer qu’il en constitue le ''genre'' : la stratégie argumentative dépend du type de relation prédicative qu’on cherche à établir ou à contester.
Cette classification aristotélicienne en quatre prédicables sera reprise par Porphyre dans son ''Isagoge'' (introduction aux ''Catégories''), qui en proposera une version à cinq prédicables (genre, espèce, différence, propre, accident). La version à cinq prédicables, qu’on appelle souvent les « cinq voix de Porphyre », a dominé la tradition logique médiévale ; mais le découpage proprement aristotélicien est bien celui à quatre prédicables.
====Les ''topoi'' : qu’est-ce qu’un lieu commun ?====
Le mot grec ''topos'' signifie « lieu », et l’''Aristoteles-Handbuch'' explique l’image : comme un général doit identifier le « lieu » à partir duquel attaquer son adversaire, le dialecticien doit identifier les ''lieux'' d’argumentation à partir desquels il pourra construire ses prémisses. Aristote ne donne nulle part une définition précise du ''topos'', mais on peut le caractériser comme un schéma général d’argumentation sous lequel tombent plusieurs arguments concrets.
Un exemple permet de saisir : le topos du plus et du moins (II, 10). Si ce qui est plus susceptible d’appartenir à quelque chose ne lui appartient pas, ce qui l’est moins ne lui appartiendra pas non plus. À partir de ce schéma général, on peut construire une multitude d’arguments concrets : si même la mer ne te paraît pas froide, comment l’eau de la rivière le serait-elle ? si même Socrate, qui est sage, ne sait pas la solution, comment quelqu’un de moins sage la saurait-il ? Le ''topos'' n’est pas un argument particulier, c’est une matrice qui permet d’engendrer des arguments adaptés à chaque cas.
Aristote présente, dans les ''Topiques'', plusieurs centaines de ''topoi''. Le projet est moins celui d’une théorie systématique que celui d’un manuel pratique : on y trouve des conseils stratégiques (livre VIII) sur la manière de poser les questions, de cacher ses intentions, d’amener progressivement le répondant à accorder les prémisses dont on a besoin.
====Les trois utilités de la dialectique====
Aristote précise, au chapitre 2 du livre I, à quoi sert la dialectique. Il distingue trois utilités. La première est l’entraînement intellectuel (''gymnasia'') : le débat dialectique est un exercice qui forme l’esprit, comme le sport forme le corps ; il habitue à formuler clairement ses idées, à anticiper les objections, à raisonner rapidement. La deuxième concerne les rencontres avec autrui : pour discuter efficacement avec ceux qui n’ont pas reçu de formation philosophique (« les Plusieurs »), il faut pouvoir argumenter à partir de leurs propres opinions, c’est-à-dire à partir des ''endoxa''. La dialectique fournit les outils pour ce type de discussion. La troisième utilité concerne les sciences philosophiques elles-mêmes ; c’est la plus importante et la plus subtile. Aristote affirme que la dialectique permet d’examiner ''critiquement'' (''peirastikê'') les principes des sciences, en confrontant les opinions opposées. Elle permet aussi de parcourir les difficultés (''aporiai'') et de dégager progressivement les principes véritables. Cette méthode est mise en œuvre par Aristote lui-même dans la quasi-totalité de ses traités : il commence presque toujours par exposer les opinions de ses prédécesseurs (les ''endoxa''), il en montre les insuffisances et les contradictions (les ''aporiai''), et il dégage progressivement sa propre position en cherchant à ''préserver'' ce qui était vrai dans les opinions reçues tout en évitant leurs erreurs.
Cette troisième utilité a un poids philosophique particulier. Elle implique que la dialectique n’est pas seulement un instrument de discussion publique, mais un instrument de recherche philosophique. Elle permet d’aborder les principes que la science démonstrative ne peut pas elle-même fonder : comme l’écrit Aristote en ''Topiques'' I, 2, les principes des sciences ne peuvent être tirés des sciences elles-mêmes (puisque les principes sont premiers dans chaque science), mais ce sont seulement les ''endoxa'' qui peuvent y conduire. La dialectique, par son examen critique des opinions reçues, fournit un chemin vers les principes ; chemin qui ne remplace pas l’intuition intellectuelle (''nous'') mais qui la prépare et l’éclaire.
L’''Aristoteles-Handbuch'' formule cette idée de la manière suivante : l’argumentation à partir des ''endoxa'', exercée dans la dialectique, ouvre la seule voie vers la consolidation argumentative des principes, quand bien même ceux-ci auraient été d’abord saisis par voie inductive et noétique. La dialectique aristotélicienne n’est pas une simple sous-discipline de la logique : elle est un mode d’accès à la vérité qui complète la démonstration par le bas (en approchant les principes) et la science par le haut (en discutant leurs présupposés).
====Ce qu’il faut retenir====
Les ''Topiques'' codifient l’art du débat dialectique entre questionneur et répondant. Le syllogisme dialectique part de prémisses simplement probables (''endoxa'') et non de prémisses vraies. Aristote distingue quatre prédicables (accident, genre, propre, définition) qui organisent les centaines de ''topoi'' du traité. La dialectique a trois utilités : entraînement intellectuel, discussion avec autrui, recherche philosophique. Cette dernière utilité est philosophiquement importante : elle permet d’approcher les principes que la science démonstrative présuppose sans pouvoir les fonder.
===Chapitre VI. ''Les Réfutations sophistiques'' : les paralogismes et leur démasquage===
====Le projet des ''Réfutations sophistiques''====
Les ''Réfutations sophistiques'' (''Peri sophistikôn elenchôn'') sont parfois considérées comme un appendice (ou même comme un neuvième livre) des ''Topiques''. Leur projet est complémentaire : alors que les ''Topiques'' enseignent à construire des syllogismes dialectiques ''valides'', les ''Réfutations sophistiques'' étudient les syllogismes qui ''paraissent'' valides sans l’être. Aristote y entreprend une typologie systématique des paralogismes (raisonnements fallacieux) pour permettre au dialecticien de les détecter et de les démasquer.
L’''Aristoteles-Handbuch'' précise le projet : il s’agit pour Aristote de fournir une analyse critique de la pratique argumentative des sophistes. Le sophiste est, pour Aristote (à la suite de Platon), celui qui « se donne l’apparence de la sagesse sans l’être réellement » et qui « gagne son argent avec l’apparence de la sagesse ». Pour produire cette apparence, le sophiste utilise des paralogismes, c’est-à-dire des raisonnements qui ressemblent à des syllogismes valides sans en être réellement.
====Les six sophismes liés au langage====
Aristote distingue treize types de sophismes, qu’il classe en deux catégories. Six dépendent du langage (''para tên lexin''), sept en sont indépendants.<ref>Aristote, ''Réfutations sophistiques'' 4, 165b23-166b19. Voir Dorion, L.-A., ''Les Réfutations Sophistiques d’Aristote'', Paris, Vrin, 1995.</ref>
Les six sophismes liés au langage sont d’abord l’''homonymie'', qui exploite l’ambiguïté d’un mot ayant plusieurs sens : « Le chien aboie ; or la canicule est un chien (en grec, ''kuôn'' signifie à la fois le chien et la constellation du Chien) ; donc la canicule aboie. » Vient ensuite l’''amphibologie'', qui repose sur l’ambiguïté syntaxique d’une phrase : « Je veux que vous capturiez les ennemis » peut signifier « je veux que ce soit vous qui capturiez les ennemis » ou « je veux que les ennemis soient capturés par vous ». Le sophisme de la ''composition'' consiste à confondre un sens où plusieurs termes sont pris ensemble et un sens où ils sont pris séparément. L’exemple d’Aristote : « Il est possible de se tenir debout pendant qu’on est assis » peut signifier soit qu’il est possible d’être à la fois assis et debout au même moment (sens composé, faux), soit qu’il est possible, pour quelqu’un actuellement assis, de se tenir debout à un autre moment (sens divisé, vrai). Le sophisme de la ''division'' procède à la confusion inverse, en prenant séparément ce qui doit être pris ensemble. Le sophisme de l’''accentuation'' joue sur une ambiguïté qui repose sur la prononciation, l’accent ou la quantité des syllabes. Enfin, le sophisme de la ''forme de l’expression'' confond des expressions qui ont la même forme grammaticale mais relèvent de catégories différentes : on peut par exemple traiter « courir » comme s’il désignait une qualité quand il désigne en réalité une action.
====Les sept sophismes hors du langage====
Les sept sophismes qui ne dépendent pas du langage sont les suivants.
Le sophisme de l’''accident'' confond ce qui est attribué à un sujet de manière essentielle et ce qui ne lui est attribué que de manière accidentelle. L’exemple classique d’Aristote : « Coriskos est différent de Socrate ; or Socrate est un homme ; donc Coriskos est différent d’un homme. » Le paralogisme consiste à transférer la différence entre Coriskos et Socrate (en tant qu’individus) à la relation entre Coriskos et l’humanité, comme si le fait que Socrate soit un homme rendait toute différence d’avec Socrate une différence d’avec l’humanité.
Le ''passage du qualifié à l’absolu'' (''secundum quid'') confond ce qui est vrai sous un certain rapport et ce qui est vrai absolument : « L’Éthiopien est blanc des dents ; donc l’Éthiopien est blanc. »
L’''ignorance de la réfutation'' (''ignoratio elenchi'') consiste à produire une réfutation qui ne réfute pas vraiment la thèse adverse, parce qu’elle ne porte pas exactement sur la même chose, ou ne respecte pas les conditions de la véritable contradiction.
La ''pétition de principe'' (''petitio principii'') suppose dans les prémisses ce qu’on prétend démontrer dans la conclusion.
Le ''faux enchaînement'' consiste à prendre pour cause ce qui n’est pas la cause. C’est le sophisme du ''non causa pro causa'', particulièrement répandu dans les ''reductio ad impossibile'' mal conduits.
La ''prise de l’antécédent comme conséquent'' infère « si A alors B ; or B ; donc A » (qui est formellement invalide). L’''Aristoteles-Handbuch'' en donne un exemple éclairant : si l’interlocuteur a admis que la terre est mouillée, le sophiste en conclut faussement qu’il a plu ; il a tacitement renversé la véritable relation de conséquence (« s’il a plu, la terre est mouillée ») en la pseudo-relation (« si la terre est mouillée, il a plu »).
La ''réunion de plusieurs questions en une'', enfin, consiste à poser une question complexe (« Avez-vous cessé de battre votre femme ? ») où une réponse unique implique des concessions sur plusieurs points distincts.
====La réduction à l’''ignoratio elenchi''====
Un point important, souvent négligé, est qu’Aristote affirme, au chapitre 6 des ''Réfutations'', que tous les treize types de sophismes peuvent être ramenés à un seul : l’ignorance de la réfutation (''ignoratio elenchi''). Pour chacune des treize espèces, la cause de la tromperie peut être analysée comme une méconnaissance de ce qu’est une véritable réfutation.
Une réfutation authentique exige que le syllogisme conclue à la ''contradictoire exacte'' de la thèse adverse, c’est-à-dire qu’il porte sur le même sujet, sous le même rapport, dans le même sens des termes, etc. Les sophismes manquent toujours, d’une manière ou d’une autre, à l’une de ces conditions : ils produisent une apparente contradiction qui n’est pas une véritable contradiction. C’est pourquoi la définition rigoureuse de la contradiction (que le ''De interpretatione'' avait déjà élaborée) est la clef de la détection de tous les paralogismes.
====Logique et défense de la rationalité====
Au-delà de son utilité technique, l’étude des sophismes a une portée philosophique propre. Elle implique qu’il existe des règles objectives du raisonnement correct, indépendantes de l’habileté rhétorique de celui qui argumente. Cette thèse a été souvent lue, dans la tradition interprétative, comme une réponse au relativisme attribué aux sophistes (relativisme dont Protagoras est le représentant emblématique).
Une partie de la recherche contemporaine nuance cependant cette lecture. Comme l’a montré L.-A. Dorion dans son étude sur la dialectique aristotélicienne, la « réponse aux sophistes » n’est pas un combat frontal contre des adversaires identifiés, mais une délimitation du domaine de la science par rapport à celui de l’argumentation persuasive. Aristote ne prétend pas réfuter le sophiste ; il prétend établir les conditions minimales pour qu’un discours rationnel soit possible. Comme dans la défense du principe de non-contradiction au livre Γ de la ''Métaphysique'', il s’agit moins de démontrer une thèse que de montrer que toute pensée présuppose certains principes faute de quoi elle s’effondre dans l’inintelligibilité.
C’est en ce sens que les ''Réfutations sophistiques'' ne sont pas un appendice mineur, mais une pièce nécessaire de l’''Organon'' : elles défendent la rationalité elle-même contre ses propres dégradations possibles. La logique aristotélicienne n’est pas seulement une théorie du raisonnement valide ; elle est aussi une éthique du raisonnement, qui distingue la recherche honnête de la vérité de la manipulation rhétorique des esprits.
====Ce qu’il faut retenir====
Les ''Réfutations sophistiques'' classent treize types de paralogismes (six liés au langage, sept indépendants du langage) et les ramènent tous à un seul, l’ignorance de la réfutation. Le traité défend les conditions minimales du discours rationnel et complète, par leur démasquage, la théorie du raisonnement valide exposée dans les autres traités de l’''Organon''.
===Conclusion. Postérité et lectures contemporaines de l’''Organon''===
====Continuités et transformations====
L’''Organon'' a fourni, pendant deux millénaires, le modèle dominant de la rationalité occidentale. Les ''Éléments'' d’Euclide, avec leur méthode axiomatique-déductive, ont été lus dans la tradition comme un exemple privilégié d’organisation déductive du savoir, en consonance avec l’idéal aristotélicien de science (sans qu’il faille pour autant supposer qu’Euclide ait composé son ouvrage en application directe du programme aristotélicien). La théologie scolastique médiévale, des grands commentateurs arabes (Al-Farabi, Avicenne, Averroès) à Thomas d’Aquin, a fait du syllogisme et de la démonstration les instruments fondamentaux de la pensée rationnelle. Les universités européennes, jusqu’au XVII{{e}} siècle, ont enseigné la logique sur la base des traités aristotéliciens.
La révolution scientifique moderne a ébranlé cet édifice. Bacon, dans le ''Novum Organum'' (1620, dont le titre même est un défi à Aristote), dénonce la stérilité de la logique syllogistique : elle ne fait que tirer ce qu’on a déjà mis dans les prémisses, elle ne produit pas de connaissance nouvelle. Descartes, dans le ''Discours de la méthode'', reproche au syllogisme de servir « plutôt à expliquer à autrui les choses qu’on sait, ou même à parler sans jugement de celles qu’on ignore, qu’à les apprendre ». La science moderne, avec son recours à l’expérimentation, à l’hypothèse provisoire, à la méthode hypothético-déductive, semble s’écarter résolument du modèle aristotélicien.
Cette rupture, longtemps présentée comme totale, est aujourd’hui nuancée par la recherche contemporaine. Comme le rappelle Pellegrin, la transition vers la science moderne combine continuités, relectures et oppositions plutôt qu’une opposition unilatérale. Les scolastiques tardifs (Zabarella, Pacius) avaient déjà élaboré, à l’intérieur du cadre aristotélicien, des distinctions méthodologiques (entre démonstration ''quia'' et démonstration ''propter quid'', entre méthode résolutive et méthode compositive) qui annoncent les analyses modernes.
====Les apports durables de la logique aristotélicienne====
Quelles que soient les critiques adressées à la logique aristotélicienne, son apport historique reste considérable.
Premièrement, Aristote a établi pour la première fois les règles de la déduction valide. Il a distingué clairement la ''forme'' du raisonnement (qui détermine sa validité) de sa ''matière'' (qui détermine la vérité de ses prémisses). Cette distinction, qui paraît aujourd’hui évidente, a constitué un acquis durable de la philosophie.
Deuxièmement, Aristote a montré la nécessité des principes premiers. Toute chaîne de justification doit s’arrêter quelque part, faute de quoi elle régresse à l’infini ou se mord la queue. Cette analyse du « trilemme d’Agrippa » avant l’heure est l’une des contributions les plus profondes des ''Seconds Analytiques'' à la théorie de la connaissance.
Troisièmement, sa conception de l’explication scientifique comme connaissance des causes (''hoti'' contre ''dioti'') continue de nourrir la réflexion contemporaine en philosophie des sciences. Les analyses contemporaines de l’explication scientifique (Hempel, Salmon, Woodward) peuvent être mises en dialogue avec les distinctions aristotéliciennes.
Quatrièmement, sa logique modale, longtemps négligée, a connu un renouveau avec le développement des logiques modales contemporaines (Kripke, Hintikka). La distinction entre modalité ''de dicto'' et ''de re'', déjà esquissée chez Aristote selon Patterson, est au cœur des débats actuels en métaphysique modale.
Cinquièmement, sa réflexion sur les futurs contingents a inspiré toute une famille de logiques non classiques (Łukasiewicz, Prior, logiques temporelles) qui formalisent l’idée d’une suspension de la bivalence pour les énoncés sur l’avenir.
====Aristote dans la philosophie analytique contemporaine====
La philosophie analytique du XX{{e}} siècle, après une longue phase de scepticisme à l’égard de la logique aristotélicienne (Russell, dans ses premiers travaux, jugeait la syllogistique aristotélicienne sans intérêt logique réel), a redécouvert la richesse de l’''Organon''. Les travaux de Łukasiewicz, Patzig, Lear, Patterson, Crivelli, Malink, Bronstein, Harari ont rendu à la logique aristotélicienne sa profondeur conceptuelle.
Plusieurs lignes de recherche méritent d’être signalées. La première concerne les rapports entre logique et métaphysique chez Aristote. Comme le montrent Patterson pour la logique modale et Harari pour la théorie de la démonstration, la logique aristotélicienne n’est pas une logique formelle abstraite, mais une logique ancrée dans une métaphysique des essences, des substances et des causes. Cette articulation, longtemps tenue pour une faiblesse, apparaît aujourd’hui comme une originalité féconde, en consonance avec les essentialismes contemporains (Kripke, Putnam, Fine).
La deuxième concerne les rapports entre dialectique et science. Pellegrin, Brunschwig, Berti, Crubellier ont montré que la dialectique aristotélicienne n’est pas une simple discipline subordonnée à la science, mais un mode d’accès à la vérité qui complète la démonstration et qui prépare la saisie des principes. Cette réhabilitation de la dialectique a des résonances avec les approches contemporaines de l’épistémologie, qui reconnaissent le rôle des présuppositions, des controverses et de la discussion dans l’élaboration des connaissances.
La troisième concerne les rapports entre langage, pensée et réalité. Le triangle sémiotique du ''De interpretatione'', la doctrine des catégories comme genres de l’être, l’analyse de la prédication, ont été réexaminés par la philosophie analytique du langage et par l’ontologie contemporaine.
====Bilan====
L’''Organon'' d’Aristote n’est pas un monument figé : c’est un ensemble vivant de questions, de distinctions et d’arguments qui continue de nourrir la pensée philosophique. Sa lecture exige une triple attention : à la ''lettre'' du texte, qui est souvent dense et elliptique ; à la ''tradition'' interprétative, qui en a sédimenté les significations ; et à la ''recherche contemporaine'', qui en renouvelle les enjeux. C’est par cette triple attention que l’''Organon'' peut être restitué dans sa fécondité, comme l’œuvre d’un penseur qui, plus de vingt-trois siècles après sa mort, continue de nous apprendre comment penser.
== La philosophie de la nature ==
=== La ''Physique'' – Les principes du mouvement et du changement ===
==== La nature comme principe interne de mouvement ====
La physique aristotélicienne n'est pas la physique au sens moderne, science mathématisée des phénomènes matériels. Elle est la science des êtres qui possèdent en eux-mêmes un principe de mouvement et de repos<ref>Aristote, ''Physique'', II, 1, 192b13-23. Pour une introduction d'ensemble à la philosophie naturelle aristotélicienne, voir Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie III ; ainsi que l'entrée « Aristotle's Natural Philosophy » de la ''Stanford Encyclopedia of Philosophy''.</ref>. Un être naturel (''phusei on'') se distingue ainsi d'un être artificiel : une plante croît et se reproduit par sa propre nature, tandis qu'un lit, fait de bois, ne produit pas naturellement d'autres lits.
Cette définition fonde l'autonomie de la nature et de son étude. Les êtres naturels ont leurs principes en eux-mêmes et ne dépendent pas de causes extérieures pour leur mouvement essentiel. Le physicien doit étudier non seulement la forme des choses, mais aussi leur matière, car la matière est le principe des mouvements naturels<ref>Aristote, ''Physique'', II, 2, 194a12-27.</ref>. Comme le souligne Larose, la défense aristotélicienne de l'autonomie de la physique constitue une contribution durable de la pensée du Stagirite : « Sa défense de l'autonomie des domaines du savoir, encore une fois contre Platon, est toujours d'actualité. Le refus de réduire la biologie aux mathématiques est bien aristotélicien »<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>.
==== Les quatre causes ====
Pour comprendre pleinement un être naturel, il faut connaître ses quatre causes. La cause matérielle est ce dont une chose est faite (le bronze est la cause matérielle de la statue). La cause formelle est l'essence ou la définition de la chose (la forme de l'Hermès est la cause formelle de la statue d'Hermès). La cause efficiente est ce qui a produit la chose (le sculpteur est la cause efficiente de la statue). La cause finale est ce en vue de quoi la chose existe (la décoration du temple est la cause finale de la statue)<ref>Aristote, ''Physique'', II, 3, 194b23-195a3.</ref>.
Ces quatre causes ne s'excluent pas mais se complètent. Plusieurs causes peuvent coïncider : la forme, le moteur et la fin peuvent être identiques. Dans la génération naturelle d'un homme, c'est la forme d'homme qui est à la fois dans le géniteur (cause efficiente), dans l'engendré (cause formelle), et visée comme fin du processus de génération<ref>Aristote, ''Physique'', II, 7, 198a24-27.</ref>.
==== Le mouvement et ses espèces ====
Le mouvement (''kinêsis'') ou changement est défini comme « l'actualité de ce qui est en puissance en tant que tel »<ref>Aristote, ''Physique'', III, 1, 201a10-11.</ref>. Cette définition signifie que le mouvement est l'acte d'un être qui n'est pas encore pleinement actualisé, mais en voie de l'être. C'est un acte imparfait, par opposition à l'acte parfait (''energeia'') qui est l'actualité achevée d'une chose.
Aristote distingue quatre espèces de changement selon les catégories : le changement substantiel (génération et corruption), le changement qualitatif (altération), le changement quantitatif (accroissement et diminution), et le changement local (déplacement)<ref>Aristote, ''Physique'', V, 1, 225a34-225b9.</ref>. Parmi ces changements, le mouvement local est premier, car il peut exister sans les autres<ref>Aristote, ''Physique'', VIII, 7, 260a26-260b7.</ref>.
==== L'éternité du mouvement et le Premier Moteur ====
Le mouvement est-il éternel ou a-t-il commencé ? Aristote argumente qu'il doit être éternel, car toute génération du mouvement supposerait un mouvement antérieur<ref>Aristote, ''Physique'', VIII, 1, 251a8-252b6.</ref>. Or tout ce qui est mû est mû par autre chose<ref>Aristote, ''Physique'', VII, 1, 241b24-242a15.</ref>. Pour éviter une régression à l'infini, il faut postuler un Premier Moteur immobile qui meut éternellement.
Ce Premier Moteur meut sans être mû, à la manière dont l'objet du désir meut le désirant. Il est donc cause finale plutôt qu'efficiente du mouvement éternel du ciel<ref>Aristote, ''Physique'', VIII, 6, 259b20-260a19.</ref>. Cette preuve « physique » du Premier Moteur prépare les développements métaphysiques du livre Λ de la ''Métaphysique''. Comme le souligne Annick Jaulin, l'interprétation de ce passage et sa relation aux livres centraux de la ''Métaphysique'' constitue l'un des problèmes les plus discutés de l'aristotélisme contemporain<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>.
=== Le ''De caelo'' – Le ciel et les éléments ===
==== La cinquième essence et l'éternité du monde ====
Le traité ''Du ciel'' étudie le mouvement circulaire du ciel et sa substance. Aristote établit qu'il existe un cinquième élément, l'éther (''aithêr''), distinct des quatre éléments sublunaires, animé d'un mouvement circulaire naturel et éternel<ref>Aristote, ''Du ciel'', I, 2, 269a2-269b17.</ref>. Cette quintessence ne connaît ni génération ni corruption, ni accroissement ni diminution.
Le ciel est, selon Aristote, éternel, sans commencement ni fin. Aristote réfute les cosmogonies qui, comme celle du ''Timée'' de Platon, faisaient naître le monde dans le temps<ref>Aristote, ''Du ciel'', I, 10-12, 279b4-284a35.</ref>. Cette thèse de l'éternité du monde entrera en conflit, au Moyen Âge, avec le dogme chrétien de la création ''ex nihilo'', donnant lieu à des tentatives de conciliation comme celles de Thomas d'Aquin.
==== La structure du cosmos ====
Aristote défend une cosmologie géocentrique. La Terre, sphérique, est immobile au centre de l'univers<ref>Aristote, ''Du ciel'', II, 14, 296b6-297b21.</ref>. Autour d'elle se trouvent les sphères concentriques des quatre éléments sublunaires (terre, eau, air, feu), puis les sphères célestes portant les astres<ref>Aristote, ''Du ciel'', II, 12, 292a14-293a11.</ref>.
Cette cosmologie restera dominante jusqu'à Copernic, Kepler et Galilée. Elle repose sur la distinction entre monde supralunaire, parfait et immuable, et monde sublunaire, siège de la génération et de la corruption. Cette distinction sera ébranlée par la découverte, au début du XVIIe siècle, des taches solaires et de la nature des comètes.
==== Les quatre éléments et leurs mouvements naturels ====
Dans le monde sublunaire, les quatre éléments possèdent des mouvements naturels rectilignes. La terre et l'eau, éléments lourds, se dirigent vers le bas, c'est-à-dire vers le centre de l'univers. L'air et le feu, éléments légers, se dirigent vers le haut, c'est-à-dire vers la périphérie du monde sublunaire<ref>Aristote, ''Du ciel'', IV, 4, 311a15-312a21.</ref>.
Comme le note Pellegrin, Aristote attache une grande importance à l'évidence sensible dans son traitement des questions physiques : il écrit lui-même, à propos de la transformation des éléments, que « le résultat final […] pour la science physique c'est l'évidence sensible qui toujours l'emporte » (''De caelo'', III, 7, 306a11)<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 94.</ref>.
Ces principes fondent la dynamique aristotélicienne, selon laquelle chaque corps tend vers son lieu propre avec une vitesse proportionnelle à son poids et inversement proportionnelle à la résistance du milieu<ref>Aristote, ''Du ciel'', I, 8, 277a27-277b8.</ref>. Cette physique sera critiquée par la révolution galiléenne, qui montrera que dans le vide tous les corps tombent à la même vitesse. Il faut cependant noter, comme l'a montré la recherche récente sur la philosophie naturelle de la Renaissance, que la transition entre la physique aristotélicienne et la mécanique moderne s'est opérée par étapes, à travers des relectures et des modifications internes au cadre péripatéticien plutôt que par un rejet abrupt et frontal<ref>Voir A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', Leiden, Brill, 2009.</ref>.
=== Le ''De generatione et corruptione'' – Génération, corruption et transformation ===
==== Les deux espèces de génération ====
La génération absolue (''genesis haplôs'') est le passage du non-être à l'être d'une substance : un homme naît. La génération relative (''genesis ti'') est l'altération d'une substance qui demeure : un homme devient musicien<ref>Aristote, ''De la génération et la corruption'', I, 3, 317a17-b18.</ref>. Aristote cherche à éviter deux écueils : l'éléatisme de Parménide, qui niait tout devenir, et l'atomisme de Démocrite, qui réduisait toute génération à une simple agrégation d'atomes éternels.
La solution réside dans les concepts de matière et de forme. Dans toute génération, quelque chose persiste (la matière) tandis que quelque chose advient (la forme). Dans la génération absolue, la matière première indéterminée reçoit une nouvelle forme substantielle. Dans la génération relative, la substance demeure identique tandis que ses accidents changent<ref>Aristote, ''De la génération et la corruption'', I, 4, 319b6-320a7.</ref>.
==== Action et passion, contact et mélange ====
Pour qu'il y ait génération, il faut qu'un agent agisse sur un patient. Mais l'action n'est pas séparée de la passion : ce sont deux aspects d'un même changement<ref>Aristote, ''De la génération et la corruption'', I, 7, 323b18-324a19.</ref>.
Le mélange (''mixis'') se distingue de la simple juxtaposition par le fait que les composants, tout en formant un nouveau corps homogène, peuvent être restitués par analyse. Aristote critique l'atomisme qui ramène le mélange à un simple entrelacement d'atomes : si les composants demeuraient inchangés, il n'y aurait pas véritable mélange<ref>Aristote, ''De la génération et la corruption'', I, 10, 327a30-328a5.</ref>. Dans le véritable mélange, les qualités des composants s'unissent pour former une nouvelle qualité intermédiaire.
=== Les ''Météorologiques'' – Les phénomènes du monde sublunaire ===
==== Le programme de la science naturelle ====
Les ''Météorologiques'' s'insèrent dans le programme de la physique aristotélicienne. Après la ''Physique'' (principes du mouvement), le ''De caelo'' (structure de l'univers), et le ''De generatione'' (transformations des éléments), Aristote étudie les phénomènes qui résultent de l'action du ciel sur le monde sublunaire<ref>Aristote, ''Météorologiques'', I, 1, 338a20-339a5.</ref>.
Le terme « météorologique » a ici un sens beaucoup plus large qu'aujourd'hui. Il désigne tous les phénomènes qui se produisent dans la région entre la surface de la terre et la sphère de la lune : phénomènes atmosphériques (pluie, vent, tonnerre), mais aussi comètes, Voie Lactée, tremblements de terre, mer et marées, fleuves et leurs crues.
==== Les deux exhalaisons ====
Le principe explicatif fondamental est celui des deux exhalaisons. Le soleil, par son mouvement et sa chaleur, produit deux sortes d'évaporations terrestres : une exhalaison humide (vapeur d'eau) et une exhalaison sèche (exhalations terrestres combustibles)<ref>Aristote, ''Météorologiques'', I, 3, 340b19-341a12.</ref>. Ces deux exhalaisons donnent naissance à la plupart des phénomènes météorologiques.
L'exhalaison humide, refroidie dans les régions supérieures, retombe en pluie. L'exhalaison sèche, enflammée au contact de la sphère du feu, produit les phénomènes ignés : étoiles filantes, comètes, Voie Lactée<ref>Aristote, ''Météorologiques'', I, 4-8, 341b6-346a34.</ref>. Ces explications, souvent fausses au regard de la science moderne, témoignent d'une démarche qui cherche à rendre compte des phénomènes par des causes naturelles, sans recourir au mythe.
=== Le ''De anima'' – L'âme, forme du corps vivant ===
==== Définition de l'âme ====
Le traité ''De l'âme'' relève à la fois de la physique – l'âme est principe de mouvement du corps vivant – et de ce qu'on appellerait aujourd'hui psychologie ou philosophie de l'esprit. Après avoir réfuté les conceptions de ses prédécesseurs, Aristote définit l'âme comme « l'entéléchie première d'un corps naturel ayant la vie en puissance »<ref>Aristote, ''De l'âme'', II, 1, 412a27-28.</ref>.
L'âme est la forme du corps vivant, son acte premier, principe de toutes ses opérations vitales. Elle n'est ni une substance séparée habitant le corps comme un pilote dans son navire (critique du dualisme platonicien), ni une simple harmonie ou arrangement du corps (critique du matérialisme), mais la forme substantielle indissociable du corps qu'elle anime<ref>Aristote, ''De l'âme'', II, 1, 413a3-10.</ref>. Cette doctrine hylémorphique de l'âme est aujourd'hui remise au premier plan par certains travaux de philosophie de l'esprit qui y voient une alternative au dualisme cartésien et au réductionnisme matérialiste<ref>Voir Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie IV ; ainsi que les travaux de Sophia Connell sur la psychologie aristotélicienne.</ref>.
==== Les trois âmes et leurs facultés ====
Il y a, selon Aristote, trois niveaux d'âme. L'âme nutritive, commune à tous les vivants (plantes, animaux, hommes), assure la nutrition, la croissance et la reproduction. L'âme sensitive, propre aux animaux, ajoute la sensation, le désir et le mouvement local. L'âme intellective, propre à l'homme, ajoute la pensée rationnelle<ref>Aristote, ''De l'âme'', II, 2-3, 413a20-414b28.</ref>.
Ces trois âmes ne sont pas trois substances séparées, mais trois niveaux de capacités, les supérieures incluant les inférieures. Un animal possède toutes les capacités de la plante plus les siennes propres ; l'homme possède celles de la plante et de l'animal plus l'intelligence.
==== La sensation et l'intellection ====
La sensation est la réception de la forme sensible sans la matière, comme la cire reçoit l'empreinte du sceau sans recevoir le métal dont il est fait<ref>Aristote, ''De l'âme'', II, 12, 424a17-21.</ref>. Chaque sens a son objet propre (la couleur pour la vue, le son pour l'ouïe). Il existe aussi un sens commun qui perçoit les sensibles communs (mouvement, repos, nombre, figure)<ref>Aristote, ''De l'âme'', III, 1-2, 425a13-427a16.</ref>.
L'intellect (''nous'') est la faculté de penser les formes intelligibles. Aristote distingue l'intellect patient, qui reçoit les formes, et l'intellect agent, qui les abstrait à partir des images sensibles<ref>Aristote, ''De l'âme'', III, 5, 430a10-25.</ref>. L'interprétation de ce passage célèbre et bref est l'une des plus controversées de l'aristotélisme : l'intellect agent est-il une partie de l'âme humaine ou une réalité séparée ? Est-il immortel ou périssable avec le corps ? Ces questions ont donné lieu, dans la tradition commentatoriale arabe et latine, à des positions divergentes (Alexandre d'Aphrodise, Avicenne, Averroès, Thomas d'Aquin).
=== Les ''Parva Naturalia'' – Les fonctions vitales ===
==== Organisation des Petits traités d'histoire naturelle ====
Les ''Parva Naturalia'' regroupent un ensemble de courts traités sur diverses fonctions vitales et leurs organes. Ils complètent le ''De anima'' en étudiant non plus l'âme en général mais ses opérations particulières<ref>Aristote, ''De la sensation'', 1, 436a1-17.</ref>.
Le ''De sensu'' traite des sensibles et des organes des sens. Le ''De memoria'' examine la mémoire et la réminiscence. Le ''De somno'' et le ''De insomniis'' étudient le sommeil et les rêves, expliqués par les mouvements qui persistent dans les organes sensoriels après la disparition des stimuli externes<ref>Aristote, ''Du sommeil'', 2, 455a12-455b2.</ref>. Le ''De divinatione'' traite de la divination dans les songes, dont Aristote nie la valeur prophétique.
==== Le cœur, principe de la vie ====
Aristote localise le principe vital et le sens commun dans le cœur plutôt que dans le cerveau<ref>Aristote, ''Des parties des animaux'', III, 4, 666a11-18.</ref>. C'est dans le cœur que réside la chaleur innée. Le cerveau, froid et humide, sert seulement à refroidir la chaleur excessive du cœur<ref>Aristote, ''Des parties des animaux'', II, 7, 652a24-652b34.</ref>.
Cette doctrine cardiocentrique est aujourd'hui jugée incorrecte du point de vue physiologique : Galien, dès l'Antiquité, reconnaîtra au cerveau un rôle dans les sensations et les mouvements volontaires. Comme le note Pellegrin, « aucune [observation] n'a amené Aristote à renverser l'une quelconque des conceptions fantaisistes qu'il a sur le fonctionnement du corps vivant »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 94.</ref>. Cette limite illustre les contraintes méthodologiques de la science aristotélicienne, tributaire des moyens techniques de son époque, sans pour autant invalider la démarche générale qui consiste à expliquer les phénomènes vitaux par des causes naturelles observables.
== La biologie et la connaissance du vivant ==
=== L'''Histoire des animaux'' – L'enquête empirique ===
==== Méthode et organisation de l'œuvre ====
L{{'}}''Histoire des animaux'' (''Peri ta zôia historiai''), en dix livres dont trois sont probablement apocryphes, constitue un travail de collection et de description des faits concernant les animaux<ref>Aristote, ''Histoire des animaux'', I, 6, 491a7-14. Pour une introduction à la biologie aristotélicienne et à son importance dans la recherche contemporaine, voir Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021.</ref>. Le terme ''historia'' signifie ici « enquête » ou « recherche », non pas histoire au sens temporel. Il s'agit d'un exposé systématique des données empiriques qui sert de fondement aux explications causales développées dans les autres traités biologiques.
Aristote y décrit l'anatomie externe et interne, le mode de reproduction, le régime alimentaire, les habitats et les comportements de plusieurs centaines d'espèces animales. Cette œuvre témoigne d'observations personnelles, complétées par des témoignages de pêcheurs, chasseurs et éleveurs<ref>D'Arcy Wentworth Thompson, introduction à sa traduction de l'''Histoire des animaux'', Oxford, 1910. Pour une mise au point récente sur le rôle de l{{'}}''Historia animalium'' dans le projet biologique aristotélicien, voir A. Gotthelf, « Data-organization, Classification, and Kinds: the Place of the History of Animals in Aristotle's Biological Enterprise », dans ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012, p. 261-292 ; ainsi que James G. Lennox, « Between Data and Demonstration: The Analytics and the Historia Animalium », dans A. Bowen (éd.), ''Science and Philosophy in Classical Greece'', New York, Garland, 1991, p. 261-295.</ref>.
La place de cet ouvrage dans le projet scientifique aristotélicien a été reconsidérée par la recherche contemporaine. La question du rapport entre les ''Seconds Analytiques'' (théorie de la science démonstrative) et la pratique effective des traités biologiques a fait l'objet de débats nourris, notamment autour des travaux de David Balme, Allan Gotthelf et James G. Lennox<ref>Voir David Balme, « Aristotle's Use of Division and Differentiae », dans A. Gotthelf et J.G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987 ; Mariska Leunissen, « History of Animals », dans Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
==== Principes de classification ====
Aristote organise les animaux selon une classification qui prend en compte plusieurs critères : mode de reproduction (vivipares, ovipares, larvipares), habitat (terrestres, aquatiques, aériens), régime alimentaire, présence ou absence de sang<ref>Aristote, ''Histoire des animaux'', I, 6, 490b7-491a6.</ref>. La division fondamentale oppose les animaux sanguins (en gros, les vertébrés) et les animaux non-sanguins (les invertébrés).
Contrairement à une idée parfois répandue, Aristote ne se contente pas d'une classification dichotomique rigide. Il reconnaît que les espèces forment un continuum, avec des formes intermédiaires qui rendent difficile le tracé de frontières nettes. Ainsi, les éponges occupent-elles une position intermédiaire entre les plantes et les animaux<ref>Aristote, ''Histoire des animaux'', I, 1, 487b6-10.</ref>. L'idée d'une ''scala naturae'' (échelle de la nature) influencera la pensée biologique jusqu'à Lamarck et Darwin, même s'il convient de ne pas projeter rétrospectivement sur Aristote des conceptions évolutionnistes qui lui sont étrangères<ref>Voir James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
=== Les ''Parties des animaux'' – La causalité finale dans le vivant ===
==== Méthode de la biologie : de la description à l'explication ====
Le traité ''Des parties des animaux'' se propose d'expliquer pourquoi les animaux possèdent telles parties avec telles configurations. Après l'''Historia'', qui répond à la question « qu'est-ce qui est ? », vient l'étude qui répond à « pourquoi est-ce ainsi ? »<ref>Aristote, ''Des parties des animaux'', I, 1, 639b7-640a9.</ref>.
Le livre I constitue un véritable traité de méthodologie scientifique. Aristote y défend la légitimité de l'étude de la nature : « il faut étudier chaque être sans dégoût, car en chacun réside quelque chose de naturel et de beau »<ref>Aristote, ''Des parties des animaux'', I, 5, 645a15-17.</ref>. Cette injonction est aujourd'hui souvent citée pour souligner l'importance accordée par Aristote à l'observation des phénomènes naturels, même dans leurs manifestations les plus humbles.
==== La priorité de la cause finale ====
Dans l'étude des vivants, la cause finale joue, selon Aristote, un rôle primordial. C'est en vue d'une fonction déterminée que chaque organe est configuré d'une certaine manière. Les dents de devant sont tranchantes pour couper, les molaires larges et plates pour broyer, parce que telle est leur fonction dans la nutrition<ref>Aristote, ''Des parties des animaux'', III, 1, 661b23-662a8.</ref>.
Aristote critique le mécanisme d'Empédocle et des atomistes, qui expliquaient les organes par des rencontres fortuites de particules matérielles. Selon lui, le hasard ne peut produire la régularité observée dans la nature, où chaque espèce reproduit invariablement la même organisation<ref>Aristote, ''Des parties des animaux'', I, 1, 639b11-640a9.</ref>. La matière joue un rôle, par ses propriétés et ses nécessités, mais elle est, dans cette perspective, au service de la forme et de la fin.
La nature de cette téléologie aristotélicienne est aujourd'hui l'un des sujets les plus discutés dans la recherche en philosophie de la biologie. Plusieurs interprétations s'opposent : la téléologie aristotélicienne est-elle « anthropocentrique » (la nature serait organisée pour le bien de l'homme), « cosmique » (le cosmos tout entier serait orienté vers une fin) ou « locale » (chaque espèce ou chaque organe a sa fin propre, sans qu'il y ait de finalité globale du vivant) ? Comme le souligne Pellegrin, « la téléologie aristotélicienne a comme horizon fondamental les espèces animales elles-mêmes »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Vivant », p. 196.</ref>. Cette lecture « locale », défendue notamment par Allan Gotthelf, James G. Lennox et Mariska Leunissen, est aujourd'hui largement partagée<ref>Voir Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', op. cit. ; James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Mariska Leunissen, ''Explanation and Teleology in Aristotle's Science of Nature'', Cambridge, Cambridge University Press, 2010.</ref>.
==== L'unité fonctionnelle de l'organisme ====
Chaque animal forme une totalité organisée dont toutes les parties coopèrent en vue de la vie de l'ensemble. Les poumons existent en vue de la respiration, qui existe en vue du refroidissement du cœur, qui existe en vue de la vie de l'animal. Réciproquement, la possession de poumons impose certaines autres caractéristiques : un animal pourvu de poumons doit avoir un sang et un cœur, doit respirer, donc doit avoir des voies aériennes<ref>Aristote, ''Des parties des animaux'', III, 6, 668b33-669a13.</ref>.
Cette conception « systémique » de l'organisme, où chaque partie trouve sa raison d'être dans sa contribution au tout, est aujourd'hui souvent rapprochée des approches fonctionnalistes en biologie contemporaine. Elle fonde aussi la possibilité d'une connaissance rationnelle du vivant : malgré la complexité des formes de vie, on peut les comprendre en dégageant les rapports fonctionnels entre les parties et le tout<ref>Voir Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit. ; Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie III.</ref>.
=== La ''Génération des animaux'' – Reproduction et hérédité ===
==== Les modes de reproduction ====
Le traité ''De la génération des animaux'' étudie la reproduction sexuée et asexuée, la formation de l'embryon, l'hérédité. Aristote distingue plusieurs modes de génération : par accouplement (la plupart des animaux), par génération spontanée (certains insectes, les anguilles qu'on croyait alors naître de la vase), par bourgeonnement (certaines plantes)<ref>Aristote, ''De la génération des animaux'', I, 1, 715a1-18.</ref>.
Dans la génération sexuée, le mâle apporte, selon Aristote, la forme et le principe du mouvement (la semence), tandis que la femelle apporte la matière (les menstrues chez les vivipares, l'œuf chez les ovipares)<ref>Aristote, ''De la génération des animaux'', I, 20, 729a9-b21.</ref>. Cette théorie reflète des préjugés androcentrés de l'époque : elle dénie à la femelle tout rôle actif dans la génération, la réduisant à fournir le substrat matériel informé par la semence mâle. La recherche contemporaine, notamment féministe, a discuté de manière approfondie ce volet de la pensée aristotélicienne ; elle souligne à la fois sa cohérence interne avec la métaphysique du composé hylémorphique et le caractère contestable de ses présupposés empiriques et sociaux<ref>Voir Sophia M. Connell, ''Aristotle on Female Animals: A Study of the Generation of Animals'', Cambridge, Cambridge University Press, 2016 ; ainsi que les contributions à Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
==== L'embryogenèse et la formation des parties ====
Aristote décrit avec précision le développement de l'embryon de poulet, qu'il a observé en ouvrant des œufs à différents stades d'incubation. Il voit d'abord se former le cœur, qui bat dès le troisième jour, puis progressivement les autres organes<ref>Aristote, ''Histoire des animaux'', VI, 3, 561a4-561b13.</ref>. Cette description fonde une conception épigénétique de l'embryologie : l'embryon se construit progressivement, par différenciation graduelle, et non par simple croissance d'un organisme préformé miniature.
La cause de cette différenciation progressive est, selon Aristote, la chaleur vitale contenue dans la semence, qui « cuit » et façonne la matière menstruelle comme la présure fait cailler le lait<ref>Aristote, ''De la génération des animaux'', II, 4, 739b20-740a4.</ref>. Ce processus n'est pas mécanique mais finalisé : c'est en vue de telle forme déterminée (l'homme adulte, le poulet adulte) que les parties se forment dans tel ordre.
==== L'hérédité et la ressemblance ====
Pourquoi les enfants ressemblent-ils à leurs parents ? Aristote explique ces phénomènes par le degré de « cuisson » et de maîtrise qu'exerce la semence mâle sur la matière femelle. Si la cuisson est parfaite, l'enfant ressemble au père ; si elle l'est moins, à la mère ; encore moins, aux grands-parents<ref>Aristote, ''De la génération des animaux'', IV, 3, 767b15-768a14.</ref>.
Ces explications, rudimentaires au regard de la génétique moderne, témoignent d'un effort pour rendre compte rationnellement de phénomènes que d'autres cultures expliquaient par l'intervention divine. Aristote pose les questions fondamentales de la biologie (qu'est-ce que la vie ? comment les formes se transmettent-elles ? pourquoi existe-t-il une telle diversité d'espèces ?) et invente des méthodes pour y répondre.
=== Le ''De motu animalium'' et le ''De incessu animalium'' – Le mouvement animal ===
==== Le principe du mouvement volontaire ====
Le ''De motu animalium'' examine comment les animaux se meuvent localement par eux-mêmes. Aristote établit qu'un animal ne peut se mouvoir que s'il s'appuie sur quelque chose d'immobile : de même qu'on ne peut pousser un bateau depuis l'intérieur du bateau, l'animal doit prendre appui sur le sol, l'eau ou l'air<ref>Aristote, ''Du mouvement des animaux'', 2, 698b7-699a11.</ref>.
Le principe moteur interne est le désir, excité par la sensation ou l'imagination d'un objet désirable. Le désir entraîne un réchauffement dans la région du cœur, qui se communique aux membres et produit leur contraction ou extension<ref>Aristote, ''Du mouvement des animaux'', 10, 703a4-b2.</ref>. Le mouvement animal, bien que produit de l'intérieur, a toujours une cause finale externe : l'objet désiré qui meut sans être mû.
==== Les modes de locomotion ====
Le ''De incessu animalium'' décrit et explique les différents modes de locomotion : marche, course, vol, nage. Aristote établit des lois générales : les animaux sanguins ne peuvent avoir plus de quatre points d'appui, car la nature ne fait rien en vain, et quatre suffisent à assurer la stabilité<ref>Aristote, ''De la marche des animaux'', 8, 708a9-708b9.</ref>. Les oiseaux ont des ailes parce qu'ils ont le corps léger et la poitrine large et musculeuse<ref>Aristote, ''De la marche des animaux'', 10, 710a10-710b7.</ref>.
Ces études relèvent de ce que nous appellerions aujourd'hui biomécanique. Elles montrent qu'Aristote ne se contente pas de contempler les formes vivantes, mais cherche à en expliquer le fonctionnement par des causes physiques, sans abandonner le cadre téléologique général qui voit dans la nature l'action d'une finalité immanente.
== La philosophie première : la métaphysique ==
=== Objet et divisions de la métaphysique ===
==== La science de l'être en tant qu'être ====
La métaphysique, qu'Aristote nomme « philosophie première » ou « sagesse », est définie comme la science de l'être en tant qu'être (''on hêi on'') et de ce qui lui appartient essentiellement<ref>Aristote, ''Métaphysique'', Γ, 1, 1003a21-22. Sur l'unité (et la possible disparité) du projet métaphysique aristotélicien, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction et chap. « La science recherchée » ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit.</ref>. Cette formulation distingue la métaphysique des sciences particulières qui étudient un aspect de l'être : la géométrie l'étudie en tant que continu, la biologie en tant que vivant. Seule la métaphysique considérerait l'être dans sa totalité.
Comme le souligne Annick Jaulin, le terme « métaphysique » lui-même n'apparaît jamais dans les traités aristotéliciens : il s'agit d'un titre éditorial donné par Andronicos<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Pellegrin recense quant à lui plusieurs définitions concurrentes de cette science chez Aristote : recherche des premiers principes et des premières causes, science de l'être en tant qu'être, science de la substance, science théologique<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Métaphysique », p. 136-137.</ref>.
Cette science est dite « première » en deux sens : elle porte sur ce qui est premier dans l'ordre de l'être (les principes et causes premiers), et elle examine les principes communs à toutes les sciences, comme le principe de non-contradiction<ref>Aristote, ''Métaphysique'', Γ, 3, 1005a19-b8.</ref>. Elle est aussi qualifiée de « science théologique » car elle porte sur ce qu'il y a de plus divin, le Premier Moteur immobile<ref>Aristote, ''Métaphysique'', Α, 2, 983a5-10.</ref>.
==== La question de l'unité de la métaphysique ====
Comment la métaphysique peut-elle être à la fois ontologie générale, étude de l'être en tant qu'être, et théologie, étude d'un être particulier (Dieu) ? Cette tension a donné lieu à plusieurs interprétations dans l'histoire de la philosophie<ref>Pour un état de la question, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit. ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 1-2.</ref>.
Une lecture, défendue notamment par Werner Jaeger, voit dans le corpus de la ''Métaphysique'' deux projets juxtaposés correspondant à deux périodes différentes de la pensée d'Aristote : une métaphysique ontologique générale, plus tardive, et une métaphysique théologique d'inspiration platonicienne, plus ancienne<ref>Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', op. cit. Cette lecture est cependant aujourd'hui largement contestée ; voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit.</ref>.
Une autre lecture, défendue par Thomas d'Aquin et reprise par toute une tradition, soutient que l'unité est assurée par le fait que Dieu est principe de tout être<ref>Thomas d'Aquin, ''In Metaphysicam Aristotelis Commentaria'', Prooemium.</ref>. C'est ce que la tradition appellera l'« onto-théologie ».
Une troisième lecture, plus récente, défendue notamment par Pierre Aubenque, considère que la synthèse entre ontologie et théologie est en fait impossible et que la ''Métaphysique'' aristotélicienne reste inachevée comme problème<ref>Pierre Aubenque, ''Le problème de l'être chez Aristote'', op. cit. Voir aussi Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 137.</ref>. Une quatrième lecture, présente notamment dans le travail d'Annick Jaulin, refuse de lire l'expression « substance séparée » au sens transcendant et soutient qu'Aristote, plutôt que d'opérer une rupture avec la physique, « réinscrit la substance immobile dans la tradition des penseurs de la nature »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>. Le débat reste ouvert.
==== Les apories de la métaphysique ====
Le livre Β de la ''Métaphysique'' expose méthodiquement les apories, c'est-à-dire les difficultés que rencontre toute tentative de construire une science de l'être et des principes premiers : Y a-t-il une science unique de toutes les causes ? La science de l'être porte-t-elle aussi sur les principes de la démonstration ? Y a-t-il seulement des substances sensibles, ou existe-t-il aussi des substances séparées ? Les principes sont-ils universels ou particuliers ? En acte ou en puissance ?<ref>Aristote, ''Métaphysique'', Β, 1, 995b4-996a17.</ref>
Cette méthode aporétique est caractéristique de la démarche aristotélicienne : « Il faut, pour bien rechercher, avoir auparavant développé les apories »<ref>Aristote, ''Métaphysique'', Β, 1, 995a24-27.</ref>.
=== La substance (livres Z-H) ===
==== Qu'est-ce que la substance ? ====
Si l'être se dit en plusieurs sens, et si la substance est le sens premier de l'être, la question centrale de la métaphysique devient : qu'est-ce que la substance (''ousia'') ?<ref>Aristote, ''Métaphysique'', Ζ, 1, 1028a10-1028b2.</ref> Quatre candidats se présentent : l'essence (''to ti ên einai''), l'universel (''to katholou''), le genre (''to genos''), et le substrat (''to hupokeimenon''). Ce dernier peut être entendu en trois sens : la matière, la forme, ou le composé des deux.
Aristote élimine d'abord l'universel et le genre : ils ne peuvent être substances parce qu'ils se prédiquent de plusieurs choses, alors que la substance de chaque chose lui est propre<ref>Aristote, ''Métaphysique'', Ζ, 13, 1038b8-16.</ref>. Cette exclusion vise notamment la théorie platonicienne des Idées.
L'interprétation de cet examen, et la question de savoir lequel des trois candidats restants (matière, forme, composé) Aristote retient finalement comme substance première, fait l'objet de débats considérables dans la recherche contemporaine. Comme le résume Christof Rapp, « les controverses interprétatives concernant l'interprétation des livres pertinents s'étendent de la question de savoir jusqu'où s'étend le traitement de l{{'}}''ousia'' (seulement le livre Z, ZH ou même ZHΘ), à la question de la structuration interne du traité de l{{'}}''ousia'', en passant par les questions sur l'objectif précis et la finalité philosophique de ces livres, jusqu'à la question de la nature de l'''eidos'' (la forme) – qui est au cours du traité plusieurs fois désignée comme ''ousia'' – et enfin la question du rapport entre matière et forme et l'unité de l{{'}}''ousia'' qui y est liée »<ref>Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', op. cit., chap. IV.18 (traduction libre).</ref>.
==== La forme, candidat à la substantialité ====
Le substrat semble avoir des titres à être appelé substance, puisqu'il est ce dont tout le reste se dit. Mais si l'on identifiait la substance à la matière pure, support ultime de toutes les déterminations, on aboutirait au paradoxe qu'une substance pourrait exister sans aucune détermination<ref>Aristote, ''Métaphysique'', Ζ, 3, 1029a10-26.</ref>.
C'est donc la forme (''morphê'', ''eidos'') qui apparaît, dans plusieurs passages des livres centraux, comme substance au sens propre. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence. Elle est aussi acte (''energeia'') par opposition à la matière qui est puissance (''dynamis''). Un morceau d'airain est en puissance une statue ; quand le sculpteur lui a donné la forme de l'Hermès, il est en acte une statue. La forme actualise la matière et lui confère l'être déterminé<ref>Aristote, ''Métaphysique'', Η, 2, 1042b9-1043a28.</ref>.
==== Le composé de matière et de forme ====
La substance concrète, l'individu réel, n'est ni la matière seule ni la forme seule, mais leur composé (''synolon''). Callias n'est ni simplement de la chair et des os, ni simplement la forme de l'homme, mais cet homme-ci composé de cette chair-ci et de ces os-ci structurés selon la forme humaine<ref>Aristote, ''Métaphysique'', Ζ, 10, 1035b14-27.</ref>.
La forme demeure cependant première en un sens, car c'est elle qui confère l'unité au composé. Sans la forme, la matière ne serait qu'un amas d'éléments disparates. C'est l'âme, forme du corps vivant, qui fait que ce corps est un organisme uni et non un simple agrégat. Dans l'ordre de la connaissance aussi, c'est par la forme qu'on définit et connaît la substance : on définit l'homme par sa forme (animal rationnel), non par sa matière (chair et os)<ref>Aristote, ''Métaphysique'', Ζ, 11, 1037a21-33. Pour une discussion approfondie, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « La substance ».</ref>.
=== Puissance et acte (livre Θ) ===
==== La distinction de la puissance et de l'acte ====
La distinction entre puissance (''dynamis'') et acte (''energeia'', ''entelecheia'') est l'une des contributions majeures d'Aristote à la philosophie. Elle permet de répondre aux apories de Parménide et de Platon concernant le devenir. Comment une chose peut-elle devenir ce qu'elle n'est pas ? En étant en puissance ce qu'elle devient en acte. Le bronze n'est pas une statue, mais il est en puissance une statue, de sorte qu'il peut le devenir sans passer du non-être à l'être<ref>Aristote, ''Métaphysique'', Θ, 6, 1048a30-1048b17.</ref>.
Une chose en puissance n'a pas encore telle propriété, mais elle a la capacité de l'acquérir. La capacité n'est ni l'absence pure (le bronze ne peut pas devenir homme), ni la présence actuelle (ce qui est actuellement chaud n'a plus la capacité de le devenir). Elle est un mode d'être intermédiaire<ref>Aristote, ''Métaphysique'', Θ, 7, 1049a1-18.</ref>.
==== La priorité de l'acte sur la puissance ====
Aristote établit que l'acte est antérieur à la puissance en plusieurs sens : dans l'ordre de la définition (on définit la puissance par l'acte correspondant), dans l'ordre de la connaissance, dans l'ordre de l'essence et du temps<ref>Aristote, ''Métaphysique'', Θ, 8, 1049b10-1050a3.</ref>.
Plus profondément, ce qui est éternellement en acte est antérieur à ce qui peut être tantôt en acte, tantôt en puissance. Or les substances divines sont éternellement en acte, tandis que les substances sensibles passent de la puissance à l'acte et de l'acte à la puissance. Les substances immobiles éternelles sont donc absolument premières<ref>Aristote, ''Métaphysique'', Θ, 8, 1050b6-28.</ref>.
Comme le souligne Annick Jaulin, cette primauté de l'acte sur la puissance n'est pas un simple point doctrinal mais structure l'ensemble de la philosophie première : « la primauté de l'acte sur la puissance permet de poser l'antériorité de la forme sur la matière », et elle « ouvre également la possibilité d'une interprétation positive du devenir »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « La science recherchée ».</ref>.
=== L'Un et le Multiple (livres I-K) ===
==== L'un se dit en plusieurs sens ====
Parallèlement à l'être, l'un aussi se dit en plusieurs sens. Il y a l'un par accident (le musicien et l'homme sont un quand le musicien est homme). Il y a l'un par soi, qui se divise en un par continuité (une route), un par indivisibilité en espèce (tout homme est un par l'espèce), un par le concept et la définition<ref>Aristote, ''Métaphysique'', Ι, 1, 1052a15-1052b14.</ref>.
Les pythagoriciens et Platon avaient fait de l'Un un principe suprême, antérieur même à l'être. Aristote critique cette position : l'un n'est pas une substance séparée, mais une propriété convertible avec l'être<ref>Aristote, ''Métaphysique'', Ι, 2, 1053b16-1054a13.</ref>. Dire qu'une chose est et dire qu'elle est une, c'est la même chose.
==== La pluralité et le nombre ====
La pluralité s'oppose à l'un comme le divisible à l'indivisible. Le nombre est une pluralité mesurée par l'un<ref>Aristote, ''Métaphysique'', Ι, 1, 1053a18-24.</ref>. Cette analyse fonde la possibilité des mathématiques et des sciences quantitatives.
=== Le Premier Moteur immobile (livre Λ) ===
==== La démonstration de l'existence du Premier Moteur ====
Le livre Λ de la ''Métaphysique'' constitue le sommet de la philosophie première aristotélicienne. Après avoir établi que les substances sont premières parmi les êtres, Aristote examine quelles substances existent. Il y a évidemment les substances sensibles, soumises au changement. Mais existe-t-il aussi une substance éternelle immobile ?<ref>Aristote, ''Métaphysique'', Λ, 6, 1071b3-5.</ref>
La démonstration procède à partir du mouvement. Il existe du mouvement, cela est manifeste. Or tout ce qui est mû est mû par autre chose. Ou bien il y a un premier moteur immobile, ou bien la série des moteurs remonte à l'infini. Mais une série infinie de causes ne peut rien expliquer, car en l'absence d'un premier il n'y aurait ni intermédiaire ni dernier<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a19-1072b4.</ref>. Il doit donc exister un premier moteur qui meut sans être mû.
==== La nature du Premier Moteur ====
Ce Premier Moteur est substance, acte pur, éternel, sans parties, sans grandeur. Il meut comme objet de désir et d'intellection : l'intellect désire le bien et se meut vers lui. Le Premier Moteur, étant le bien suprême et l'intelligible suprême, attire vers lui le premier ciel qui l'imite par son mouvement circulaire éternel<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a23-1072b4.</ref>.
Quelle est la vie de ce Premier Moteur ? Il est Pensée, mais que pense-t-il ? Il doit penser ce qu'il y a de plus excellent, donc lui-même. Il est donc Pensée de la Pensée (''noêsis noêseôs noêsis''), intellection qui se pense elle-même dans une contemplation éternellement bienheureuse<ref>Aristote, ''Métaphysique'', Λ, 9, 1074b33-35.</ref>.
==== Les moteurs des sphères ====
Le mouvement des astres requiert, outre le Premier Moteur qui meut la sphère des fixes, une pluralité de moteurs immobiles pour les sphères des planètes. Aristote, se fondant sur l'astronomie d'Eudoxe et de Callippe, compte cinquante-cinq sphères, donc cinquante-cinq moteurs<ref>Aristote, ''Métaphysique'', Λ, 8, 1073a14-1074b14.</ref>. Ces moteurs ne sont pas subordonnés les uns aux autres dans une hiérarchie, mais chacun meut directement sa sphère.
Cette pluralité d'intelligences motrices a posé un problème théologique au Moyen Âge : la tradition péripatéticienne et la scolastique médiévale ont tenté de la concilier avec l'unité divine en faisant des moteurs des substances secondes subordonnées au Premier Moteur. La recherche contemporaine, notamment Annick Jaulin, propose une lecture moins théologique : il s'agirait pour Aristote de fournir une explication causale du mouvement astronomique, sans projet théologique transcendant<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>.
=== Critique de la théorie platonicienne des Idées (livres M-N) ===
==== Les arguments contre les Idées séparées ====
Les livres M et N de la ''Métaphysique'' reprennent et développent la critique de la théorie platonicienne des Idées, déjà amorcée dans le livre A. Aristote reconnaît à Platon le mérite d'avoir affirmé l'existence de réalités intelligibles éternelles, mais lui reproche d'avoir séparé ces formes des choses sensibles et d'en avoir fait des substances subsistant par elles-mêmes<ref>Aristote, ''Métaphysique'', Μ, 4-5, 1078b7-1080a8.</ref>.
Cette séparation est, selon Aristote, inutile et impossible. Inutile, car les Idées ne servent ni à la connaissance des sensibles, ni à leur existence, ni à leur devenir<ref>Aristote, ''Métaphysique'', Α, 9, 991a8-991b9.</ref>. Impossible, car elle conduit à des apories comme l'argument du Troisième Homme<ref>Aristote, ''Métaphysique'', Α, 9, 990b17-991a8.</ref>.
==== Le statut des êtres mathématiques ====
Platon situait les êtres mathématiques (nombres, figures) dans un plan intermédiaire entre les Idées et les sensibles. Aristote refuse cette ontologie tripartite. Les objets mathématiques n'existent pas séparément, mais par abstraction<ref>Aristote, ''Métaphysique'', Μ, 3, 1078a21-31.</ref>. Le mathématicien considère les sensibles non en tant que sensibles mais en tant que continus ou quantifiés, faisant abstraction de leurs autres propriétés.
Cette solution préserve l'objectivité des mathématiques sans multiplier les êtres. Les vérités mathématiques sont nécessaires et universelles parce qu'elles portent sur des propriétés que les choses sensibles possèdent nécessairement, même si ces propriétés ne sont jamais réalisées dans les sensibles avec la perfection qu'étudie le mathématicien<ref>Aristote, ''Métaphysique'', Μ, 2, 1077a9-1077b17.</ref>.
== La philosophie pratique : éthique, politique, rhétorique, poétique ==
=== L'''Éthique à Nicomaque'' – La vie bonne ===
==== Le souverain bien et le bonheur ====
L'''Éthique à Nicomaque'' s'ouvre sur l'affirmation que toute action et toute recherche vise un bien. Parmi les biens, il y en a un qui est visé pour lui-même et en vue duquel tous les autres sont poursuivis : c'est le souverain bien, que tous appellent bonheur (''eudaimonia'')<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1095a14-26. Pour une introduction d'ensemble à l'éthique aristotélicienne, voir Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', Londres, Routledge, 2001 ; Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', Cambridge, Cambridge University Press, 2014.</ref>.
Comme le note Pellegrin, Aristote, dans le premier livre de l'''Éthique à Nicomaque'', « donne l'un des exemples les plus caractéristiques et les plus aboutis du traitement d'une notion léguée par la tradition »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Bonheur (eudaimonia) », p. 37.</ref> : il commence par exposer les opinions reçues sur le bonheur (plaisir, honneurs, richesse, vertu, contemplation), puis examine ce qu'il peut conserver de chacune.
Pour déterminer le bonheur véritable, Aristote recourt à la notion de fonction (''ergon'') : le bien pour chaque être réside dans l'accomplissement de sa fonction propre. La fonction propre de l'homme est l'activité de l'âme rationnelle selon l'excellence. Le bonheur est donc « une activité de l'âme selon la vertu parfaite, dans une vie complète »<ref>Aristote, ''Éthique à Nicomaque'', I, 7, 1098a16-18.</ref>.
L'interprétation de cette définition fait l'objet d'un débat important dans la recherche contemporaine, qui oppose une lecture « inclusiviste » à une lecture « dominante »<ref>Sur ce débat, voir Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', op. cit. ; Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit. La question fait l'objet d'une discussion approfondie dans la littérature anglo-saxonne, notamment depuis les travaux de J.L. Ackrill et T.H. Irwin.</ref>. Selon la lecture inclusiviste, le bonheur consiste en l'exercice de toutes les vertus, morales et intellectuelles, dans une vie complète. Selon la lecture dominante, le bonheur s'identifie à l'activité de la vertu la plus haute, c'est-à-dire la contemplation, comme le suggère le livre X. Cette tension entre deux perspectives au sein même de l'''Éthique à Nicomaque'' (entre les premiers livres, qui semblent privilégier une vie pratique vertueuse, et le livre X, qui exalte la vie contemplative) reste l'objet d'interprétations divergentes.
==== Les vertus éthiques et la doctrine du juste milieu ====
Aristote distingue les vertus intellectuelles (sagesse théorique, prudence) des vertus éthiques ou morales (courage, tempérance, justice). Les vertus morales sont des dispositions acquises par l'habitude à choisir le juste milieu entre deux extrêmes vicieux<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1106b36-1107a2.</ref>.
Ainsi, le courage est le juste milieu entre la lâcheté (défaut de crainte) et la témérité (excès d'audace). La tempérance est le milieu entre l'insensibilité et l'intempérance. La libéralité est le milieu entre l'avarice et la prodigalité<ref>Aristote, ''Éthique à Nicomaque'', II, 7, 1107a33-1108b10.</ref>. Ce milieu n'est pas arithmétique mais relatif à nous : il dépend des circonstances et de l'agent. Toute l'œuvre de la vertu consiste à trouver ce milieu, guidée par la droite raison (''orthos logos'') qu'incarne la prudence<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1107a1-2.</ref>.
Cette doctrine du juste milieu a connu une fortune durable dans la philosophie morale. Elle est aujourd'hui au centre du renouveau de l'éthique des vertus en philosophie morale contemporaine, à la suite des travaux d'Anscombe, MacIntyre et Nussbaum<ref>Voir les contributions à Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit.</ref>.
==== L'amitié ====
Les livres VIII et IX de l'''Éthique à Nicomaque'' traitent de l'amitié (''philia''). Aristote distingue trois espèces d'amitié : l'amitié utile, fondée sur l'intérêt réciproque ; l'amitié agréable, fondée sur le plaisir ; et l'amitié parfaite, celle des hommes vertueux qui s'aiment pour eux-mêmes<ref>Aristote, ''Éthique à Nicomaque'', VIII, 3, 1156a6-1156b7.</ref>.
Seule la dernière est véritablement amitié au sens plein, car elle est durable et réciproque. Les deux premières sont instables, car elles cessent quand cesse l'utilité ou le plaisir. L'amitié parfaite requiert du temps et de l'intimité<ref>Aristote, ''Éthique à Nicomaque'', VIII, 6, 1158a10-15.</ref>.
L'amitié n'est pas seulement agréable, elle est nécessaire à la vie bonne. L'homme est un animal politique qui ne peut s'accomplir dans l'isolement. L'ami est, selon Aristote, un autre soi-même : en conversant avec lui, en partageant ses joies et ses peines, nous nous connaissons et nous accomplissons nous-mêmes<ref>Aristote, ''Éthique à Nicomaque'', IX, 9, 1169b16-1170a4.</ref>.
==== La vie contemplative ====
Le livre X conclut l'éthique en affirmant que le bonheur suprême réside dans la vie contemplative. L'activité théorétique de l'intellect serait la plus haute et la plus autosuffisante. Elle nous apparente aux dieux, qui passent l'éternité dans la contemplation<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177a12-18.</ref>. Aristote reconnaît que cette vie purement intellectuelle dépasse les forces humaines prises isolément, mais affirme que dans la mesure où il y a en nous quelque chose de divin, nous devons tendre vers cette vie<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177b30-34.</ref>.
Comme le souligne Pellegrin, ce passage du livre X introduit la notion de « bonheur achevé » (''teleia eudaimonia'') et déclare que « le bonheur pratique, celui du citoyen vertueux, n'est bonheur "qu'à titre secondaire" »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 39, citant ''Éthique à Nicomaque'', X, 8, 1178a9.</ref>. La cohérence entre cette thèse et l'analyse de l'''eudaimonia'' développée dans les premiers livres est l'une des questions les plus discutées de l'aristotélisme moral contemporain.
=== Les ''Politiques'' – La cité et les constitutions ===
==== L'homme, animal politique ====
Les ''Politiques'' commencent par affirmer que la cité (''polis'') existe par nature et que l'homme est par nature un animal politique<ref>Aristote, ''Politiques'', I, 2, 1252b27-1253a3. Pour une vue d'ensemble de la pensée politique aristotélicienne, voir Marguerite Deslauriers et Pierre Destrée (éd.), ''The Cambridge Companion to Aristotle's Politics'', Cambridge, Cambridge University Press, 2013.</ref>. Cette affirmation s'oppose à la fois aux sophistes, qui faisaient de la société une convention artificielle, et à la tradition cynique, qui prônait l'autarcie individuelle.
L'homme ne peut, selon Aristote, ni vivre ni bien vivre en dehors de la cité, car il a besoin des autres pour satisfaire ses besoins matériels et pour actualiser sa nature rationnelle et morale. La cité n'est pas une simple alliance défensive ou commerciale, mais une communauté de vie bonne, ayant pour fin le bonheur de ses membres<ref>Aristote, ''Politiques'', III, 9, 1280b39-1281a4.</ref>.
Il faut signaler ici que les ''Politiques'' contiennent également des thèses aujourd'hui rejetées : la justification de l'esclavage par nature (livre I) et la subordination des femmes ont fait l'objet de critiques nombreuses, déjà au {{XIXe siècle}} et plus encore dans la philosophie féministe contemporaine. Comme le note Larose, « certains des textes [d'Aristote] choqueront à juste titre le lecteur, en particulier ceux qui traitent du statut de la femme et de l'esclavage. Tout philosophe qu'il soit, Aristote est bien un homme de son temps »<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>.
==== Les formes de constitution ====
Aristote distingue six formes de constitution selon deux critères : le nombre de gouvernants (un seul, quelques-uns, la multitude) et la fin poursuivie (l'intérêt commun ou l'intérêt privé des gouvernants). Les formes droites sont la royauté (gouvernement d'un seul pour le bien commun), l'aristocratie (gouvernement de quelques-uns pour le bien commun), et la république ou ''politeia'' (gouvernement de la multitude pour le bien commun). Les formes déviées sont la tyrannie, l'oligarchie et la démocratie au sens péjoratif de démagogie<ref>Aristote, ''Politiques'', III, 7, 1279a22-1279b10.</ref>.
Comme le souligne Pellegrin, l'originalité d'Aristote ne réside pas dans la quête d'une constitution idéale unique, mais dans l'idée qu'« une constitution est dite droite si elle gouverne la cité en vue de "l'avantage commun" »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Politique », p. 57.</ref>. Aucune constitution n'est absolument la meilleure en tout lieu et en tout temps : la meilleure constitution pour une cité donnée dépend des circonstances – étendue du territoire, richesses, mœurs des habitants. Aristote fait preuve ici d'un réalisme politique qui contraste avec l'utopisme de la ''République'' de Platon.
==== La constitution mixte et la classe moyenne ====
La constitution la plus stable, selon le livre IV, est celle qui mêle des éléments oligarchiques et démocratiques, donnant le pouvoir à la classe moyenne<ref>Aristote, ''Politiques'', IV, 11, 1295a25-1295b1.</ref>. Les classes moyennes ne sont ni assez pauvres pour envier les riches, ni assez riches pour mépriser les pauvres. Elles recherchent la stabilité et l'égalité plutôt que les révolutions<ref>Aristote rappelle aussi que « les bons législateurs sont sortis de la classe moyenne », citant l'exemple de Solon, Lycurgue et Charondas. Voir Daniel Larose, ''Aristote de A à Z'', op. cit., article « Constitution mixte ».</ref>.
Cette théorie de la classe moyenne et de la constitution mixte a influencé la pensée politique occidentale, de Polybe à Montesquieu. La méthode aristotélicienne, comme le souligne Pellegrin, ne se contente pas d'observer la diversité des constitutions, mais « rend la diversité intelligible en en construisant un modèle théorique » à partir d'un nombre fini de paramètres<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 60.</ref>.
==== L'éducation ====
Les derniers livres des ''Politiques'' sont consacrés à l'éducation. Celle-ci ne peut être laissée aux familles privées, car la cité a pour fin de rendre les citoyens vertueux. Il doit donc y avoir une éducation publique commune, qui forme le caractère et l'intelligence des jeunes en vue de la vie civique et de la vie bonne<ref>Aristote, ''Politiques'', VIII, 1, 1337a11-21.</ref>.
Cette éducation comprend la gymnastique pour le corps, la musique pour l'âme, les lettres pour l'usage pratique, et le dessin pour apprécier la beauté des œuvres. Mais son but ultime n'est pas l'utilité mais le loisir bien employé (''scholê''), c'est-à-dire l'activité libre de l'esprit<ref>Aristote, ''Politiques'', VIII, 3, 1337b28-1338a13.</ref>.
=== La ''Rhétorique'' – L'art de persuader ===
==== La rhétorique comme art ====
La ''Rhétorique'' étudie les moyens de persuasion dans tous les genres de discours. Elle est l'homologue (''antistrophos'') de la dialectique : de même que la dialectique enseigne à raisonner sur toute question à partir de prémisses probables, la rhétorique enseigne à persuader tout auditoire sur tout sujet<ref>Aristote, ''Rhétorique'', I, 1, 1354a1-11.</ref>.
Aristote prend ses distances avec la critique platonicienne de la rhétorique formulée dans le ''Gorgias''. Bien utilisée, la rhétorique est un art (''technê'') légitime. Elle sert à défendre la vérité et la justice, car « il serait absurde que l'incapacité de se servir de ses forces corporelles soit honteuse, mais non l'incapacité de se servir de la parole »<ref>Aristote, ''Rhétorique'', I, 1, 1355a20-24.</ref>.
==== Les trois genres rhétoriques ====
Aristote distingue trois genres de rhétorique. Le genre délibératif conseille ou dissuade concernant l'avenir (devons-nous faire la guerre ?). Le genre judiciaire accuse ou défend concernant le passé (X a-t-il commis ce crime ?). Le genre épidictique loue ou blâme concernant le présent (célébrons la vertu du héros)<ref>Aristote, ''Rhétorique'', I, 3, 1358b2-29.</ref>.
Chaque genre a ses lieux propres. Le délibératif porte sur l'utile et le nuisible. Le judiciaire porte sur le juste et l'injuste. L'épidictique porte sur le beau et le laid moral<ref>Aristote, ''Rhétorique'', I, 3, 1358b29-1359a5.</ref>.
==== Les preuves rhétoriques : ethos, pathos, logos ====
Aristote distingue trois moyens de persuasion : l'''ethos'' (le caractère de l'orateur), le ''pathos'' (les émotions de l'auditoire), et le ''logos'' (le raisonnement lui-même)<ref>Aristote, ''Rhétorique'', I, 2, 1356a1-13.</ref>.
L'''ethos'' persuade en inspirant confiance : l'orateur doit paraître prudent, vertueux et bienveillant. Le ''pathos'' persuade en suscitant des émotions favorables à la thèse défendue. Le livre II étudie systématiquement les émotions (colère, pitié, crainte, envie), leurs causes et leurs manifestations. Le ''logos'' persuade par les raisonnements, notamment l'enthymème (syllogisme rhétorique à partir de prémisses probables) et l'exemple (induction rhétorique)<ref>Aristote, ''Rhétorique'', I, 2, 1356a35-1356b5.</ref>.
Cette analyse fonde la rhétorique comme discipline rationnelle et systématique. Elle constituera la base de l'enseignement rhétorique jusqu'à l'époque moderne et nourrit aujourd'hui des recherches actives en philosophie de l'argumentation et théorie de la communication.
=== La ''Poétique'' – La création artistique ===
==== La ''mimêsis'' et la ''catharsis'' ====
La ''Poétique'' étudie l'art poétique, principalement la tragédie et l'épopée. La poésie, comme tous les arts, est imitation (''mimêsis''). Mais elle n'imite pas les choses telles qu'elles sont (c'est le rôle de l'histoire), mais telles qu'elles pourraient ou devraient être selon la vraisemblance ou la nécessité<ref>Aristote, ''Poétique'', 9, 1451a36-1451b5.</ref>. C'est pourquoi la poésie est, selon Aristote, plus philosophique que l'histoire : elle dit l'universel, alors que l'histoire dit le particulier.
La tragédie représente une action sérieuse et complète, en suscitant pitié et crainte, pour opérer la purification (''catharsis'') de ces émotions<ref>Aristote, ''Poétique'', 6, 1449b24-28.</ref>. La doctrine de la ''catharsis'' est l'une des plus discutées de toute la philosophie ancienne. L'interprétation médicale (la tragédie « purge » les émotions excessives) a été défendue notamment par Jacob Bernays au {{XIXe siècle}} ; d'autres interprétations y voient plutôt une « clarification » morale ou cognitive des émotions<ref>Sur ces interprétations divergentes, voir Stephen Halliwell, ''Aristotle's Poetics'', Londres, Duckworth, 1986 ; Christof Rapp, « Katharsis der Emotionen », dans B. Seidensticker et M. Vöhler (éd.), ''Katharsiskonzeptionen vor Aristoteles'', Berlin, De Gruyter, 2007 ; Christof Rapp, « Aristoteles über das Wesen und die Wirkung der Tragödie », dans O. Höffe (éd.), ''Aristoteles. Poetik'', Berlin, Akademie Verlag, 2009. La question demeure ouverte dans la recherche contemporaine.</ref>.
==== La structure de la tragédie ====
Aristote analyse avec précision la structure de la tragédie. Celle-ci doit former un tout avec commencement, milieu et fin. L'intrigue (''mythos'') est l'âme de la tragédie, plus importante que les caractères<ref>Aristote, ''Poétique'', 11, 1452a15-32.</ref>. L'intrigue idéale comprend une péripétie (''peripeteia''), renversement de l'action en sens contraire, et une reconnaissance (''anagnôrisis''), passage de l'ignorance à la connaissance.
Le héros tragique ne doit être ni parfaitement vertueux ni complètement vicieux, mais occuper une position intermédiaire. Son malheur doit résulter non d'un vice mais d'une erreur (''hamartia'')<ref>Aristote, ''Poétique'', 13, 1453a7-10.</ref>. Ainsi Œdipe qui, sans le savoir, tue son père et épouse sa mère, inspire-t-il pitié plutôt que répulsion.
Comme le rappelle Pellegrin, la ''Poétique'' que nous connaissons est une œuvre incomplète : « nous ne possédons qu'une partie, celle qu'Aristote a consacrée à la tragédie, et en partie à l'épopée »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 109.</ref>. La partie consacrée à la comédie est perdue. Ces analyses ont profondément influencé la théorie littéraire occidentale, notamment à la Renaissance avec la redécouverte du traité, et nourrissent encore les débats en théorie littéraire et esthétique contemporaine.
== Réception et postérité ==
L'œuvre d'Aristote a connu une transmission complexe et une réception multiforme dans l'histoire de la pensée. Dans l'Antiquité tardive, les commentateurs néoplatoniciens (Porphyre, Alexandre d'Aphrodise, Simplicius, Philopon) étudient et expliquent ses œuvres, en cherchant souvent à les harmoniser avec le platonisme.
Au IXe siècle, les philosophes et savants du monde arabo-musulman traduisent Aristote en syriaque puis en arabe. Al-Fârâbî (872-950), Avicenne (980-1037) et Averroès (1126-1198), surnommé « le Commentateur », développent un aristotélisme islamique qui sera lui-même reçu en Occident latin. À partir du XIIe siècle, les œuvres d'Aristote, accompagnées des commentaires arabes, sont traduites en latin et transforment l'enseignement universitaire médiéval.
Albert le Grand (1200-1280) et Thomas d'Aquin (1225-1274) intègrent largement Aristote dans la théologie chrétienne, montrant la possibilité d'une articulation entre la philosophie péripatéticienne et la foi. Le thomisme deviendra une philosophie de référence dans l'Église catholique. Cette domination scolastique provoquera, à la Renaissance et à l'époque moderne, des remises en cause variées.
La science moderne, de Galilée à Newton, se construit en partie en réaction à la physique aristotélicienne, mais sans en constituer la simple négation : la recherche récente sur la philosophie naturelle de la Renaissance et la scolastique tardive décrit un tableau plus nuancé, fait à la fois de continuités, de relectures et d'oppositions<ref>Voir notamment, pour les débats sur la transition entre l'aristotélisme tardif et la science moderne, A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', op. cit. ; et l'entrée « Aristotle's Natural Philosophy » de la ''Stanford Encyclopedia of Philosophy''.</ref>.
Au {{XXe siècle}} et au début du {{XXIe siècle}}, plusieurs domaines de la pensée aristotélicienne ont fait l'objet d'un regain d'attention universitaire. En philosophie morale, le renouveau de l'éthique des vertus (Anscombe, MacIntyre, Nussbaum) a remis au premier plan les analyses de l'''Éthique à Nicomaque''<ref>Voir Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit. ; Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', op. cit.</ref>. En philosophie de l'esprit, certains philosophes ont vu dans l'hylémorphisme aristotélicien une alternative aux apories du dualisme cartésien et du réductionnisme matérialiste. En métaphysique, la conception de la substance et des catégories nourrit les débats sur l'ontologie réaliste. En philosophie de la biologie, la téléologie et la conception de l'organisme comme totalité fonctionnelle font l'objet de relectures<ref>Voir notamment Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', op. cit. ; James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
Au-delà de ces actualisations, l'œuvre d'Aristote demeure un objet d'étude central de l'histoire de la philosophie. Comme le rappelle Daniel Larose, « il existe ainsi plusieurs "Aristote" selon les époques » : la pluralité des lectures (logicienne, physicienne, métaphysicienne, théologienne, éthicienne) reflète à la fois la richesse interne de son œuvre et la diversité des projets philosophiques qui s'en sont nourris<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>. La recherche universitaire actuelle aborde le corpus aristotélicien comme un ensemble cohérent sans pour autant le juger systématique au sens classique du terme.
== Notes et références ==
{{Références|colonnes = 2}}
== Bibliographie ==
=== Éditions et traductions de référence ===
* Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014.
* Bekker, Immanuel (éd.), ''Aristotelis Opera'', Berlin, Reimer, 1831-1870.
* Jonathan Barnes (éd.), ''The Complete Works of Aristotle. The Revised Oxford Translation'', Princeton, Princeton University Press, 1984.
* Aristote, ''Catégories'', éd. et trad. R. Bodéüs, Paris, Les Belles Lettres, 2001.
* Aristote, ''Topiques I-IV'', éd. et trad. J. Brunschwig, Paris, Les Belles Lettres, 1967 et 2007.
* Aristote, ''Poétique'', éd. et trad. J. Hardy, Paris, Les Belles Lettres.
* Aristote, ''De l'Âme'', éd. et trad. A. Jannone et E. Barbotin, Paris, Les Belles Lettres.
* Aristote, ''Politique'', éd. et trad. J. Aubonnet, Paris, Les Belles Lettres, 1960 et suiv.
=== Synthèses générales ===
* Pierre Aubenque, ''Le problème de l'être chez Aristote'', Paris, PUF, 1962.
* Jonathan Barnes (éd.), ''The Cambridge Companion to Aristotle'', Cambridge, Cambridge University Press, 1995.
* Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923).
* Daniel Larose, ''Aristote de A à Z'', Paris, PUF, « Que sais-je ? », 2021.
* Pierre Pellegrin, ''Dictionnaire Aristote'', Paris, Ellipses, 2007.
* Pierre Pellegrin, ''Aristote'', Paris, Bordas, 1990.
* David Ross, ''Aristotle'', London, Methuen, 1923.
=== Études spécialisées par domaine ===
* Logique et épistémologie : Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', Paris, Vrin, 2009 ; Jan Lukasiewicz, ''La syllogistique d'Aristote'', trad. fr., Paris, Vrin ; J. Brunschwig, ''Aristote: Topiques I-IV'', Paris, Les Belles Lettres, 1967 et 2007 ; L.A. Dorion, ''Les Réfutations Sophistiques d'Aristote'', Paris, Vrin, 1995.
* Métaphysique : Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', Londres-New York, Routledge, 2004 ; Annick Jaulin, ''Aristote. La métaphysique'', Paris, PUF, 1999 ; Maddalena Bonelli (dir.), ''Physique et métaphysique chez Aristote'', Paris, Vrin ; Michel Narcy et Alonso Tordesillas (dir.), ''La « Métaphysique » d'Aristote. Perspectives contemporaines'', Paris, Vrin ; Richard Bodéüs, ''Aristote et la théologie des vivants immortels'', Montréal-Paris, Bellarmin-Les Belles Lettres, 1992.
* Philosophie de la nature et biologie : Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021 ; James G. Lennox, ''Aristotle's Philosophy of Biology: Studies in the Origins of Life Science'', Cambridge, Cambridge University Press, 2001 ; Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012 ; Allan Gotthelf et James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987 ; A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', Leiden, Brill, 2009.
* Éthique et politique : Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', Cambridge, Cambridge University Press, 2014 ; Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', Londres, Routledge, 2001 ; Marguerite Deslauriers et Pierre Destrée (éd.), ''The Cambridge Companion to Aristotle's Politics'', Cambridge, Cambridge University Press, 2013 ; Pierre-Marie Morel, ''Aristote. Une philosophie de l'activité'', Paris, Flammarion, 2003.
* Synthèses de référence en langue allemande et anglaise : Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', Oxford, Oxford University Press, 2012 ; Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch. Leben – Werk – Wirkung'', Stuttgart, Metzler, 2011.
=== Ressources en ligne ===
* ''Stanford Encyclopedia of Philosophy'', entrées : « Aristotle » ; « Aristotle's Categories » ; « Aristotle's Logic » ; « Aristotle's Metaphysics » ; « Aristotle's Ethics » ; « Aristotle's Political Philosophy » ; « Aristotle's Natural Philosophy » ; « Aristotle's Biology » ; « Aristotle's Aesthetics ». [https://plato.stanford.edu/]
* ''Internet Encyclopedia of Philosophy'', entrée « Aristotle ». [https://iep.utm.edu/aristotle/]
{{Autocat}}
[[Catégorie:Philosophe]]
{{DEFAULTSORT:Aristote}}
ak8zbn4pyxgyjduxkiv8hwxxsw950g0
765113
765112
2026-04-26T08:23:57Z
PandaMystique
119061
/* Études spécialisées par domaine */
765113
wikitext
text/x-wiki
{{DicoPhilo|Aristote}}
Aristote (en grec ancien Ἀριστοτέλης, ''Aristotélēs'', 384-322 av. J.-C.) est un philosophe grec dont l'œuvre conservée couvre la logique, la philosophie de la nature, la biologie, la métaphysique, l'éthique, la politique, la rhétorique et la poétique. Né à Stagire en Chalcidique, il fut élève de Platon à l'Académie d'Athènes pendant une vingtaine d'années, puis précepteur d'Alexandre de Macédoine, avant de fonder à Athènes sa propre école, le Lycée. La transmission de ses écrits, complexe et partiellement lacunaire, a fortement conditionné l'ordre dans lequel ils nous sont parvenus ainsi que les modalités de leur interprétation : les dialogues exotériques publiés de son vivant ne subsistent qu'à l'état de fragments, tandis que les traités acroamatiques que nous lisons aujourd'hui ont été édités, organisés et titrés au Ier siècle av. J.-C. par Andronicos de Rhodes<ref>Sur l'histoire de la transmission, voir Pierre Pellegrin, ''Dictionnaire Aristote'', Paris, Ellipses, 2007, p. 5-7 ; Annick Jaulin, ''Aristote. La métaphysique'', Paris, PUF, 1999, Introduction.</ref>.
L'œuvre conservée a exercé une influence durable sur la philosophie ancienne tardive, sur les traditions arabe et latine médiévales, ainsi que sur plusieurs renaissances modernes de l'aristotélisme. Sa réception se fait selon des angles variables : les commentateurs néoplatoniciens en font une propédeutique au platonisme, les théologiens médiévaux y voient « le philosophe » par excellence (''Philosophus''), tandis que la science moderne se construit en partie en réaction à la physique péripatéticienne, sans pour autant rompre toujours avec elle de manière unilatérale<ref>Sur la pluralité des « Aristote » selon les époques, voir Daniel Larose, ''Aristote de A à Z'', Paris, PUF, « Que sais-je ? », 2021, Introduction.</ref>. Au {{XXe siècle}}, le projet « génétique » de Werner Jaeger – qui distinguait trois périodes (platonicienne, critique, empirique) dans la pensée du Stagirite – a été largement abandonné par la recherche universitaire, qui aborde aujourd'hui le corpus comme un ensemble cohérent sans être pour autant systématique<ref>Daniel Larose, ''Aristote de A à Z'', op. cit. ; voir aussi Pellegrin, ''Dictionnaire Aristote'', p. 6-8.</ref>.
Le présent article expose successivement la vie et le contexte historique d'Aristote, la constitution et la transmission de son œuvre, son rapport à Platon, puis ses doctrines en logique (l{{'}}''Organon''), philosophie de la nature, biologie, métaphysique et philosophie pratique (éthique, politique, rhétorique et poétique). Une dernière section traite de la réception et de la postérité de la pensée aristotélicienne.
== Vie et contexte historique ==
=== Origines familiales et contexte macédonien ===
Aristote naquit en 384 av. J.-C. à Stagire<ref>Stagire, l'actuelle Stavro, était une colonie grecque de la Chalcidique de Thrace, située sur la côte septentrionale de la mer Égée, à proximité de la Macédoine. Voir Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923), p. 103-104.</ref>, petite cité de la Chalcidique en Macédoine, d'où son surnom de Stagirite<ref>Ce patronyme sera employé tout au long de l'Antiquité pour le désigner. Cf. Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', Göteborg, Almqvist & Wiksell, 1957, p. 253-257.</ref>. Son père, Nicomaque, était médecin et appartenait à la corporation des Asclépiadés, dont les membres prétendaient descendre du dieu de la médecine, Asclépios<ref>Les Asclépiadés formaient une famille sacerdotale de médecins héritiers d'une tradition hippocratique. Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 1, trad. sous la dir. de M.-O. Goulet-Cazé, Paris, Le Livre de Poche, 1999, p. 573.</ref>. Nicomaque exerçait la fonction de médecin personnel et ami (''philos'') du roi Amyntas III de Macédoine<ref>Cette position à la cour macédonienne conférait à la famille d'Aristote un statut privilégié et des relations avec la maison royale. Voir Jean Brun, ''Aristote et le Lycée'', Paris, PUF, « Que sais-je ? », 1961, p. 7-8.</ref><ref>Diogène Laërce, ''Vies'', V, 1, op. cit., p. 573.</ref>.
Sa mère, Phæstias (ou Phaestis), originaire de Chalcis en Eubée, était sage-femme<ref>Certaines sources antiques indiquent qu'elle descendait d'une famille chalcidienne de notables. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 259.</ref>. La famille d'Aristote s'inscrivait ainsi dans un milieu cultivé, marqué à la fois par la pratique médicale rationnelle et par des ascendances ioniennes<ref>Selon Werner Jaeger, ces origines ioniennes pourraient avoir favorisé son goût pour l'investigation scientifique de la nature (''physis''), caractéristique des premiers Physiciens d'Ionie. Voir Werner Jaeger, ''Aristote'', op. cit., p. 105-106. Cette thèse, défendue par Jaeger dans le cadre de son interprétation génétique de la pensée d'Aristote, est aujourd'hui discutée par les historiens.</ref><ref>Ernest Barker, ''The Politics of Aristotle'', Oxford, Clarendon Press, 1946, Introduction, p. XI.</ref>.
Aristote devint orphelin à un âge précoce, perdant son père alors qu'il était encore enfant<ref>Sa mère mourut également jeune, laissant Aristote orphelin de ses deux parents avant ses dix-sept ans. Voir Werner Jaeger, ''Aristote'', op. cit., p. 104.</ref>. Il fut dès lors élevé par Proxène d'Atarnée, un ami de sa famille, originaire d'Atarnée en Mysie<ref>Atarnée était une cité située en Asie Mineure, en Troade. Diogène Laërce, ''Vies'', V, 3, op. cit., p. 574.</ref>. En reconnaissance, Aristote adoptera plus tard Nicanor, le fils de Proxène, et lui destinera sa propre fille Pythias par son testament<ref>Le testament d'Aristote, conservé par Diogène Laërce (V, 11-16), témoigne de ces liens familiaux durables. Voir l'édition dans Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014, p. 2597-2600.</ref><ref>Ces nouvelles attaches familiales constitueront les premiers rapports qu'Aristote entretiendra avec la région d'Atarnée, où il rencontrera plus tard Hermias, le futur tyran du lieu. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>.
=== Formation à l'Académie de Platon (367-347 av. J.-C.) ===
À l'âge de dix-sept ans, en 367-366 av. J.-C., Aristote se rend à Athènes, qui demeure alors, malgré son déclin politique et économique après les Guerres du Péloponnèse, l'un des principaux foyers intellectuels du monde grec<ref>Sous l'archontat de Polyzélos (selon Denys d'Halicarnasse) ou de Nausigénès (selon d'autres sources). Apollodore d'Athènes, cité par Diogène Laërce, V, 9, op. cit., p. 577.</ref>. Il entre à l'Académie de Platon, école philosophique fondée vers 387 av. J.-C.<ref>L'Académie tirait son nom du gymnase d'Académos, situé dans un faubourg d'Athènes. Voir Harold Cherniss, ''The Riddle of the Early Academy'', Berkeley, University of California Press, 1945, p. 1-72.</ref>. Cette institution dispensait un enseignement encyclopédique en mathématiques, astronomie, musique, dialectique, politique et philosophie<ref>Léon Robin, ''Aristote'', Paris, PUF, 1944, p. 3.</ref>.
Aristote y demeura vingt ans, jusqu'à la mort de Platon en 348-347 av. J.-C.<ref>Apollodore d'Athènes, cité par Diogène Laërce (V, 9-10), fournit cette chronologie. Voir Diogène Laërce, ''Vies'', op. cit., p. 577-578.</ref>. La tradition antique rapporte que Platon l'aurait surnommé le Liseur (''anagnôstês'') ou l'Intelligence de l'école (''ho nous tês scholês'')<ref>Ces surnoms, qui pourraient attester la reconnaissance par le Maître des dons de son élève, sont rapportés par les sources biographiques tardives. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 325-327.</ref><ref>''Vita Marciana'', dans Valentin Rose, ''Aristoteles Pseudepigraphus'', Leipzig, Teubner, 1863, p. 428 ; Jean Philopon, dans Proclus, ''De aeternitate mundi'', VI, 27, éd. Hugo Rabe, Leipzig, Teubner, 1899, p. 145.</ref>.
La tradition d'une rupture violente entre Aristote et Platon, attestée par certaines sources tardives, est aujourd'hui considérée par la critique moderne comme issue probablement des polémiques ultérieures entre épicuriens et péripatéticiens<ref>Les récits de Diogène Laërce évoquant une rupture violente sont jugés peu fiables par la plupart des biographes modernes. Voir Werner Jaeger, ''Aristote'', op. cit., p. 113-128.</ref>. Plusieurs éléments suggèrent au contraire des liens durables entre les deux philosophes : Aristote composa une élégie en l'honneur de son ami Eudème de Chypre, où il évoque Platon comme un maître<ref>Fragment 623 (Rose), conservé par Olympiodore. Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886, p. 42-43.</ref>. Dans l{{'}}''Éthique à Nicomaque'', Aristote écrit : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels, surtout quand on est philosophe : vérité et amitié nous sont chères l'une et l'autre, mais c'est pour nous un devoir sacré d'accorder la préférence à la vérité »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096 a 12-17, trad. J. Tricot, Paris, Vrin, 1959, p. 44.</ref><ref>Cette phrase a été condensée en latin par l'adage ''Amicus Plato, sed magis amica veritas'' : « ami de Platon, mais plus encore ami de la vérité ». Voir Ammonius, ''In Categorias'', éd. Busse, Berlin, Reimer, 1895, p. 79.</ref>.
Aristote participa à l'enseignement de l'Académie. On lui attribue notamment la charge du cours de rhétorique, qu'il aurait inauguré, selon certains témoignages, par cette formule : « Il serait honteux de se taire et de laisser parler Isocrate »<ref>Cette boutade visait Isocrate, le rival de Platon en matière d'enseignement rhétorique. Voir Werner Jaeger, ''Aristote'', op. cit., p. 180-182.</ref><ref>Philodème, ''Volumina rhetorica'', II, 36, 3-5, éd. Siegfried Sudhaus, Leipzig, Teubner, 1892-1896, vol. II, p. 50 ; Cicéron, ''De Oratore'', III, 35, 141 ; Quintilien, ''Institutio oratoria'', III, 1, 14.</ref>. Cette période fut également celle de ses premières publications, sous forme de dialogues à la manière platonicienne, dont la plupart sont aujourd'hui perdus<ref>Cicéron loua plus tard la qualité littéraire de ces dialogues, parlant d'un ''flumen orationis aureum'' : « un fleuve d'or de paroles ». Cicéron, ''Academica priora'', II, 38, 119.</ref>.
=== Voyages et maturation (348-335 av. J.-C.) ===
À la mort de Platon en 347, c'est le neveu du Maître, Speusippe, qui prend la direction de l'Académie. Aristote quitte alors Athènes — selon certaines hypothèses parce qu'il aurait espéré la succession, selon d'autres en raison du climat politique antimacédonien<ref>Voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 5.</ref>. Il se rend à Atarnée et Assos, en Troade (Asie Mineure), auprès de son ami Hermias, ancien condisciple de l'Académie devenu tyran d'Atarnée<ref>Hermias avait été esclave, puis affranchi, avant de devenir maître d'Atarnée et d'Assos. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>. Aristote y séjourne trois ans (347-345), accompagné probablement de Xénocrate<ref>Strabon, ''Géographie'', XIII, 1, 57, trad. F. Lasserre, Paris, Les Belles Lettres, 1981, p. 84-85.</ref>. Il y poursuit ses recherches philosophiques et biologiques<ref>C'est durant ce séjour qu'Aristote aurait entrepris des observations sur la faune marine de la côte d'Asie Mineure, dont témoignent l{{'}}''Histoire des Animaux'' et d'autres traités zoologiques. Voir David M. Balme, « The Place of Biology in Aristotle's Philosophy », dans Allan Gotthelf & James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987, p. 9-20.</ref>.
Hermias, pris dans les luttes entre la Macédoine et la Perse, fut capturé en 341 av. J.-C. par trahison sur ordre d'Artaxerxès III, le roi de Perse, torturé et exécuté<ref>Selon les sources antiques, Hermias refusa, malgré les tortures, de trahir ses liens avec Philippe II de Macédoine. Voir Werner Jaeger, ''Aristote'', op. cit., p. 138-142.</ref><ref>Diodore de Sicile, ''Bibliothèque historique'', XVI, 52, trad. P. Goukowsky, Paris, Les Belles Lettres, 1976, p. 164-165.</ref>. Aristote composa un Hymne à la Vertu en son honneur et fit ériger une statue à Delphes portant une épigramme à sa mémoire<ref>Fragments 624 et 625 (Rose), conservés par Diogène Laërce (V, 7-8) et Athénée (''Deipnosophistes'', XV, 696 a-c). Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', op. cit., p. 43-44.</ref>. Il épousa également Pythias, nièce ou fille adoptive d'Hermias, dont il aura une fille du même nom<ref>Dans son testament, Aristote prescrit que ses cendres soient mêlées à celles de Pythias. Diogène Laërce, ''Vies'', V, 16, op. cit., p. 582.</ref>.
Après la mort d'Hermias, Aristote quitte Assos pour Mytilène, sur l'île de Lesbos, en 345-344 av. J.-C. Il y poursuit pendant deux à trois ans ses observations biologiques et zoologiques, notamment sur les lagunes de Pyrrha<ref>De nombreuses observations précises de l{{'}}''Histoire des Animaux'' se rapportent à la faune de Lesbos. Voir Pierre Louis, « Introduction », dans Aristote, ''Histoire des Animaux'', tome I, Paris, Les Belles Lettres, 1964, p. XIV-XVIII.</ref>.
=== Précepteur d'Alexandre le Grand (343-336 av. J.-C.) ===
En 343-342 av. J.-C., Philippe II de Macédoine, qui avait connu Aristote dans sa jeunesse grâce à Nicomaque, appelle le philosophe à la cour de Pella pour devenir le précepteur de son fils, le jeune prince Alexandre, alors âgé de treize ans<ref>Voir Werner Jaeger, ''Aristote'', op. cit., p. 145-148.</ref><ref>Plutarque, ''Vie d'Alexandre'', 7-8, trad. R. Flacelière & É. Chambry, Paris, Les Belles Lettres, 1975, p. 33-34.</ref>. Aristote enseigne au prince pendant deux ou trois ans, probablement à Miéza<ref>Miéza était située à l'ouest de Pella, dans un environnement champêtre propice aux études. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 15-16.</ref>.
L'enseignement donné à Alexandre portait essentiellement sur la politique, l'éthique, la poésie et les lettres grecques<ref>Selon Plutarque, Aristote aurait fait connaître à Alexandre une édition annotée de l{{'}}''Iliade''. Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref><ref>Plutarque rapporte également un mot d'Alexandre selon lequel il aimait Aristote autant que son père : « si je dois la vie à l'un, je dois à l'autre de savoir bien vivre ». Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref>. Aristote composa peut-être à cette époque un traité ''Sur la Royauté'' (''Peri basileias''), aujourd'hui perdu<ref>Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', Louvain, Éditions universitaires, 1951, p. 157-158.</ref>.
Les relations entre le maître et l'élève demeurent difficiles à reconstituer avec certitude. Alors qu'Aristote, dans ses ''Politiques'', prône une distinction entre Grecs et Barbares<ref>Aristote considère, dans certains passages, que les Barbares sont naturellement faits pour être gouvernés par les Grecs. Aristote, ''Politique'', I, 2, 1252 b 5-9, trad. J. Aubonnet, Paris, Les Belles Lettres, 1960, p. 10-11.</ref>, Alexandre adopta une politique d'intégration des peuples conquis et de fusion entre Grecs et Orientaux<ref>Sur ces divergences, voir Werner Jaeger, ''Aristote'', op. cit., p. 148-152.</ref>. En 335 av. J.-C., lors du départ d'Alexandre pour la conquête de l'Asie, Aristote propose son neveu Callisthène pour l'accompagner comme conseiller et historiographe<ref>Voir Felix Jacoby, ''Die Fragmente der griechischen Historiker'', Berlin, Weidmann, 1923-1958, 124 F 1.</ref>. Callisthène, refusant d'adopter la proskynèse exigée par Alexandre, encourut sa disgrâce et fut exécuté vers 327 av. J.-C.<ref>Diogène Laërce (V, 5) et Plutarque (''Vie d'Alexandre'', 55) rapportent cette fin. Voir Diogène Laërce, ''Vies'', op. cit., p. 575-576 ; Plutarque, ''Vie d'Alexandre'', op. cit., p. 81-83.</ref>.
=== Fondation du Lycée et enseignement à Athènes (335-323 av. J.-C.) ===
En 335-334 av. J.-C., après la défaite athénienne face à la Macédoine à Chéronée (338 av. J.-C.), Aristote retourne à Athènes. Il y fonde sa propre école, le Lycée (''Lykeion''), nommé d'après le temple d'Apollon Lycien situé à proximité<ref>Le Lycée était un gymnase entouré de jardins et de promenoirs couverts (''peripatoi''), d'où le nom d'« école péripatéticienne » donné aux disciples d'Aristote. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 21-24.</ref><ref>Le site archéologique du Lycée fut découvert fortuitement en 1996 lors de travaux au centre d'Athènes. Voir Effi Lygouri, « The Lyceum of Aristotle in Athens », dans ''Acta Musei Nationalis Pragae. Series A – Historia'', 60, 1-2, 2006, p. 47-52.</ref>.
Aristote y enseigne pendant douze ou treize ans, de 335 à 323 av. J.-C., période durant laquelle il rédige la plupart des traités systématiques (''pragmateiai'') qui nous sont parvenus<ref>Ces traités, dits « acroamatiques » ou « ésotériques », étaient destinés à l'enseignement interne, par opposition aux dialogues « exotériques » écrits pour un large public. Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', op. cit., p. 3-85.</ref>. Selon Aulu-Gelle, son enseignement comportait deux modalités : le matin, des leçons approfondies sur la philosophie, la physique et la métaphysique, réservées aux disciples avancés ; l'après-midi, des cours plus accessibles de rhétorique et de dialectique, ouverts à un public plus large<ref>Aulu-Gelle, ''Nuits attiques'', XX, 5, trad. R. Marache, Paris, Les Belles Lettres, 1978, tome IV, p. 185-186.</ref>.
Aristote professait, selon la tradition, en se promenant (''peripatein'') avec ses disciples dans les allées du gymnase, d'où le nom d'école péripatéticienne donné à son école<ref>Diogène Laërce, ''Vies'', V, 2, op. cit., p. 574.</ref>. Il constitua au Lycée une bibliothèque et des collections d'histoire naturelle (animaux, plantes, minéraux, cartes géographiques)<ref>Selon Pline l'Ancien, Alexandre aurait aidé son ancien maître en lui envoyant d'Asie des spécimens zoologiques et botaniques. Pline l'Ancien, ''Histoire naturelle'', VIII, 17, trad. A. Ernout, Paris, Les Belles Lettres, 1952, p. 23. Cette tradition est cependant tardive et son authenticité est discutée.</ref>. Il entreprit également avec ses collaborateurs la rédaction des 158 Constitutions (''Politeiai'') des cités grecques et barbares, dont seule la ''Constitution d'Athènes'' nous est parvenue<ref>Cette œuvre fut probablement un travail collectif sous la direction d'Aristote. Voir Mortimer Chambers, « Aristotle's Forms of Democracy », dans ''Transactions and Proceedings of the American Philological Association'', 92, 1961, p. 20-36.</ref>.
=== Exil et mort (323-322 av. J.-C.) ===
À la mort d'Alexandre le Grand, survenue à Babylone en juin 323 av. J.-C., une réaction antimacédonienne éclate à Athènes<ref>Voir Werner Jaeger, ''Aristote'', op. cit., p. 387-390.</ref>. Aristote, en tant que métèque proche de la Macédoine, se trouve menacé<ref>En tant que métèque, Aristote n'avait jamais eu le droit de cité athénien. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 32-33.</ref>. Un certain Démophile, peut-être prêtre d'Éleusis, l'accuse d'impiété (''asebeia''), lui reprochant d'avoir composé l'Hymne à la Vertu en l'honneur d'Hermias, honneur normalement réservé aux dieux<ref>Cette accusation rappelle évidemment le procès de Socrate en 399 av. J.-C. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 346-350.</ref><ref>Diogène Laërce, ''Vies'', V, 5-6, op. cit., p. 575-576.</ref>.
Sans attendre le jugement, Aristote quitte Athènes et se réfugie à Chalcis, en Eubée, ville natale de sa mère<ref>Selon Aulu-Gelle, Aristote aurait déclaré vouloir « empêcher les Athéniens de commettre un second crime contre la philosophie », allusion au procès de Socrate. Aulu-Gelle, ''Nuits attiques'', III, 3, 10, op. cit., tome I, p. 151.</ref>. Il confie la direction du Lycée à Théophraste d'Érèse<ref>Théophraste dirigera le Lycée pendant trente-cinq ans, jusqu'en 288-287 av. J.-C. Voir Diogène Laërce, ''Vies'', V, 36-57, op. cit., p. 590-601.</ref>.
Aristote meurt à Chalcis en 322 av. J.-C., à l'âge de soixante-deux ans, probablement des suites d'une maladie d'estomac<ref>La légende d'un suicide par absorption de ciguë, rapportée par certaines sources tardives, n'est pas retenue par les historiens modernes. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 350-355.</ref><ref>Son testament, conservé par Diogène Laërce (V, 11-16), prescrit notamment que ses cendres soient mêlées à celles de sa première épouse Pythias. Voir Diogène Laërce, ''Vies'', op. cit., p. 579-582.</ref>. Ses cendres furent inhumées à Stagire<ref>Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 355-358.</ref>.
Aristote laissait deux enfants : Pythias, née de son premier mariage, destinée à épouser Nicanor, le fils adoptif du philosophe, et Nicomaque, né de son second mariage avec Herpyllis d'Assos<ref>C'est à ce dernier que fut dédiée l'''Éthique à Nicomaque'' — sans qu'il soit certain que ce titre traduise une dédicace personnelle plutôt qu'un choix éditorial postérieur. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 35-36.</ref><ref>Dans son testament, Aristote témoigne d'une grande reconnaissance envers Herpyllis. Diogène Laërce, ''Vies'', V, 12-13, op. cit., p. 580.</ref>.
== L'œuvre aristotélicienne : constitution et transmission ==
La constitution et la transmission de l'œuvre d'Aristote représentent l'un des dossiers les plus complexes de l'histoire de la philosophie antique. L'accès à la pensée du Stagirite est tributaire d'un processus historique long, marqué par des péripéties qui ont conditionné la forme sous laquelle nous lisons aujourd'hui ses écrits<ref>Pour une synthèse récente, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 5-7 ; Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>.
=== La double nature de l'œuvre aristotélicienne ===
L'œuvre d'Aristote se composait à l'origine de deux types d'écrits distincts. D'une part, les écrits exotériques (ἐξωτερικοὶ λόγοι), destinés à un public extérieur à l'école et composés sous forme de dialogues à la manière platonicienne entre 360 et 345 av. J.-C.<ref>Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 22-27.</ref>. Ces dialogues de jeunesse, dont Cicéron louait les qualités littéraires en qualifiant le style d'Aristote de « fleuve d'or » (''flumen aureum'')<ref>Cicéron, ''Academica'', II, 38, 119.</ref>, comprenaient notamment le ''Gryllos ou De la rhétorique'', l'''Eudème ou De l'âme'' sur l'immortalité de l'âme, le ''Protreptique'' et le traité ''Sur la philosophie''<ref>Fragments rassemblés dans V. Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886.</ref>. Ces œuvres ne nous sont parvenues que sous forme de fragments.
D'autre part, les écrits acroamatiques ou ésotériques (ἀκροαματικοί, ἐσωτερικοί), réservés aux disciples du Lycée et destinés à un usage interne à l'école<ref>Sur cette distinction, voir Aulu-Gelle, ''Nuits attiques'', XX, 5 ; Plutarque, ''Vie d'Alexandre'', 7.</ref>. Ces textes constituent l'essentiel du corpus aristotélicien tel que nous le connaissons aujourd'hui. Ils prennent vraisemblablement la forme de notes de cours, de résumés ou de mémoires de recherche élaborés par Aristote et ses collaborateurs. Selon Pierre Pellegrin, on pourrait considérer en termes modernes que « le texte aristotélicien que nous lisons aujourd'hui est plutôt le compte-rendu d'un séminaire donné par Aristote, qu'un ouvrage rédigé en bonne et due forme »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>.
=== Le sort de la bibliothèque d'Aristote ===
L'histoire de la transmission est intimement liée au destin de la bibliothèque personnelle d'Aristote. À sa mort en 322 av. J.-C., Aristote légua sa bibliothèque à son successeur à la tête du Lycée, Théophraste d'Érèse<ref>Diogène Laërce, ''Vies'', V, 51-52.</ref>. Selon le récit de Strabon, à la mort de Théophraste vers 288 av. J.-C., la bibliothèque fut léguée à Nélée de Scepsis, fils de Coriscos et disciple d'Aristote et de Théophraste<ref>Strabon, ''Géographie'', XIII, 1, 54 (608-609 C) ; voir aussi Plutarque, ''Sylla'', 26, 1-3.</ref>.
Nélée, en quittant Athènes pour retourner à Scepsis en Troade, emporta avec lui les manuscrits autographes d'Aristote et de Théophraste. Ses descendants, peu instruits selon Strabon, auraient caché ces livres dans une cave pour éviter qu'ils ne soient confisqués par les rois Attalides de Pergame<ref>Strabon, ''Géographie'', XIII, 1, 54.</ref>. Les ouvrages auraient ainsi été enfouis pendant près de deux siècles. Ce récit de Strabon, longtemps accepté tel quel, est aujourd'hui partiellement contesté : la recherche moderne souligne qu'il ne faut pas conclure de la dispersion d'une partie des manuscrits autographes que les œuvres d'Aristote auraient été totalement inaccessibles avant Andronicos<ref>Voir P. Moraux, ''Der Aristotelismus bei den Griechen'', vol. I, Berlin-New York, De Gruyter, 1973, p. 3-31. La critique moderne souligne que les philosophes hellénistiques (stoïciens, épicuriens) connaissaient et discutaient certaines thèses aristotéliciennes, ce qui suppose un accès au moins partiel aux écrits du Stagirite.</ref>.
Ce n'est qu'au début du Ier siècle av. J.-C. que ces textes furent redécouverts et achetés par Apellicon de Téos, un riche bibliophile athénien<ref>Athénée, ''Deipnosophistes'', V, 214d = Posidonios, FGrHist 87 F 36.</ref>. Apellicon entreprit de restaurer les manuscrits endommagés, mais aurait, selon Strabon, commis de nombreuses erreurs en comblant les lacunes<ref>Strabon, ''Géographie'', XIII, 1, 54.</ref>.
=== Le transfert à Rome et l'édition d'Andronicos ===
En 86 av. J.-C., lors de la prise d'Athènes, le général Sylla s'empara de la bibliothèque d'Apellicon et la fit transporter à Rome<ref>Plutarque, ''Sylla'', 26, 2 ; Strabon, ''Géographie'', XIII, 1, 54.</ref>. À Rome, ces manuscrits furent confiés au grammairien Tyrannion d'Amisos<ref>Strabon, ''Géographie'', XIII, 1, 54 ; Cicéron, ''Lettres à Atticus'', IV, 10, 1.</ref>.
C'est finalement Andronicos de Rhodes, onzième scholarque du Lycée et philosophe péripatéticien actif vers 60 av. J.-C., qui établit la première édition systématique des œuvres d'Aristote et de Théophraste<ref>Porphyre, ''Vie de Plotin'', 24 ; voir aussi David l'Arménien, ''Prolégomènes'', CAG XVIII, 2, p. 32-33.</ref>. Andronicos ne se contenta pas de publier les textes : il les organisa selon un ordre thématique probablement différent de celui voulu par Aristote, en regroupant les traités par affinité de contenu. La division traditionnelle du corpus en écrits logiques (réunis plus tard sous le titre d'Organon), physiques, biologiques, métaphysiques, éthiques et politiques en résulte<ref>Voir Simplicius, ''In Categorias'', CAG VIII, p. 4, 28-5, 4 ; Alexandre d'Aphrodise, ''In Metaphysica'', CAG I, p. 171, 5-8.</ref>. Comme le souligne Pellegrin, Andronicos « a uni des passages qui étaient originairement disjoints, gommé des contradictions, ménagé des transitions », et il a probablement « introduit dans le texte des matériaux issus de discussions et de critiques » faites en marge des cours du Lycée<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>.
C'est également à Andronicos que l'on doit le titre de Métaphysique (τὰ μετὰ τὰ φυσικά), qui signifie littéralement « ce qui vient après les [livres] physiques »<ref>Voir ''Métaphysique'', éd. W.D. Ross, Oxford, Clarendon Press, 1924, vol. I, p. XXXII-XLIII ; Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Aristote lui-même n'utilisait jamais ce terme, préférant parler de « philosophie première » (πρώτη φιλοσοφία) ou de « science théologique » (θεολογική)<ref>Aristote, ''Métaphysique'', E (VI), 1, 1026a19-23 ; K (XI), 7, 1064b1-3.</ref>.
=== Les conséquences pour notre accès au texte ===
Cette histoire éditoriale a eu des conséquences majeures pour notre connaissance de la pensée d'Aristote. La perte quasi totale des écrits exotériques nous prive d'un pan de son œuvre, celui qui était le mieux connu dans l'Antiquité<ref>Sur l'« autre » Aristote perdu, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>. L'état fragmentaire des manuscrits retrouvés et leur restauration introduisent des incertitudes textuelles. L'organisation systématique imposée par Andronicos, bien qu'elle ait permis la préservation et la diffusion de l'œuvre, ne correspond probablement pas à l'ordre de composition ni à l'organisation originelle voulue par Aristote.
La reconstruction d'une chronologie relative des œuvres pose des difficultés méthodologiques. Werner Jaeger, dans son ouvrage ''Aristoteles. Grundlegung einer Geschichte seiner Entwicklung'' (1923), a proposé de dater les textes selon leur plus ou moins grande proximité avec le platonisme<ref>Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', op. cit.</ref>. Cette « approche génétique » a été largement critiquée et n'est plus acceptée dans son ensemble : le « degré de platonicité » d'un texte est difficile à évaluer, et le corpus aristotélicien se prête mal aux examens stylométriques utilisés pour le corpus platonicien<ref>Pour une critique de l'approche génétique de Jaeger, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6-8 ; Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction. La recherche actuelle aborde l'œuvre comme un tout cohérent sans pour autant la juger systématique.</ref>.
Le texte d'Aristote tel que nous le connaissons est ainsi le produit d'une longue chaîne de transmission, qui passe par les commentateurs néoplatoniciens (Alexandre d'Aphrodise, Simplicius, Philopon), la tradition arabe médiévale (Al-Fârâbî, Avicenne, Averroès), puis la redécouverte occidentale à partir du XIIIe siècle<ref>Pour l'histoire de la transmission médiévale, voir F.E. Peters, ''Aristoteles Arabus'', Leiden, Brill, 1968 ; L. Minio-Paluello, ''Opuscula. The Latin Aristotle'', Amsterdam, Hakkert, 1972.</ref>.
== Aristote et Platon : continuité et rupture ==
La relation entre Aristote et Platon a fait l'objet d'interprétations divergentes dans l'histoire de la philosophie. Les commentateurs néoplatoniciens, de Porphyre à Simplicius, ont insisté sur l'harmonie fondamentale entre les deux philosophes<ref>Simplicius, ''In Categorias'', CAG VIII, éd. K. Kalbfleisch, Berlin, Reimer, 1907, p. 7, 23-32.</ref>. À l'inverse, une partie de la tradition occidentale, depuis la Renaissance, a mis l'accent sur leurs divergences. Coleridge résume cette opposition dans la formule : « Tout homme est né aristotélicien ou platonicien »<ref>Samuel Taylor Coleridge, ''Table Talk'', 2 juillet 1830, dans ''The Table Talk and Omniana of Samuel Taylor Coleridge'', Londres, Oxford University Press, 1917, p. 90.</ref>.
La recherche contemporaine privilégie une approche plus nuancée, qui examine simultanément les points de continuité et de rupture. Aristote s'oppose à Platon sur des questions ontologiques fondamentales, tout en demeurant tributaire de l'héritage académicien. Comme il l'écrit lui-même : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096a11-17, trad. J. Tricot, op. cit., p. 44.</ref>.
=== La critique aristotélicienne des Idées platoniciennes ===
==== Le rejet de la séparation (''chôrismos'') ====
L'un des points de rupture entre Aristote et Platon concerne le statut ontologique des Idées ou Formes (''eidos''). Pour Platon, les Idées constituent un monde intelligible séparé (''chôristos'') du monde sensible. Elles sont immuables, éternelles, et possèdent une existence autonome et transcendante. Les choses sensibles ne sont que des copies imparfaites qui participent (''methexis'') aux Idées ou les imitent (''mimêsis'')<ref>Platon, ''Phédon'', 74a-75d, 100c-102a ; ''République'', VI, 509d-511e, trad. É. Chambry, Paris, Les Belles Lettres, 1932-1934.</ref>. Dans le ''Phédon'', Platon affirme ainsi que « rien d'autre ne rend belle une chose que la présence ou la communion (on ne sait comment elle se fait) avec le Beau en soi »<ref>Platon, ''Phédon'', 100d, trad. M. Dixsaut, Paris, Flammarion, 1991, p. 315.</ref>.
Aristote refuse cette séparation des Idées. Dans la ''Métaphysique'', il consacre plusieurs chapitres à une critique systématique de la théorie platonicienne<ref>Aristote, ''Métaphysique'', A, 6, 987a29-988a17 ; A, 9, 990a34-993a10 ; M, 4-5, 1078b7-1080a11 ; N, 2, 1088b35-1090a2.</ref>. Ses objections portent sur trois points principaux<ref>Pour une analyse détaillée de ces critiques, voir Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', Londres-New York, Routledge, 2004, chap. 3-4.</ref>.
Premièrement, l'inutilité explicative des Idées séparées. Aristote soutient que les Idées ne peuvent rendre compte ni de l'existence ni du devenir des choses sensibles : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est prononcer des mots vides et faire des métaphores poétiques »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22, trad. J. Tricot, Paris, Vrin, 1953, t. I, p. 61.</ref>. Les Idées platoniciennes, étant immobiles et éternelles, ne peuvent expliquer le mouvement et le changement observés. Selon Aristote, Platon n'a pas identifié la cause efficiente (''archê tês kinêseôs'')<ref>Aristote, ''Métaphysique'', A, 9, 992a24-29.</ref>.
Deuxièmement, l'argument du « Troisième Homme ». Aristote reprend ici une objection déjà formulée dans le ''Parménide'' de Platon lui-même<ref>Platon, ''Parménide'', 132a-b.</ref>. Si l'on postule une Idée séparée de l'Homme pour expliquer ce que plusieurs hommes ont en commun, alors on doit également postuler une troisième Idée pour expliquer ce que l'Idée de l'Homme et les hommes particuliers ont en commun, et ainsi à l'infini<ref>Aristote, ''Métaphysique'', A, 9, 990b15-17 ; Z, 13, 1039a2-3 ; ''De la Sophistique'', 22, 178b36-179a10.</ref>.
Troisièmement, le dédoublement inutile du monde. Postuler un monde intelligible d'Idées séparées revient, selon Aristote, à « doubler les difficultés » sans les résoudre<ref>Aristote, ''Métaphysique'', A, 9, 990b1-4.</ref>. « Les Platoniciens font exister autant de substances séparées qu'il y a de choses naturelles, comme si quelqu'un, voulant compter des objets, estimait qu'il ne le pourrait pas quand ils sont en petit nombre, et croyait y parvenir en les multipliant »<ref>Aristote, ''Métaphysique'', A, 9, 990b4-8, trad. J. Tricot, op. cit., p. 60.</ref>.
==== L'hylémorphisme aristotélicien ====
À la théorie platonicienne de la participation, Aristote oppose la théorie hylémorphique. Selon cette conception, les êtres sensibles ne sont pas des copies imparfaites d'Idées transcendantes, mais des composés (''sunolon'') de matière (''hulê'') et de forme (''morphê'' ou ''eidos'')<ref>Aristote, ''Métaphysique'', Z, 3, 1029a1-7 ; H, 1-3, 1042a24-1043b23 ; ''Physique'', II, 1-2, 192b8-194a12.</ref>.
La forme aristotélicienne n'est pas séparée des choses sensibles : elle est immanente à la matière qu'elle informe. La forme du cheval n'existe pas dans un monde intelligible séparé, mais uniquement dans les chevaux individuels concrets. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence (''to ti ên einai'')<ref>Aristote, ''Métaphysique'', Z, 4-6, 1029b13-1031b14 ; Z, 7, 1032b1-2.</ref>. « Par forme, j'entends l'essence de chaque chose et sa substance première »<ref>Aristote, ''Métaphysique'', Z, 7, 1032b1-2, trad. J. Tricot, op. cit., t. I, p. 372.</ref>.
Cette conception hylémorphique permet de répondre à plusieurs problèmes posés par la théorie platonicienne. Elle explique le devenir : la génération d'une substance est le passage de la puissance (''dunamis'') à l'acte (''energeia''), l'actualisation d'une forme dans une matière. Elle sauvegarde l'individualité des substances premières, c'est-à-dire des individus concrets (''tode ti'')<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 13, 1038b23-1039a3.</ref>. Elle unifie enfin forme et finalité : la forme est à la fois cause formelle et cause finale, ce vers quoi tend le développement naturel de la chose<ref>Aristote, ''Physique'', II, 1, 193b12-13 ; II, 7, 198a24-27.</ref>.
=== La critique de la participation et de l'imitation ===
Platon utilise principalement deux concepts pour expliquer la relation entre les choses sensibles et les Idées : la participation (''methexis'') et l'imitation (''mimêsis''). Aristote critique ces notions, qu'il juge métaphoriques et non explicatives<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22 ; M, 5, 1079b24-26.</ref>.
La notion de participation pose des problèmes conceptuels que Platon lui-même a identifiés dans le ''Parménide''<ref>Platon, ''Parménide'', 130e-134e.</ref>. Si l'Idée tout entière est présente en chaque chose qui y participe, alors l'Idée se trouve séparée d'elle-même. Mais si c'est seulement une partie de l'Idée qui est présente en chaque chose, alors l'Idée se divise<ref>Platon, ''Parménide'', 131a-e.</ref>.
Selon Aristote, Platon n'a pas résolu ces difficultés : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est ne rien dire, car participer, qu'est-ce que c'est ? »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-21.</ref>. Pour Aristote, « ce que les Pythagoriciens appelaient "imitation", les Platoniciens l'ont appelé "participation", mais tous se bornent à changer le nom sans expliquer ce que peut bien être cette participation ou cette imitation des Idées »<ref>Aristote, ''Métaphysique'', A, 6, 987b10-13, trad. J. Tricot, op. cit., t. I, p. 49.</ref>.
Pour Aristote, la ressemblance entre les individus d'une même espèce s'explique par la possession d'une même forme immanente, transmise dans la génération naturelle : « L'homme engendre l'homme » (''anthrôpos anthrôpon genna'')<ref>Aristote, ''Métaphysique'', Z, 7, 1032a25 ; Z, 8, 1033b32-1034a2 ; Λ, 3, 1070a8.</ref>. Trois facteurs interviennent dans la génération : la matière (fournie par la femelle, selon Aristote), la forme (transmise par le mâle) et la privation (l'absence initiale de la forme dans la matière)<ref>Aristote, ''Physique'', I, 7, 190b10-191a7 ; ''De la Génération des Animaux'', I, 20-21, 729a9-730a32. Cette doctrine de la « contribution » respective des sexes reflète des préjugés de l'époque qu'il importe de signaler ; voir, pour une mise au point critique, Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021.</ref>.
=== Substance, essence et ''ousia'' ===
Le terme grec ''ousia'', traduit en latin par ''substantia'' ou ''essentia'', possède des significations différentes chez Platon et Aristote. Comme le note Pellegrin, ''ousia'' est en fait « difficile à traduire, car le terme représente, chez Aristote, trois choses différentes : la forme, la matière, et le composé des deux »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Ousia / Substance », p. 175-176, citant ''Métaphysique'', Z, 3, 1029a27-33.</ref>.
Chez Platon, l{{'}}''ousia'' désigne principalement l'Idée, la réalité véritable, immuable et éternelle, par opposition aux choses sensibles<ref>Platon, ''Phédon'', 78c-d ; ''République'', V, 477a-478e ; VI, 484b-486d.</ref>. Chez Aristote, l{{'}}''ousia'' désigne avant tout, dans les ''Catégories'', la substance première : l'individu concret qui existe par lui-même<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 3, 1028b33-1029a7.</ref>. Aristote distingue alors la substance première de la substance seconde, qui désigne l'espèce ou le genre auquel appartient l'individu<ref>Aristote, ''Catégories'', 5, 2a14-17.</ref>.
Le rapport entre cette doctrine des ''Catégories'' et la théorie de la substance développée dans les livres centraux de la ''Métaphysique'' (Z, H, Θ) est l'un des points les plus discutés de l'aristotélisme contemporain. Annick Jaulin souligne que la « doctrine » aristotélicienne de la substance n'est pas une donnée stabilisée mais l'objet d'une recherche : Aristote « invente une théorie de la forme qui intègre le mouvement »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Dans la ''Métaphysique'', la forme (''eidos'') apparaît comme le meilleur candidat au titre de substance, mais cette identification soulève à son tour la question de l'unité du composé hylémorphique<ref>Pour un panorama des débats, voir Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', Stuttgart, Metzler, 2011, chap. IV.18 ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 5-7.</ref>. Comme le résume Pellegrin, « ''ousia'' signifie donc la chose (la substance) et ses causes internes, la matière et la forme ; la forme est ce qui correspond à l'essence »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 176.</ref>.
=== Éléments de continuité entre Platon et Aristote ===
Au-delà des divergences ontologiques, Platon et Aristote partagent plusieurs convictions communes. La première est la primauté de la forme sur la matière dans l'ordre de l'intelligibilité, de la réalité et de la perfection. Pour Platon comme pour Aristote, la matière pure, prise en elle-même, est indéterminée<ref>Platon, ''Timée'', 49a-52d ; Aristote, ''Métaphysique'', Z, 10, 1036a8-9.</ref>.
La deuxième est la finalité dans la nature. Platon présente le cosmos comme l'œuvre d'un Démiurge qui organise la matière en regardant vers les Idées<ref>Platon, ''Timée'', 28a-30c.</ref>. Aristote intériorise et naturalise cette téléologie : la nature elle-même agit en vue d'une fin (''hê phusis heneka tou poiei''), sans qu'il soit besoin de postuler un Démiurge extérieur ou des Idées transcendantes<ref>Aristote, ''Physique'', II, 8, 198b10-199a8 ; ''Des Parties des Animaux'', I, 1, 639b14-640a9. Pour une discussion détaillée de la téléologie aristotélicienne, voir Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012 ; James G. Lennox, ''Aristotle's Philosophy of Biology'', Cambridge, Cambridge University Press, 2001.</ref>.
La troisième est la connaissance par les causes : pour les deux philosophes, la véritable connaissance scientifique consiste à connaître les causes (''aitiai'') des choses<ref>Platon, ''Phédon'', 96a-99d ; Aristote, ''Physique'', II, 3, 194b16-195b30 ; ''Seconds Analytiques'', I, 13, 78a22-b4.</ref>. Aristote reproche cependant à Platon d'avoir négligé la cause efficiente et la cause finale<ref>Aristote, ''Métaphysique'', A, 6, 988a8-17 ; A, 9, 992a24-29 ; Λ, 10, 1075b37-1076a4.</ref>.
La quatrième concerne la définition et l'universel. Platon et Aristote s'accordent sur le fait que la définition (''horismos'' ou ''logos'') porte sur l'universel et non sur le particulier<ref>Platon, ''Théétète'', 201c-210b ; Aristote, ''Métaphysique'', Z, 15, 1039b27-1040a7.</ref>. Mais Aristote opère une distinction fondamentale entre l'ordre de l'être (où le particulier est premier) et l'ordre de la connaissance (où l'universel est premier)<ref>Aristote, ''Métaphysique'', Z, 13, 1038b8-16 ; ''Seconds Analytiques'', I, 2, 71b33-72a5.</ref>.
=== La dialectique et le rôle de l'expérience sensible ===
Platon et Aristote sont tous deux héritiers de la méthode dialectique inaugurée par Socrate, qui consiste à examiner les opinions par le dialogue argumenté<ref>Platon, ''République'', VII, 533c-534e ; Aristote, ''Topiques'', I, 1-2, 100a18-101b4.</ref>. Aristote conserve cette approche : il commence presque toujours par recenser les opinions des prédécesseurs (''doxographia''), examine les difficultés (''aporiai''), avant de proposer sa propre solution<ref>Aristote, ''Éthique à Nicomaque'', VII, 1, 1145b2-7.</ref>. Cependant, pour Aristote, la dialectique est un outil préparatoire et non une science apodictique<ref>Aristote, ''Topiques'', I, 2, 101a25-b4 ; ''Métaphysique'', Γ, 2, 1004b17-26.</ref>.
Une divergence importante porte sur le rôle de l'expérience sensible. Pour Platon, les sens nous maintiennent dans l'opinion (''doxa'')<ref>Platon, ''Phédon'', 66b ; ''République'', VII, 514a-517c.</ref>. Aristote accorde au contraire une place fondamentale à l'expérience sensible : la science porte sur l'universel, mais cet universel est abstrait à partir des données sensibles par un processus d'induction (''epagôgê'')<ref>Aristote, ''Seconds Analytiques'', II, 19, 100b3-5, trad. J. Tricot, Paris, Vrin, 1947, p. 242 ; ''De l'Âme'', III, 8, 432a3-10.</ref>.
=== Bilan : continuité et rupture ===
Une partie de l'historiographie contemporaine décrit l'aristotélisme comme une reformulation immanentiste des problèmes hérités du platonisme : la forme « descend » du ciel des Idées pour s'incarner dans les choses, le Bien se réalise dans l'accomplissement de la nature propre de chaque être, la philosophie reconnaît que seuls existent les individus concrets dans lesquels l'universel se réalise. Cette caractérisation, parfois résumée par l'expression « naturalisation du platonisme », demeure toutefois une thèse interprétative dont la portée varie selon les commentateurs ; elle ne fait pas consensus dans la recherche universitaire et doit être attribuée à des travaux secondaires précis<ref>Cette interprétation est défendue notamment par certains chercheurs proches de la tradition de Pierre Aubenque ; voir ''Le problème de l'être chez Aristote'', Paris, PUF, 1962. D'autres travaux, notamment Annick Jaulin, ''Aristote. La métaphysique'', op. cit., insistent au contraire sur l'originalité radicale de la démarche aristotélicienne et son enracinement dans la tradition des penseurs de la nature, plus que dans une « naturalisation » du platonisme.</ref>.
Plus généralement, la querelle entre Platon et Aristote est l'une des plus discutées de l'histoire de la métaphysique occidentale. La tradition philosophique ultérieure n'a jamais tranché définitivement, oscillant entre tentatives de conciliation (néoplatoniciens, Thomas d'Aquin) et radicalisations de l'opposition (nominalistes médiévaux, empiristes modernes).
== La logique : l’''Organon''==
===Présentation générale===
L’''Organon'' désigne le groupe des six traités logiques d’Aristote : les ''Catégories'', le ''De interpretatione'' (ou ''Peri hermeneias''), les ''Premiers Analytiques'', les ''Seconds Analytiques'', les ''Topiques'' et les ''Réfutations sophistiques''. Ces ouvrages couvrent l’étude des termes simples, celle des propositions, la théorie générale du syllogisme, la théorie de la science démonstrative, l’art de la dialectique et la critique des raisonnements fallacieux. Ils ont fourni à la pensée occidentale, pendant deux millénaires, le cadre dominant pour analyser les conditions du raisonnement valide, l’architecture du savoir scientifique et les règles du débat rationnel.
L’importance historique de l’ensemble est grande. C’est dans ces traités qu’Aristote dégage pour la première fois la notion de syllogisme, distingue formellement la validité d’un raisonnement de la vérité de ses prémisses, élabore les instruments logiques liés à la contradiction, au tiers exclu et à la bivalence, et propose une théorie de l’explication scientifique fondée sur la connaissance des causes. La défense philosophique du principe de non-contradiction se trouve, elle, surtout dans la ''Métaphysique'' (livre Γ), et non dans l’''Organon'' lui-même. La syllogistique aristotélicienne a été enseignée dans les écoles et les universités jusqu’au XIX{{e}} siècle, et ses concepts continuent de nourrir des débats contemporains en philosophie de la logique, en métaphysique modale et en philosophie des sciences.
L’unité de l’ensemble est cependant problématique. Aristote n’a jamais composé un ouvrage intitulé ''Organon'' ; le terme et le regroupement sont des opérations éditoriales tardives, attribuées à la tradition péripatéticienne et notamment à Andronicos de Rhodes au I{{er}} siècle avant notre ère. L’ordre traditionnel des traités, qui place la théorie de la science démonstrative au cœur du dispositif, traduit un choix interprétatif qui n’est probablement pas celui d’Aristote lui-même : la recherche contemporaine tend à attribuer aux ''Topiques'' une ancienneté relative et à voir dans la syllogistique formelle un développement plus tardif. Lire la logique aristotélicienne demande donc de tenir compte simultanément de la lettre des traités, de la tradition exégétique qui les a reçus et organisés, et des hypothèses de la recherche actuelle qui en renouvelle les enjeux.
===Architecture et destinée de l’''Organon''===
====Le titre « ''Organon'' » : une création tardive====
Le terme grec ''organon'' signifie « instrument », « outil ». La désignation des six traités logiques sous ce titre commun obéit à une tradition qui ne remonte pas, semble-t-il, à Aristote lui-même.<ref>Pellegrin, P., « Introduction générale à l’''Organon'' », dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007, p. 7-50.</ref> Pierre Pellegrin rappelle, dans son introduction générale à l’''Organon'' paru chez Flammarion, que « "logique", "instrument" sont des termes qu’Aristote emploie en leurs acceptions ordinaires », et non au sens technique que leur ont donné les commentateurs néo-platoniciens. Quand le biologiste Aristote parle d’''organon'', il pense d’abord à l’organe corporel et accessoirement à l’instrument artificiel ; c’est avec la lecture stoïcienne et péripatéticienne que cet « instrument » devient l’instrument ''par excellence'' de la philosophie, c’est-à-dire la logique.
L’enjeu de cette précision dépasse l’érudition. Si la qualification de « logique » et le regroupement des six traités sous l’étiquette « Organon » sont des opérations posthumes, l’ordre traditionnel dans lequel on lit aujourd’hui ces textes (''Catégories'', ''De interpretatione'', ''Premiers Analytiques'', ''Seconds Analytiques'', ''Topiques'', ''Réfutations sophistiques'') n’a rien d’évident ni de nécessaire. Cet ordre s’impose à partir du IV{{e}} siècle de notre ère, et il porte la marque d’un choix interprétatif fondamental.
====L’intervention d’Andronicos de Rhodes====
Vers le milieu du I{{er}} siècle avant notre ère, Andronicos de Rhodes entreprend une édition systématique du corpus aristotélicien à laquelle nous devons en grande partie le texte que nous possédons aujourd’hui. Selon une lecture défendue notamment par Pellegrin et Brunschwig, et qui doit être présentée comme une interprétation forte plutôt que comme un fait définitivement établi, l’intervention d’Andronicos aurait avant tout consisté à réduire la part de la dialectique au profit de celle de l’analytique.<ref>Voir Pellegrin, P., « Introduction générale à l’''Organon'' », dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007, p. 26-44 ; Brunschwig, J., introduction à Aristote, ''Topiques'' (livres I-IV), Les Belles Lettres, 1967, rééd. 2007, p. XXXIII-XLVIII.</ref> Pellegrin résume ainsi ce travail : la « logique » d’Aristote, qu’il n’appelait peut-être pas ainsi mais qui reçut très rapidement ce nom sous l’influence de la division stoïcienne de la philosophie, était avant Andronicos principalement un ensemble de traités consacrés à des activités dialectiques et notamment réfutatives.
Cette réorganisation, si on l’admet, a des conséquences théoriques importantes. En plaçant les ''Seconds Analytiques'' (la théorie du syllogisme scientifique) au centre de gravité de l’''Organon'', Andronicos oriente la lecture de la logique aristotélicienne vers une épistémologie de la science démonstrative à laquelle tous les autres traités servent de propédeutique. Les ''Catégories'' préparent à l’étude des termes, le ''De interpretatione'' à celle des propositions, les ''Premiers Analytiques'' à l’analyse formelle du syllogisme en général ; les ''Topiques'' et les ''Réfutations sophistiques'' apparaissent comme un appendice consacré aux formes secondaires du raisonnement (raisonnements à partir de prémisses simplement probables, raisonnements fallacieux). Or, comme l’a soutenu Brunschwig dans son édition des ''Topiques'', il est très probable que la chronologie de la composition aristotélicienne aille en partie dans le sens inverse : les ''Topiques'' seraient un traité ancien, écrit du temps où Aristote était encore membre de l’Académie platonicienne, et la syllogistique formelle des ''Premiers Analytiques'' représenterait un développement théorique postérieur, élaboré à partir des problèmes rencontrés dans la pratique dialectique. Pellegrin écrit, en synthétisant cette hypothèse : « Le syllogisme scientifique serait alors une forme particulière du syllogisme en général qui aurait des contraintes supplémentaires, au moins au nombre de deux : avoir des prémisses vraies, antérieures à la conclusion et plus connues qu’elle, et donner dans le moyen terme la cause de la conclusion. »
Si cette hypothèse est correcte, ce que nous appelons la « logique aristotélicienne » serait, dans son projet originel, une codification de l’affrontement dialectique, c’est-à-dire d’une pratique d’argumentation entre un ''questionneur'' et un ''répondant'' ; la théorie du syllogisme scientifique en constituerait une spécification ultérieure. Comme l’écrit Brunschwig, cité par Pellegrin, le questionneur dialectique « doit construire une argumentation formellement contraignante, ayant pour prémisses des propositions auxquelles le répondant ne puisse refuser son assentiment, et pour conclusion la proposition contradictoire de celle que soutient le répondant. » Toute la logique aristotélicienne, dans cette perspective, naîtrait du souci de codifier cet exercice argumentatif et de distinguer les bons arguments des mauvais.
====Logique : partie de la philosophie ou instrument ?====
Une question agitée dès l’Antiquité, et sur laquelle Aristote lui-même ne se prononce jamais explicitement, est celle du statut de la logique. Est-elle une ''partie'' de la philosophie, comme le soutiendront les Stoïciens (qui distinguent éthique, physique et logique), ou en est-elle un ''instrument'' (organon), c’est-à-dire un outil méthodologique préalable à toute investigation philosophique ? La tradition péripatéticienne, et notamment Alexandre d’Aphrodise, défend la seconde thèse : la logique n’est pas une science indépendante avec son propre objet, mais une discipline formelle qui prépare à l’étude de tout objet. Cette conception coïncide avec le statut subordonné qu’Aristote accorde lui-même à l’analyse logique : la logique étudie les ''formes'' du raisonnement valide, indépendamment du ''contenu'' particulier des propositions.
Cette caractérisation appelle une nuance. La logique aristotélicienne n’est pas purement formelle au sens contemporain du terme. Comme l’a montré Paolo Crivelli, « bien qu’on puisse créditer Aristote de la thèse selon laquelle la logique est formelle, la manière dont elle est formelle pour lui diffère de celle dont elle l’est pour beaucoup de philosophes et logiciens modernes ».<ref>Crivelli, P., « Truth and Formal Validity in the Prior Analytics », dans A. P. Mesquita et R. Santos (dir.), ''New Essays on Aristotle’s Organon'', Routledge, 2024, chap. 4.</ref> La forme du raisonnement, chez Aristote, n’est pas une pure structure syntaxique substituable à n’importe quelle matière : elle implique des relations sémantiques entre les termes, des relations qui présupposent une certaine ontologie. La logique aristotélicienne est traversée, du début à la fin, par des questions qui, du point de vue moderne, relèvent plutôt de la sémantique, de l’ontologie et de la métaphysique.
====Ce qu’il faut retenir====
L’''Organon'' n’est pas un livre composé par Aristote mais un regroupement éditorial dû à la tradition péripatéticienne. L’ordre traditionnel des traités traduit une lecture orientée vers la science démonstrative, contre laquelle la recherche contemporaine (Brunschwig, Pellegrin) propose une hypothèse alternative selon laquelle la dialectique des ''Topiques'' serait antérieure et la syllogistique formelle un développement postérieur. La logique aristotélicienne se présente comme un instrument plutôt qu’une partie de la philosophie, mais elle reste, dans son fonctionnement même, traversée par des questions sémantiques et ontologiques.
===Chapitre I. ''Les Catégories'' : les genres suprêmes de l’être===
====Le titre, l’objet et l’authenticité du traité====
Le traité que la tradition désigne sous le titre de ''Catégories'' (en grec ''Katêgoriai'', plus rarement ''Pro tôn topôn'', « Préliminaire aux ''Topiques'' ») se présente comme une œuvre brève, divisée en deux parties hétérogènes.<ref>Sur le titre ''Pro tôn topôn'' et son sens, voir Bodéüs, R., introduction à Aristote, ''Catégories'', Les Belles Lettres, 2002.</ref> La première (chapitres 1 à 9) traite des « antéprédicaments » (homonymes, synonymes, paronymes ; choses dites avec ou sans combinaison) puis des dix catégories proprement dites, avec une attention particulière portée à la substance, à la quantité, à la relation et à la qualité. La seconde partie (chapitres 10 à 15), appelée « post-prédicaments », traite de notions plus diverses : les opposés, l’antériorité, la simultanéité, le mouvement et les sens du verbe « avoir ». L’authenticité de cette seconde partie a été contestée dès Andronicos, et elle continue de l’être.
L’authenticité même de la première partie a été discutée dès l’Antiquité. Pellegrin, à la fin de son introduction au traité, conclut prudemment que le fait, indéniable, que la philosophie d’Aristote serait inintelligible sans la doctrine des catégories n’établit nullement l’authenticité du traité éponyme.<ref>Pellegrin, P., « Présentation des ''Catégories'' », dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007, p. 67-92, ici p. 90-92.</ref> Que la doctrine soit aristotélicienne, et qu’elle soit centrale pour l’aristotélisme, est indubitable ; mais cela ne prouve pas que ce traité particulier ait été composé par Aristote en personne. Il pourrait s’agir d’un manuel péripatéticien tardif fidèle à la pensée du maître. Pour notre propos, peu importe : nous nous attacherons à exposer la doctrine telle qu’elle se présente dans le texte canonique.
====Les antéprédicaments : homonymes, synonymes, paronymes====
Le traité s’ouvre sur trois définitions qui paraissent, au premier abord, purement linguistiques mais qui ont en réalité une portée ontologique réelle.
Sont dits homonymes, écrit Aristote, « les objets dont le nom seul est commun, alors que l’énonciation correspondant à ce nom est différente ».<ref>Aristote, ''Catégories'' 1, 1a1-2.</ref> L’exemple canonique est celui du mot grec ''zôion'', qui désigne aussi bien l’animal vivant que la figure peinte ou dessinée (le peintre, en grec, se dit ''zôgraphos'', de ''graphein'' qui peut signifier écrire, tracer, dessiner ou peindre). Un homme et la représentation peinte d’un homme reçoivent l’un et l’autre le nom ''zôion'', mais la définition de ce qu’est, pour chacun, « être un ''zôion'' » est radicalement différente : pour l’homme, ''zôion'' signifie « être animé doué de sensation » ; pour la peinture, ''zôion'' signifie « figure représentée sur une surface ». L’homonymie n’est donc pas seulement un fait linguistique : elle révèle que ce qui partage un même nom peut relever d’essences entièrement distinctes.
Sont dits synonymes au contraire « les objets dont le nom est commun, et pour lesquels l’énonciation correspondant à ce nom est la même ».<ref>Aristote, ''Catégories'' 1, 1a6-12.</ref> Un homme et un bœuf sont tous deux « animal », et l’énonciation de ce que c’est, pour eux, qu’être animal (vivant doué de sensation) est identique. L’usage aristotélicien de ''sunônumon'' est donc presque l’inverse du nôtre : la synonymie ne désigne pas deux mots qui ont le même sens, mais deux objets qui appartiennent à la même espèce ou au même genre.
Sont dits enfin paronymes « les objets qui tiennent leur appellation d’un certain objet, alors qu’ils en diffèrent par la dérivation » : ''grammatikos'' (le lettré) tient son nom de ''grammatikê'' (le savoir-lire), ''andreios'' (le courageux) tient son nom de ''andreia'' (le courage).<ref>Aristote, ''Catégories'' 1, 1a12-15.</ref> Le paronyme partage la racine du nom de la qualité dont il est porteur, mais il s’en distingue par sa flexion morphologique.
Ces trois catégories ne sont pas de simples préliminaires : elles structurent toute la suite du traité. L’homonymie permettra de distinguer entre des emplois irréductibles d’un même mot ; la synonymie sera invoquée pour caractériser le rapport entre la substance première et la substance seconde ; la paronymie permettra de comprendre comment des qualités donnent lieu à des qualifications. La question de l’« unité de l’être », sur laquelle nous reviendrons, prend également racine dans cette opposition entre homonymie et synonymie : si l’être est dit en plusieurs sens, est-il homonyme purement et simplement, ou s’agit-il d’une ''homonymie focale'' (selon la terminologie introduite par G.E.L. Owen) où plusieurs sens se rapportent à un sens premier ?
====Termes dits avec et sans combinaison ; les quatre classes d’étants====
Au chapitre 2, Aristote introduit deux distinctions importantes. La première oppose ce qui « est dit selon une combinaison » (par exemple « un homme court », « un homme gagne ») à ce qui « est dit sans combinaison » (par exemple « homme », « bœuf », « court », « gagne »). Cette distinction prépare l’analyse des catégories qui, comme termes simples, sont précisément ce qui est dit ''sans combinaison''. L’analyse des combinaisons (c’est-à-dire des propositions) sera réservée au ''De interpretatione''.
La seconde distinction est plus subtile et constitue l’épine dorsale de la doctrine ontologique du traité. Aristote distingue, parmi les étants, ceux qui « se disent d’un sujet » et ceux qui « sont dans un sujet ».<ref>Aristote, ''Catégories'' 2, 1a20-1b9.</ref> Il en résulte quatre classes :
(1) Ce qui se dit d’un sujet ''et'' est dans un sujet : par exemple le ''savoir'' (en général), qui se dit d’un sujet (par exemple le savoir-lire dont il est le genre) et qui est dans l’âme (sujet d’inhérence). Ce sont les universels non substantiels.
(2) Ce qui se dit d’un sujet mais n’est dans aucun sujet : par exemple l’''homme'' en tant qu’espèce, qui se dit de tel homme particulier (Socrate) mais n’est pas une qualité ou un accident ''inhérent'' à un substrat. Ce sont les universels substantiels.
(3) Ce qui est dans un sujet mais ne se dit d’aucun sujet : par exemple ''tel savoir-lire particulier'' qui réside dans une âme particulière, ou ''tel blanc particulier'' présent dans un corps particulier. Ce sont les individus accidentels (parfois appelés « tropes » dans la philosophie analytique contemporaine).
(4) Ce qui ne se dit d’aucun sujet et n’est dans aucun sujet : c’est ''Socrate'', ''tel cheval'', ''tel arbre'', les substances premières au sens strict.
La distinction fondamentale est ici celle entre prédication (« se dire de ») et inhérence (« être dans »). La prédication transporte avec elle la définition : si « animal » se dit de Socrate, alors la définition d’« animal » s’applique à Socrate (Socrate est un être animé doué de sensation). L’inhérence, en revanche, ne transporte pas la définition : « blanc » est dans Socrate, mais Socrate n’est pas la définition de « blanc ». Cette différence est centrale pour comprendre comment les genres et les espèces sont des « substances secondes » alors que la couleur ou la qualité ne le sont pas.
====Les dix catégories : une liste, deux interprétations====
Le chapitre 4 livre la liste canonique des dix « genres suprêmes ». Aristote écrit que « chacun des termes qui sont dits sans aucune combinaison indique soit une substance (''ousia''), soit une certaine quantité (''poson''), soit une certaine qualité (''poion''), soit un rapport à quelque chose (''pros ti''), soit quelque part (''pou''), soit un certain moment (''pote''), soit être dans une position (''keisthai''), soit posséder (''echein''), soit faire (''poiein''), soit subir (''paschein'') ».<ref>Aristote, ''Catégories'' 4, 1b25-27.</ref> Les exemples qu’il donne sont volontairement concrets : un homme, un cheval (substance) ; long de deux coudées, long de trois coudées (quantité) ; blanc, instruit (qualité) ; double, moitié (relation) ; au Lycée, sur l’Agora (lieu) ; hier, l’an dernier (temps) ; couché, assis (position) ; chaussé, armé (possession) ; couper, brûler (action) ; être coupé, être brûlé (passion).
Cette liste a posé, dès l’Antiquité, deux types de problèmes. Premièrement, elle n’est pas systématiquement reprise par Aristote : dans plusieurs autres traités, on trouve des listes plus courtes (à huit ou six catégories), et Aristote ne fournit nulle part une justification rigoureuse du nombre dix. Deuxièmement, son objet même est contesté : s’agit-il de divisions du langage, de divisions de la pensée, ou de divisions de la réalité ?
Pellegrin rappelle dans son introduction la pluralité des interprétations historiques. Friedrich Trendelenburg, au XIX{{e}} siècle, a soutenu une interprétation grammaticale : les catégories correspondraient aux parties du discours grec, les quatre premières (substance, quantité, qualité, relation) aux noms et adjectifs, les quatre dernières (action, passion, position, possession) aux verbes, les deux intermédiaires (lieu, temps) aux adverbes. Cette lecture a l’avantage de réduire l’apparent désordre de la liste, mais elle a été critiquée par Émile Benveniste qui a objecté que la grammaire grecque ne propose pas exactement cette division. Une lecture ontologique, au contraire, voit dans les catégories les genres suprêmes de l’étant : Franz Brentano, dans sa thèse de 1862 ''Von der mannigfachen Bedeutung des Seienden nach Aristoteles'' (''De la diversité des acceptions de l’être d’après Aristote''), en a donné l’exposition la plus achevée. Mais cette lecture, comme le note Pellegrin, peine à expliquer le rapport étroit entre catégories et prédication.
La solution la plus juste consiste sans doute à reconnaître, avec Pellegrin, que les catégories sont à l’intersection d’une analyse logique du discours et d’une décomposition ontologique de la réalité. Elles sont à la fois des types de prédication et des genres de l’être : la double dimension est constitutive de la doctrine, et toute tentative de réduire l’une à l’autre manque l’originalité du projet aristotélicien.
Un éclairage supplémentaire vient des ''Topiques'' (I, 9), où Aristote distingue ce que ''katègoria'' peut désigner : tantôt les dix « catégories » (ce que c’est, qualité, quantité, etc.), tantôt les quatre prédicables (accident, genre, propre, définition), tantôt encore les catégories que l’on signifie quand on signifie une essence. Comme l’explique Pellegrin, quand on dit d’un homme particulier qu’il est un homme, on lui donne comme prédicat essentiel une substance ; quand on dit de telle couleur blanche qu’elle est du blanc, on lui donne comme prédicat essentiel une qualité. La doctrine des catégories articule indissociablement une typologie des relations prédicatives et une typologie des genres d’être : elle est au croisement de la logique et de la métaphysique.
====La substance première et la substance seconde====
Parmi les dix catégories, l’une occupe une position privilégiée : la substance (''ousia''). Aristote écrit, au début du chapitre 5 : « La substance est ce qui se dit proprement, premièrement et avant tout ; ce qui à la fois ne se dit pas d’un certain sujet et n’est pas dans un certain sujet ; par exemple tel homme ou tel cheval ».<ref>Aristote, ''Catégories'' 5, 2a11-14.</ref> La substance première est donc l’individu concret, ce que la tradition appellera plus tard ''tode ti'', « ceci », « ce quelque chose-ci ». Elle se distingue par une double caractéristique négative : elle n’est ni dite d’un sujet (elle n’est pas un prédicat) ni dans un sujet (elle n’est pas une qualité ou un accident inhérent à un substrat).
Cette définition a une conséquence ontologique importante : sans les substances premières, rien d’autre ne pourrait exister. « Tous les autres termes, ou bien se disent de sujets qui sont les substances premières, ou bien sont dans des sujets qui sont ces mêmes substances ».<ref>Aristote, ''Catégories'' 5, 2a34-2b6.</ref> Si l’on supprime les hommes et les chevaux particuliers, on supprime du même coup l’espèce « homme » et l’espèce « cheval », qui se disent d’eux ; on supprime également les couleurs, les qualités, les actions, qui sont dans eux. La substance première est le substrat ultime (''hypokeimenon''), ce dont tout se dit mais qui n’est dit de rien d’autre.<ref>Cf. Aristote, ''Métaphysique'' Z, 3, 1028b36-37.</ref>
Mais Aristote reconnaît également l’existence de substances secondes : ce sont les espèces et les genres auxquels appartiennent les substances premières. L’homme (espèce) et l’animal (genre) sont des substances secondes parce qu’ils se disent des substances premières. Aristote précise que « parmi les substances secondes, l’espèce est plus substance que le genre, car elle est plus proche de la substance première » : un homme particulier est plus immédiatement reconnu comme « un homme » que comme « un animal », et la définition d’« homme » est plus précise que celle d’« animal ».
Cette articulation entre substance première et substance seconde est l’une des thèses les plus originales du traité. D’un côté, Aristote affirme la primauté ontologique de l’individu sur l’universel, ce qui le distingue du Platon des dialogues médians, pour qui les Idées (universelles) sont plus réelles que les choses sensibles. D’un autre côté, il reconnaît à l’espèce et au genre une réalité substantielle, ce qui ne les réduit pas à de purs concepts mentaux. La synonymie y joue un rôle important : la substance et ses différences se disent de façon synonyme de la substance première, c’est-à-dire avec partage de la définition. Quand je dis que « Socrate est homme » et que « Socrate est animal », je transporte sur Socrate les définitions complètes de « homme » et d’« animal » ; ce n’est pas le cas quand je dis « Socrate est blanc », car je n’attribue pas à Socrate la définition de la blancheur (Socrate n’est pas la couleur blanche).
Il faut signaler que la doctrine de la substance présentée dans les ''Catégories'' n’est pas identique à celle que développeront les livres centraux de la ''Métaphysique'' (Z, H, Θ). Dans la ''Métaphysique'', Aristote cherche dans la forme ou l’essence (''eidos'') le principe de substantialité de l’individu : la forme n’est pas simplement identifiée à un universel au sens d’un genre ou d’une espèce ; elle est ce qui, dans l’individu lui-même, en fait ce qu’il est et le rend connaissable. Cette recherche d’un principe immanent de substantialité crée une tension avec la doctrine des ''Catégories'', qui assignait la primauté à l’individu concret comme totalité indivise. Cette tension nourrit l’un des grands débats interprétatifs de l’aristotélisme contemporain : la doctrine des ''Catégories'' est-elle une étape antérieure et moins mûre, qu’Aristote dépasse dans la ''Métaphysique'' ? Ou bien les deux doctrines coexistent-elles dans le système, chacune ayant son domaine de validité ? Bodéüs, dans son introduction de l’édition des Belles Lettres, défend une lecture compatibiliste où la substance première des ''Catégories'' (l’individu) reste première en un sens, tandis que la ''Métaphysique'' cherche, à l’intérieur de l’individu, ce qui en fait la substantialité (sa forme).
====Les propriétés caractéristiques de la substance====
Les chapitres 5 à 9 des ''Catégories'' dégagent ensuite plusieurs propriétés permettant d’identifier la substance et de la distinguer des accidents. Ces « propriétés topiques » ne visent pas à donner une définition de la substance, mais, comme le précise une note de l’édition Flammarion, à préparer le lecteur à construire et à utiliser les lieux appropriés à un type de prédication donné. Elles sont des outils dialectiques utiles dans la discussion.
Première propriété : toute substance n’est pas dans un sujet. Cette propriété ne lui est cependant pas exclusive ; les différences (''diaphorai'') ne sont pas non plus dans un sujet, sans être pour autant des substances. Aristote précise aussi que les parties des substances (la main, le pied) sont elles-mêmes des substances, contre une objection qui pourrait les considérer comme des qualités du tout.
Deuxième propriété : la substance et ses différences se disent de façon synonyme. Quand je dis que « Socrate est homme » et que « Socrate est bipède » (où « bipède » est une différence spécifique de l’homme), je transporte la définition complète de chacun de ces termes sur Socrate.
Troisième propriété : toute substance « indique un certain ceci » (''tode ti''). Cette caractéristique vaut éminemment pour les substances premières, qui sont des individus numériquement uns. Pour les substances secondes (espèce, genre), Aristote précise qu’elles désignent plutôt « une certaine sorte d’objet » (''poion ti'') : non pas un individu particulier, mais le type auquel des individus appartiennent. Les substances secondes sont substances en ce qu’elles fondent l’identité essentielle des substances premières, mais elles ne sont pas des « ceci » au même titre.
Quatrième propriété : la substance n’admet pas le plus ou le moins. On ne dit pas qu’un homme est « plus homme » qu’un autre, ni qu’un cheval est « moins cheval » : être homme ou être cheval ne souffre pas de degrés. Au contraire, les qualités admettent le plus ou le moins (un homme peut être plus blanc qu’un autre, plus instruit, plus juste).
Cinquième propriété, la plus remarquable : la substance est capable de recevoir les contraires tout en restant la même et numériquement une. Le même Socrate peut être tantôt assis, tantôt debout ; tantôt en bonne santé, tantôt malade ; tantôt joyeux, tantôt triste. Cette capacité à supporter le changement tout en demeurant identique à soi-même constitue, selon Aristote, le « caractère le plus propre » de la substance ; c’est ce qui en fait précisément le substrat (''hypokeimenon'') du devenir. Une qualité particulière ne peut pas recevoir les contraires : telle blancheur ne peut devenir noirceur (elle est remplacée par une noirceur, qui est une autre qualité). Seule la substance traverse le changement sans cesser d’être ce qu’elle est.
====L’être n’est pas un genre : l’unité problématique de l’étant====
La doctrine des catégories soulève une difficulté philosophique : si l’être se dit en plusieurs sens irréductibles (être substance, être qualité, être quantité, etc.), comment préserver l’unité de son concept ? Cette question, qu’Aristote pose dans la ''Métaphysique'' (B, 3, 998b22), reçoit une réponse qui structure son ontologie : l’être n’est pas un genre.
La raison en est, comme l’explique l’''Aristoteles-Handbuch'', un argument technique sous forme de ''reductio ad absurdum'' : si l’être était un genre, alors les différences spécifiques qui le diviseraient en espèces seraient elles-mêmes des étants ; or aucun genre ne peut être prédiqué de ses différences spécifiques (sinon les différences seraient déjà comprises dans le genre, et la division spécifique serait impossible) ; donc, si l’être était un genre, ses différences ne seraient pas des étants, ce qui est absurde.<ref>Rapp, C., et Corcilius, K. (dir.), ''Aristoteles-Handbuch'', Stuttgart, J. B. Metzler, 2021, partie IV.</ref> L’être ne peut donc pas être un genre au sens propre.
Mais alors, l’être est-il purement homonyme ? Aristote refuse cette conséquence. Il développe, principalement dans le livre Γ de la ''Métaphysique'', une troisième voie : les différentes acceptions de l’être ne sont ni univoques (comme à l’intérieur d’un genre) ni purement équivoques (comme dans le cas de l’homonymie au sens strict), mais elles se rapportent toutes à un terme premier, la substance. « L’être se dit en multiples acceptions, mais toujours relativement à un terme unique, à une nature déterminée » (Γ, 2, 1003a33-b10). Une qualité ne peut être qu’en tant qu’elle est ''qualité d’une substance'' ; une quantité ne peut être qu’en tant qu’elle est ''quantité d’une substance''. La substance constitue le pôle de référence par rapport auquel les autres significations de l’être se définissent.
Cette structure est ce que la tradition appelle ''homonymie focale'' ou ''signification focale'' (''focal meaning'', dans la formulation de G.E.L. Owen). L’''Aristoteles-Handbuch'' l’illustre par un exemple aristotélicien : la santé est dite, en sens divers, du teint, de la gymnastique, de la médecine, et de l’homme. Ces sens ne sont pas univoques (un teint sain et un homme sain ne sont pas « sains » de la même façon), mais ils ne sont pas non plus purement homonymes : tous se rapportent à la santé de l’homme (le teint ''signe'' cette santé, la gymnastique la ''préserve'', la médecine la ''produit''). De même pour l’être : tous les modes d’être se rapportent à la substance, qui constitue le « cas privilégié » par rapport auquel les autres se définissent.
====Ce qu’il faut retenir====
Les ''Catégories'' opèrent au croisement de la logique, de la grammaire et de l’ontologie. Le traité distingue homonymes, synonymes et paronymes ; il présente quatre classes d’étants articulées par les relations de prédication et d’inhérence ; il dresse la liste des dix catégories ; il accorde la primauté à la substance première (l’individu concret) tout en reconnaissant l’existence des substances secondes (espèces et genres). La doctrine de l’''homonymie focale'' permet à Aristote de préserver une unité conceptuelle de l’être sans en faire un genre univoque, ouvrant ainsi la voie à la métaphysique.
===Chapitre II. ''Le De interpretatione'' (Peri hermeneias) : le jugement et la proposition===
====Titre, objet et méthode du traité====
Le titre grec du traité, ''Peri hermeneias'', désigne « ce qui concerne l’interprétation », mais avec une nuance importante : ''hermeneia'' ne renvoie pas à un ''acte'' (qui serait ''hermeneusis''), mais à ''son produit'' ; non pas l’interpréter, mais l’interprété. Catherine Dalimier, dans son introduction à l’édition Flammarion, propose d’y voir un traité « sur l’expression de la proposition déclarative » (''Peri tou logou apophantikou hermeneias''), c’est-à-dire sur cette forme particulière de discours qui est susceptible d’être vraie ou fausse.<ref>Dalimier, C., introduction au ''De l’interprétation'', dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007.</ref>
L’objet du traité, à la différence des ''Catégories'' qui s’intéressaient aux termes simples (atomes logiques), est la proposition déclarative comme unité minimale de la connaissance et de la communication. Aristote y examine la structure du discours qui peut être validé comme vrai ou faux, les conditions du jugement, les rapports entre langage, pensée et réalité.
C.W.A. Whitaker, dans une interprétation que Pellegrin et Dalimier trouvent éclairante, a proposé de lire l’ensemble du traité comme une exploration systématique de la contradiction (''antiphasis''), du « couple de contradictoires ».<ref>Whitaker, C.W.A., ''Aristotle’s'' De Interpretatione: ''Contradiction and Dialectic'', Oxford, Clarendon Press, 1996.</ref> La proposition serait étudiée non pas pour elle-même, mais en tant qu’elle s’inscrit dans un couple affirmation/négation qui constitue l’unité minimale de toute évaluation logique. Cette lecture restitue au ''De interpretatione'' sa cohérence interne et le rattache aux ''Topiques'' et aux ''Réfutations sophistiques'', où la contradiction joue un rôle central.
====Le triangle sémiotique : choses, pensées, mots====
Le traité s’ouvre, au chapitre 1, sur une réflexion sur le statut du langage qui constitue l’un des textes fondateurs de la philosophie occidentale du signe. Aristote y établit un triangle sémiotique à trois étages.
Les sons émis par la voix (''ta en tê phonê'') sont des symboles (''symbola'') des affections de l’âme (''ta en tê psychê pathêmata''), c’est-à-dire des pensées, des concepts mentaux. Les mots écrits sont à leur tour des symboles des mots prononcés. Les pensées, enfin, sont des ressemblances (''homoiômata'') des choses (''pragmata'').<ref>Aristote, ''De l’interprétation'' 1, 16a3-8.</ref>
On obtient donc trois niveaux : les choses ; les concepts mentaux qui leur ressemblent ; les sons et les écritures qui symbolisent ces concepts. Ce qui importe, c’est la ''différence de relation'' entre les niveaux. La relation entre les sons (ou les écritures) et les pensées est conventionnelle (''kata sunthêkên'') : « De même que l’écriture n’est pas la même pour tous les hommes, les mots parlés ne sont pas non plus les mêmes ». La diversité des langues humaines manifeste précisément ce caractère conventionnel : il n’y a pas de raison naturelle pour laquelle telle pensée devrait être exprimée par tel son plutôt que par tel autre. En revanche, la relation entre les pensées et les choses est une relation de ressemblance : les états de l’âme « sont identiques chez tous », parce qu’ils reflètent la structure même du réel, qui est, elle, universelle.
Cette doctrine a plusieurs conséquences. D’abord, elle prend ses distances avec le naturalisme cratylien : aucun mot n’est par nature le nom de telle chose, c’est l’institution sociale qui assigne tel signe à tel signifié. Ensuite, elle fonde la possibilité d’une communication véridique : si les pensées sont des reflets fidèles des choses, alors la traduction et la compréhension interlinguistique sont possibles, parce qu’au-delà de la diversité des conventions linguistiques, on retrouve une communauté de concepts mentaux qui est elle-même garantie par l’unité du réel. Enfin, elle implique une certaine subordination du langage à la pensée : ce que le langage fait, c’est exprimer (par signes conventionnels) des pensées qui, elles, ressemblent aux choses ; le langage n’est pas le lieu primaire de la vérité, mais sa manifestation extérieure.
Aristote précise immédiatement, au chapitre 1, que la vérité et la fausseté n’apparaissent qu’avec la composition ou la séparation. Un mot isolé (« homme », « blanc », « cheval ») ne peut être ni vrai ni faux. Même un mot qui désigne quelque chose d’inexistant (« bouc-cerf », hybride imaginaire) signifie quelque chose, mais n’est ni vrai ni faux : il faut, pour qu’un énoncé soit susceptible d’être vrai ou faux, qu’on y ajoute « être » ou « ne pas être », qu’on attribue ou qu’on nie quelque chose de quelque chose. La vérité est d’abord propositionnelle.
====Le nom (''onoma'')====
Avant d’examiner la proposition, Aristote analyse ses constituants. Le nom (''onoma'') est défini, au chapitre 2, comme « un vocable signifiant par convention, sans référence à un temps, et dont aucune partie, considérée séparément, n’est signifiante ».<ref>Aristote, ''De l’interprétation'' 2, 16a19-21.</ref>
Cette définition condense quatre caractères :
(1) Le nom est un vocable (''phonê''), une réalité phonique. Cette précision exclut, par exemple, les sons des animaux (qui ne sont pas des mots) ou les bruits inarticulés.
(2) Il est signifiant : il a un sens, il indique quelque chose.
(3) Il signifie par convention (''kata sunthêkên'') : aucun vocable n’est nom par nature ; il ne le devient que lorsqu’il est institué comme symbole.
(4) Il est sans référence au temps : c’est précisément ce qui le distingue du verbe. « Santé » est un nom, parce qu’il signifie quelque chose sans indiquer si cette chose existe maintenant, a existé ou existera ; « est-en-bonne-santé » est un verbe, parce qu’il consignifie le temps présent.
(5) Aucune de ses parties n’est signifiante prise séparément. Aristote prend l’exemple grec ''Kalippos'' (« Beaucheval », un nom propre) : ''kalos'' (beau) signifie quelque chose hors du nom composé, ''hippos'' (cheval) aussi ; mais dans ''Kalippos'', ces parties ne signifient plus rien : le nom propre est une unité signifiante qui n’est pas la somme de ses constituants apparents.
Aristote introduit également deux notions dérivées. Les noms indéfinis (''aoriston onoma''), comme « non-homme », ne sont pas des noms à proprement parler, mais ils ont une fonction logique importante (notamment dans la négation et dans certaines opérations de la syllogistique). Les noms fléchis (''ptôseis''), comme « de Philon », « à Philon », formes casuelles du nom propre, ne sont pas non plus des noms au sens strict, parce qu’ils n’entrent pas dans une affirmation ou une négation simple : « est-Philon » est susceptible de vrai ou de faux ; « est-à-Philon » ne l’est pas (il manque quelque chose).
====Le verbe (''rhêma'')====
Le verbe (''rhêma''), examiné au chapitre 3, se distingue du nom par deux caractères spécifiques :
(1) Il consignifie le temps : « Santé est un nom, est-en-bonne-santé est un verbe ; car il signifie en plus que c’est un attribut maintenant. »<ref>Aristote, ''De l’interprétation'' 3, 16b6-8.</ref> Le terme « consignifier » (''prossêmainein'') est important : le verbe ne signifie pas le temps comme son objet propre (sinon « hier » serait un verbe), mais il signifie quelque chose ''en plus'' de ce qu’il signifie principalement, et ce supplément est le temps. Ce qu’un verbe signifie principalement, c’est une action ou un état (la santé, le fait de marcher) ; ce qu’il consignifie, c’est l’ancrage temporel de cette action ou de cet état dans le présent.
(2) Il est toujours signe d’attribution : « il est toujours signe d’attributs, par exemple de choses qu’on dit d’un sujet ». Le verbe, autrement dit, indique toujours quelque chose qu’on attribue à autre chose ; il a une fonction prédicative inscrite dans sa nature même.
Catherine Dalimier note dans ses commentaires à l’édition Flammarion que le terme grec ''rhêma'' ne recouvre pas exactement notre concept de « verbe ». Pour Aristote, « marcher » à l’infinitif est encore un nom (parce qu’il n’a, à lui seul, ni valeur temporelle déterminée, ni valeur d’attribution effective) ; il faut « marche » (présent de l’indicatif) pour avoir un ''rhêma'' au sens strict. C’est pourquoi certains traducteurs renoncent à traduire ''rhêma'' par « verbe » et préfèrent calquer le grec.
Aristote distingue, comme pour les noms, des rhèmes indéfinis (« n’est-pas-en-bonne-santé », « n’est-pas-malade ») et des rhèmes fléchis (« était-en-bonne-santé », « sera-en-bonne-santé », formes au passé ou au futur). Les rhèmes indéfinis ne sont pas des verbes proprement dits parce qu’ils peuvent appartenir indifféremment à un être existant ou à un non-existant ; ils manquent de la détermination ontologique du verbe authentique. Les rhèmes fléchis ne sont pas des verbes au sens strict parce qu’ils n’ancrent pas l’attribution dans le présent.
====Le verbe « être » : la copule problématique====
Un cas particulier mérite une attention spéciale : le verbe « être » (''einai''), examiné à la fin du chapitre 3.
Aristote affirme que « être ou ne pas être n’est pas un signe de la chose réelle, pas même si tu dis "étant" tout court ; car en soi, ce n’est rien, mais il consignifie une certaine composition qu’on ne peut concevoir sans les composants ».<ref>Aristote, ''De l’interprétation'' 3, 16b22-25.</ref> Cette phrase fait l’objet de débats interprétatifs intenses. Selon la lecture traditionnelle (Waitz, Sisson), Aristote suggérerait que le verbe « être » est purement copulatif, c’est-à-dire vide de signifié conceptuel propre : il n’aurait qu’une fonction grammaticale de liaison entre sujet et prédicat. Selon Ammonius et la lecture néo-platonicienne, « être » aurait une signification propre (la « participation » ou la « privation » de l’étant) mais seulement en seconde place ; en première place, il signale la composition qui constitue la proposition.
Cette difficulté est centrale pour deux raisons. Premièrement, elle touche à la nature même de la proposition prédicative : qu’est-ce qui se passe, ontologiquement, quand je dis « Socrate est blanc » ? Le « est » ajoute-t-il quelque chose au monde ou est-il un pur outil syntaxique ? Deuxièmement, elle prépare la doctrine, développée dans la ''Métaphysique'', selon laquelle « être » se dit en plusieurs sens (sens copulatif, sens existentiel, sens véritatif), et selon laquelle ces différents sens correspondent à autant de modalités différentes de l’analyse.
====La proposition déclarative (''logos apophantikos'')====
Aristote distingue, au chapitre 4, plusieurs sortes de discours (''logos''). Tout discours n’est pas susceptible d’être vrai ou faux : la prière, l’ordre, la question, l’exclamation sont des discours signifiants mais qui ne se prêtent pas à l’évaluation alèthique. Seul le discours déclaratif (''logos apophantikos''), celui qui ''manifeste'' (du verbe ''apophainein'') un état de choses, peut être vrai ou faux. Aristote précise que les autres formes de discours relèvent plutôt de la rhétorique ou de la poétique.
La proposition déclarative se divise en deux espèces : l’affirmation (''kataphasis'') et la négation (''apophasis''). L’affirmation est « la déclaration de quelque chose au sujet de quelque chose » (''apophansis tinos kata tinos'') ; la négation est « la déclaration de quelque chose séparé de quelque chose » (''apophansis tinos apo tinos'').<ref>Aristote, ''De l’interprétation'' 5, 17a25-26.</ref> Ce qui distingue donc une affirmation d’une négation, ce n’est pas simplement la présence d’une particule négative : c’est l’opération mentale de composition (''synthesis'') ou de division (''diairesis'') qui s’y effectue. Affirmer, c’est ''unir'' mentalement deux termes ; nier, c’est ''séparer'' mentalement deux termes.
C’est cette opération qui rend possible la vérité ou la fausseté, comme l’expliquera plus tard la ''Métaphysique'' (Γ, 7, 1011b26-27) : « dire que ce qui est est et que ce qui n’est pas n’est pas, c’est le vrai ; dire que ce qui est n’est pas ou que ce qui n’est pas est, c’est le faux ». La vérité est une ''correspondance'' entre la composition mentale et la composition réelle ; quand l’âme unit ce qui, dans le réel, est uni, elle dit vrai ; quand elle sépare ce qui, dans le réel, est uni, ou unit ce qui, dans le réel, est séparé, elle dit faux.
====La contradiction (''antiphasis'')====
Le chapitre 6 introduit la notion de contradiction, au cœur du traité selon l’interprétation de Whitaker. La contradiction, c’est précisément le couple formé par une affirmation et la négation qui lui correspond, où l’on affirme et nie « la même chose de la même chose », sans homonymie, et avec toutes les précisions nécessaires « pour nous défendre des sophistes ».<ref>Aristote, ''De l’interprétation'' 6, 17a33-37.</ref>
Cette définition technique cache une thèse philosophique de fond : pour qu’il y ait débat rationnel, il faut que les énoncés qu’on confronte forment un véritable couple de contradictoires, c’est-à-dire qu’ils portent vraiment sur le même sujet sous le même rapport. Aristote précise les conditions à respecter : il faut affirmer et nier la même chose, du même sujet, au même moment, sous le même rapport, et selon le même sens des termes. Si ces conditions ne sont pas réunies, l’apparente contradiction n’en est pas une véritable, et le débat risque de tomber dans le sophisme. Par exemple, « Socrate est assis » et « Socrate n’est pas assis » ne sont pas réellement contradictoires si l’une concerne hier et l’autre aujourd’hui ; ils ne le sont pas non plus si « assis » est pris dans deux sens différents (assis sur une chaise / assis comme on dit d’un raisonnement bien « assis »).
La doctrine de la contradiction n’est pas une simple règle formelle : elle est le fondement de la possibilité même d’une discussion rationnelle, et elle structure aussi bien la dialectique que la science.
====Quantité, qualité et le carré logique====
Le chapitre 7 introduit deux distinctions qui, croisées, donneront naissance au carré logique de la tradition scolastique.
La première distinction concerne la quantité des propositions. Une proposition peut être universelle (« tout homme est blanc », « aucun homme n’est blanc »), particulière (« quelque homme est blanc », « quelque homme n’est pas blanc »), singulière (« Callias est blanc »), ou indéterminée (« l’homme est blanc », sans préciser tous, certains, ou tel homme particulier).
La seconde distinction concerne la qualité : affirmative ou négative.
En croisant les deux distinctions principales (universelle/particulière × affirmative/négative), on obtient quatre formes de propositions catégoriques que la tradition désignera par les voyelles A, E, I, O (désignations qui ne sont pas aristotéliciennes mais scolastiques, dérivées des verbes latins ''Affirmo'' et ''Nego'') : A pour l’universelle affirmative (« tout homme est mortel ») ; E pour l’universelle négative (« aucun homme n’est immortel ») ; I pour la particulière affirmative (« quelque homme est juste ») ; O pour la particulière négative (« quelque homme n’est pas juste »).
Aristote établit, au chapitre 7, les relations qui existent entre ces formes. A et O sont contradictoires : elles ne peuvent être simultanément vraies ni simultanément fausses. E et I sont également contradictoires. A et E sont contraires : elles ne peuvent être simultanément vraies, mais elles peuvent être simultanément fausses (« tout homme est juste » et « aucun homme n’est juste » sont peut-être toutes deux fausses). I et O sont sub-contraires : elles ne peuvent être simultanément fausses, mais elles peuvent être simultanément vraies. Enfin, A entraîne I (et E entraîne O) : c’est la subalternation. Si tous les hommes sont mortels, alors quelque homme est mortel.
Ce dispositif, qui paraît élémentaire, est la base de toute la logique des propositions catégoriques et préfigure une bonne partie de la syllogistique des ''Premiers Analytiques''.
====Les futurs contingents : le chapitre 9====
Le chapitre 9 du ''De interpretatione'' est, comme l’écrit Catherine Dalimier, l’objet de spéculations qui mobilisent depuis l’Antiquité « des générations de logiciens ». Il pose l’une des questions les plus profondes de la logique modale : le principe de bivalence (toute proposition est vraie ou fausse) s’applique-t-il aux propositions portant sur des événements futurs contingents ?
Le problème se formule avec une grande clarté. Considérons deux propositions contradictoires : « Il y aura demain une bataille navale » et « Il n’y aura pas demain une bataille navale ». D’après le principe du tiers exclu, l’une de ces deux propositions est vraie et l’autre est fausse. Or, si l’une d’elles est ''dès maintenant'' vraie, alors l’événement qu’elle décrit est ''dès maintenant'' déterminé : il ''doit'' se produire (ou ne pas se produire) demain. Mais cela conduit à un fatalisme logique : tout ce qui doit arriver est déjà fixé, la délibération humaine est illusoire, le hasard et la liberté sont supprimés. Or il est manifeste, pour Aristote, que certains événements à venir sont contingents (ils peuvent se produire comme ne pas se produire) et que la délibération a un sens.
L’''Aristoteles-Handbuch'' résume avec précision la structure de l’argument fataliste. La prémisse en est une version ''temporalisée'' du principe de bivalence : tout énoncé est, ''à tout moment'', soit vrai soit faux ; donc, dès aujourd’hui, l’énoncé « il y aura demain une bataille navale » est vrai ou faux. Si cet énoncé est dès aujourd’hui vrai, alors sa vérité est déjà ''advenue'' aujourd’hui ; or ce qui est advenu est immuable (« nécessaire » en un certain sens) ; donc il est nécessaire que demain ait lieu une bataille navale. Le raisonnement, généralisé à tous les énoncés sur l’avenir, conduit à la nécessité de tout ce qui doit arriver, c’est-à-dire au déterminisme intégral.
La solution d’Aristote est, comme le note Dalimier, subtile. Il maintient le principe de bivalence pour les propositions portant sur le présent et le passé : ce qui est, est ; ce qui n’est pas, n’est pas ; le passé est immuable. Mais pour les futurs contingents, il propose une distinction délicate : « il est nécessaire que l’affirmation ou la négation soit vraie, mais non que celle-ci déterminément ou celle-là déterminément soit vraie ».<ref>Aristote, ''De l’interprétation'' 9, 19a36-39.</ref> La disjonction « il y aura ou il n’y aura pas demain une bataille navale » est nécessairement vraie (parce que l’un des deux disjoints doit être vrai) ; mais aucun des disjoints pris séparément n’est encore ''déterminément'' vrai ou faux. Selon l’interprétation classique, cette thèse revient à ''suspendre'' l’application déterminée de la bivalence aux futurs contingents, sans pour autant abandonner le principe du tiers exclu pour leur disjonction.
L’interprétation de cette doctrine reste discutée. Certains commentateurs (Hintikka) ont contesté que le chapitre 9 ait pour objet de réfuter le fatalisme et ont vu dans Aristote un partisan d’un certain principe de plénitude (selon lequel tout ce qui est possible doit s’actualiser à un moment ou à un autre). D’autres (Crivelli, Weidemann) maintiennent l’interprétation classique : Aristote rejette la version temporalisée de la bivalence pour les énoncés sur les contingents futurs. La logique formelle contemporaine a élaboré, à partir de cette discussion, des logiques plurivalentes (Łukasiewicz) et des logiques temporelles (Prior) qui formalisent cette thèse de la suspension de la bivalence pour le futur.
L’enjeu philosophique est important : la doctrine aristotélicienne des futurs contingents prépare une articulation entre logique, métaphysique de la causalité, et philosophie de l’action. Elle préserve la possibilité du hasard, de la délibération, et de la liberté humaine, sans pour autant renoncer aux principes de la rationalité.
====Les propositions modales====
Les chapitres 12 et 13 du ''De interpretatione'' examinent les propositions modales, c’est-à-dire les propositions qui ne se contentent pas d’affirmer ou de nier qu’un prédicat appartient à un sujet, mais qui qualifient cette appartenance comme nécessaire, possible, contingente ou impossible. Aristote distingue quatre modalités fondamentales. Le ''possible'' (''dynaton'', ''endechomenon'') désigne ce qui peut être ; l’''impossible'' (''adynaton''), ce qui ne peut pas être ; le ''contingent'', ce qui peut être ou ne pas être (possibilité bilatérale, dont on dira plus loin un mot) ; le ''nécessaire'' (''anankaion''), ce qui ne peut pas ne pas être.
L’analyse aristotélicienne des modalités présente plusieurs particularités sur lesquelles Richard Patterson a particulièrement insisté.<ref>Patterson, R., ''Aristotle’s Modal Logic: Essence and Entailment in the Organon'', Cambridge, Cambridge University Press, 1995.</ref> La première est la distinction entre ''possibilité unilatérale'' et ''possibilité bilatérale'' (ou contingence). Quand je dis « il est possible que S soit P » au sens unilatéral, je veux dire seulement que S peut être P, sans exclure que S soit nécessairement P (la possibilité unilatérale est compatible avec la nécessité). Quand je dis « il est possible que S soit P » au sens bilatéral (la contingence proprement dite), je veux dire à la fois que S peut être P ''et'' que S peut ne pas être P : la chose est possible mais pas nécessaire, elle peut tomber d’un côté ou de l’autre. Cette distinction est cruciale parce qu’elle commande des règles d’inférence et de conversion différentes : « Tout S peut être P » au sens unilatéral n’a pas la même force logique que « Tout S peut être P » au sens bilatéral, et certains syllogismes valides dans un cas ne le sont plus dans l’autre.
Aristote observe également que les propositions modales ne se convertissent pas comme les propositions assertoriques. Une proposition assertorique de type I (« quelque S est P ») se convertit simplement en « quelque P est S ». Mais une proposition modale du type « il est possible que quelque S soit P » ne se convertit pas toujours, ou ne se convertit qu’à condition de spécifier le mode de possibilité. Aristote consacre de longs développements, dans les ''Premiers Analytiques'', à examiner ces règles particulières.
Patterson met également en évidence la dimension essentialiste de la logique modale aristotélicienne. Quand Aristote dit qu’un énoncé est nécessaire, il ne pense pas, comme la logique modale contemporaine, à un opérateur abstrait s’appliquant à une proposition entière (« il est nécessaire que P »). Il pense à une relation entre des termes qui exprime une connexion essentielle. « Il est nécessaire que tout homme soit animal » ne signifie pas seulement que dans tous les mondes possibles, tout homme est animal ; cela signifie qu’« être animal » fait partie de l’''essence'' de « être homme », et que cette appartenance à l’essence rend la prédication nécessaire. La nécessité est ancrée dans la nature même des choses, dans leur ''quiddité''. Cette caractéristique rend délicate la transposition de la logique modale aristotélicienne dans les langages formels modernes, qui utilisent des opérateurs propositionnels faisant abstraction de la structure essentielle des termes.
Les propositions modales jouent un rôle important dans la théorie de la science, comme l’expliqueront les ''Seconds Analytiques'' : la science porte sur le nécessaire, non sur le contingent. Une démonstration scientifique part de prémisses nécessaires et conclut à des nécessités, parce qu’elle vise des vérités universelles et invariables. La théorie modale s’articule ainsi à l’épistémologie aristotélicienne, et les chapitres 12-13 du ''De interpretatione'' préparent les développements plus techniques que livrera Aristote dans la syllogistique modale des ''Premiers Analytiques''.
====Portée philosophique du ''De interpretatione''====
L’importance du ''De interpretatione'' dépasse son objet apparent. Catherine Dalimier souligne, en conclusion de son introduction, que le traité dessine le cadre logique de toute science possible pour Aristote. En établissant que la vérité réside dans la composition et la division opérées par l’intellect, et non dans les choses isolées ni dans les concepts isolés, Aristote fait du jugement le lieu propre de la manifestation de l’être. Cette doctrine sera reprise et développée par toute la philosophie occidentale jusqu’à Kant (qui en fera la base de sa logique transcendantale) et au-delà.
Le traité a également une portée pour la philosophie du langage. La distinction entre nom et verbe, l’analyse du caractère conventionnel du signe linguistique, la théorie de la signification et de la référence, la doctrine des futurs contingents : autant de thèmes qui ont nourri la philosophie analytique contemporaine, comme l’a montré Suzanne Husson dans ''Interpréter le De Interpretatione''.<ref>Husson, S. (éd.), ''Interpréter le'' De Interpretatione, Paris, Vrin, 2009.</ref>
====Ce qu’il faut retenir====
Le ''De interpretatione'' fixe l’unité minimale du jugement, la proposition déclarative, et en analyse les composants (nom, verbe, copule). Il définit la contradiction comme couple affirmation/négation et établit les quatre formes catégoriques A, E, I, O. Il pose deux problèmes qui occuperont la postérité : celui des futurs contingents (suspension de la bivalence pour les énoncés sur l’avenir) et celui des modalités (nécessaire, possible, contingent, impossible), avec des règles de conversion propres. La théorie aristotélicienne y montre son caractère sémantique, ancré dans une métaphysique des essences plutôt que dans un formalisme abstrait.
===Chapitre III. ''Les Premiers Analytiques'' : la théorie formelle du syllogisme===
====Le projet des ''Premiers Analytiques''====
Les ''Premiers Analytiques'' (''Analytica priora'') exposent la théorie du syllogisme dans sa généralité. Leur objet, comme l’explique Aristote dès la première phrase du livre I, est la ''démonstration'', et plus particulièrement le ''syllogisme'' en tant qu’instrument de toute démonstration. Ce qui distingue les ''Premiers'' des ''Seconds Analytiques'', c’est que l’analyse y porte sur la ''forme'' du syllogisme indépendamment de la vérité de ses prémisses. Un syllogisme valide est un syllogisme dont la conclusion suit nécessairement des prémisses, ''que ces prémisses soient vraies ou fausses''. La théorie est donc, en un certain sens, formelle : elle s’intéresse à la structure du raisonnement, non à son contenu particulier.
Comme l’observe Pellegrin, cette caractérisation des ''Premiers Analytiques'' comme étude formelle ne doit pas être prise au sens contemporain, où la formalité signifie généralement la possibilité de substituer n’importe quel contenu à une structure syntaxique. Pour Aristote, le formalisme est plus mesuré : il s’agit de dégager les règles qui permettent de dire qu’un raisonnement ''conclut'' à partir de ses prémisses, et ces règles présupposent encore une certaine sémantique des termes.
====La définition du syllogisme====
Aristote définit le syllogisme (''syllogismos''), au chapitre 1 du livre I, dans une formule devenue célèbre : « un discours dans lequel, certaines choses étant posées, quelque chose d’autre que ces données en résulte nécessairement par le seul fait de ces données ».<ref>Aristote, ''Premiers Analytiques'' I, 1, 24b18-20.</ref>
Cette définition condense plusieurs conditions qu’il faut prendre soin de distinguer.
Première condition : pluralité des prémisses. Un syllogisme suppose au moins deux propositions posées (les prémisses). Aristote ne considère pas comme syllogisme l’inférence à partir d’une seule prémisse.
Deuxième condition : la conclusion doit être ''autre chose'' que les prémisses (« quelque chose d’autre que ces données »). Cette clause exclut, en principe, les raisonnements purement tautologiques.
Troisième condition : la conclusion doit suivre nécessairement. La nécessité du syllogisme est essentielle : il ne suffit pas que la conclusion soit en fait vraie quand les prémisses sont vraies, il faut qu’elle ne ''puisse pas'' ne pas être vraie quand les prémisses le sont.
Quatrième condition, la plus subtile, mise en lumière par Crivelli : la conclusion doit suivre « par le seul fait de ces données » (''tô tauta einai''). Cette clause ajoute à la nécessité une exigence supplémentaire : non seulement la conclusion suit nécessairement, mais elle suit ''en vertu'' des prémisses elles-mêmes, et non d’une autre raison. Crivelli interprète cette clause comme exigeant que le caractère d’avoir la conclusion résultant nécessairement des prémisses devrait être partagé par toutes les inférences de la même structure, ou « forme ». C’est une exigence de ''formalité'' : le syllogisme conclut non pas accidentellement (parce qu’il se trouve, par hasard, que ces prémisses-là ont cette conclusion-là), mais en vertu de la structure formelle du raisonnement.
Cette clause permet à Aristote de distinguer le syllogisme d’autres formes d’inférence nécessaire. Comme le rappelle Orna Harari, Aristote affirme explicitement, en ''Premiers Analytiques'' I, 32 (47a31-35) : « tout syllogisme est nécessaire, mais tout ce qui suit nécessairement n’est pas un syllogisme ».<ref>Harari, O., ''Knowledge and Demonstration: Aristotle’s Posterior Analytics'', Dordrecht, Springer / Kluwer, 2004, chap. 3.</ref> Il existe des inférences valides (par exemple les déductions hypothétiques, ou les raisonnements ''par l’absurde'') qui ne sont pas des syllogismes parce qu’elles ne respectent pas la structure formelle requise.
====Termes, prémisses et structure du syllogisme====
Le syllogisme aristotélicien possède une structure rigoureusement délimitée. Il comprend trois termes : le grand terme (ou ''majeur''), le petit terme (ou ''mineur''), et le moyen terme (''mesos'') qui assure la liaison entre les deux extrêmes. Il comporte deux prémisses : la ''majeure'' (qui contient le grand terme) et la ''mineure'' (qui contient le petit terme). Chaque prémisse contient également le moyen terme. Il aboutit enfin à une conclusion qui relie le petit terme au grand terme, sans contenir le moyen terme.
L’exemple le plus connu, repris par toute la tradition scolastique, est celui qui prend Socrate comme petit terme : « Tout homme est mortel ; or Socrate est un homme ; donc Socrate est mortel ». Il faut noter qu’il s’agit là d’un exemple à terme singulier, scolaire et postérieur à Aristote ; la syllogistique aristotélicienne traite d’abord des propositions catégoriques entre termes généraux. Une formulation plus conforme à l’analyse aristotélicienne serait : « Tout animal est mortel ; tout homme est animal ; donc tout homme est mortel », où les trois termes (animal, homme, mortel) sont tous généraux et se prêtent aux quantifications universelles.
Le moyen terme joue, dans cette structure, un rôle central. Il est ce ''par quoi'' la conclusion est établie. Comme le résume Pellegrin, l’analytique tout entière peut se comprendre comme une technique de recherche du moyen terme : trouver des termes qui permettent de relier deux extrêmes de manière universelle et nécessaire.
====Les trois figures du syllogisme====
Aristote distingue, selon la position du moyen terme dans les prémisses, trois figures syllogistiques. Dans la première figure, le moyen terme est sujet dans la majeure et prédicat dans la mineure : « M est P ; S est M ; donc S est P ». Exemple (Barbara) : « Tout animal est mortel ; tout homme est animal ; donc tout homme est mortel ». Dans la deuxième figure, le moyen terme est prédicat dans les deux prémisses : « P est M ; S est M » (avec l’une des deux prémisses négative). Exemple (Cesare) : « Aucune pierre n’est animée ; tout cheval est animé ; donc aucun cheval n’est une pierre ». Dans la troisième figure, le moyen terme est sujet dans les deux prémisses : « M est P ; M est S ». Exemple (Darapti) : « Tout homme est rationnel ; tout homme est animal ; donc quelque animal est rationnel ».
Aristote considère la première figure comme la plus parfaite, et il faut bien comprendre pourquoi. Une figure est dite « parfaite » quand la nécessité de la conclusion est immédiatement évidente, sans qu’il soit besoin de justifier cette nécessité par un détour. Or la première figure exprime de manière directe le principe que la tradition scolastique appellera le ''dictum de omni et nullo'' (« le dit du tout et du rien ») : ce qui est affirmé (ou nié) de tout un genre est affirmé (ou nié) de tout ce qui tombe sous ce genre. Si « tout animal est mortel » et « tout homme est un animal », alors on voit immédiatement que « tout homme est mortel », parce que les hommes, étant des animaux, héritent de tout ce qu’on dit de tous les animaux. Le moyen terme « animal », en se trouvant entre le grand terme (mortel) et le petit terme (homme), permet à la propriété « mortel » de descendre par transitivité jusqu’aux hommes.
Les syllogismes des deuxième et troisième figures, en revanche, sont qualifiés d’« imparfaits » non parce qu’ils seraient invalides, mais parce que leur validité ne se voit pas immédiatement : on doit la ''dériver''. Pour cela, Aristote les ramène, par diverses opérations (notamment la conversion des prémisses), à des syllogismes parfaits de la première figure. Démontrer la validité d’un syllogisme de la deuxième figure, c’est montrer qu’il peut être traduit en un syllogisme équivalent de la première figure, où la nécessité de la conclusion est immédiatement saisie.
====Les modes valables : Barbara, Celarent, Darii, Ferio====
À l’intérieur de chaque figure, Aristote détermine les modes qui permettent de conclure validement, en croisant les quantités (universelle/particulière) et les qualités (affirmative/négative) des prémisses. La tradition scolastique a inventé des noms mnémotechniques (Barbara, Celarent, Darii, Ferio pour la première figure ; Cesare, Camestres, Festino, Baroco pour la deuxième ; Darapti, Felapton, Disamis, Datisi, Bocardo, Ferison pour la troisième), où les voyelles indiquent les types des prémisses et de la conclusion (A, E, I, O).
Pour la première figure, les quatre modes valables sont : Barbara (AAA), « Tout M est P ; tout S est M ; donc tout S est P » ; Celarent (EAE), « Aucun M n’est P ; tout S est M ; donc aucun S n’est P » ; Darii (AII), « Tout M est P ; quelque S est M ; donc quelque S est P » ; et Ferio (EIO), « Aucun M n’est P ; quelque S est M ; donc quelque S n’est pas P ».
Aristote considère également les autres combinaisons et montre lesquelles ne concluent pas (par la méthode des contre-exemples : on trouve une combinaison de termes qui rend les prémisses vraies et la conclusion fausse).
====La conversion et l’ekthèse====
Pour ramener les modes des deuxième et troisième figures à la première, Aristote emploie principalement deux techniques.
La conversion (''antistrophê'') consiste à transformer une prémisse en interchangeant son sujet et son prédicat. Aristote établit, au début du livre I, des règles de conversion. La E (universelle négative) se convertit simplement : « Aucun S n’est P » se convertit en « Aucun P n’est S ». La I (particulière affirmative) se convertit simplement aussi : « Quelque S est P » se convertit en « Quelque P est S ». La A (universelle affirmative) se convertit ''par accident'' : « Tout S est P » se convertit en « Quelque P est S » (mais non en « Tout P est S »). La O (particulière négative), enfin, ne se convertit pas. Ces règles permettent de transformer un syllogisme imparfait en un syllogisme parfait de la première figure, et donc de prouver sa validité.
L’''ekthèse'' (''ekthesis'', mot grec qui signifie littéralement « exposition », au sens d’« exposer », « mettre en avant ») est une technique plus rare, utilisée notamment pour valider Baroco et Bocardo, deux modes que la conversion ne suffit pas à ramener à la première figure. Le procédé consiste à introduire un terme supplémentaire, plus restreint, qui ''exemplifie'' la condition exprimée par une prémisse particulière. Si l’on a, par exemple, « quelque S n’est pas P », l’ekthèse pose un terme N qui désigne précisément cette portion de S qui n’est pas P, puis raisonne sur N comme sur un nouveau sujet. Le syllogisme se trouve ainsi reformulé sous une forme qui se prête à un raisonnement direct. Comme l’a montré Jonathan Lear, l’ekthèse n’implique pas une « imagination » au sens moderne, ni un appel à l’intuition sensible : c’est une procédure logique rigoureuse qui pose un cas particulier auquel s’appliquent les conditions de la prémisse, et qui permet de rendre manifeste une nécessité qui était implicitement contenue dans les prémisses originales.<ref>Lear, J., ''Aristotle and Logical Theory'', Cambridge, Cambridge University Press, 1980, chap. 1.</ref> Sa parenté avec certaines techniques de preuve mathématique (raisonner sur un cas particulier représentatif) est manifeste.
====La syllogistique modale (Patterson)====
Aux chapitres 3 et 8 à 22 du livre I, Aristote étend la syllogistique aux propositions modales (nécessaires, possibles, contingentes). Cette extension a été l’un des grands chantiers de l’aristotélisme contemporain, et Richard Patterson a proposé une lecture qui permet de comprendre la cohérence d’un système qui a souvent paru aux interprètes (Łukasiewicz, McCall, Hintikka) traversé de contradictions internes.
La thèse centrale de Patterson est qu’Aristote fait usage de ce qu’il appelle un ''modal copula'' : la modalité ne s’applique pas à la proposition entière (''de dicto'' : « il est nécessaire que tout homme soit animal »), ni au seul prédicat (''de re'' : « tout homme est nécessairement-animal »), mais à la copule elle-même qui relie sujet et prédicat. Au lieu de dire « tout homme ''est'' animal » (forme assertorique), on dirait « tout homme ''est-nécessairement'' animal » : c’est le « est » lui-même, la liaison prédicative, qui est qualifié modalement. Cette structure est elle-même ambiguë entre deux lectures : une lecture forte (''strong cop'') et une lecture faible (''weak cop'').
Dans la lecture forte, la proposition « Animal Ns (nécessaire selon copule forte) Tout-Homme » signifie qu’il existe une connexion ''per se'', c’est-à-dire essentielle, entre les termes : « animal » entre dans la définition d’« homme », c’est sa nature même d’être animal. Les propositions de la science démonstrative, telles que les ''Seconds Analytiques'' les caractérisent, sont des propositions à ''strong cop necessity''.
Dans la lecture faible, « Animal Nw Tout-Blanc » par exemple signifie seulement que tout ce qui est blanc est nécessairement animal, non pas parce qu’il y aurait une connexion essentielle entre blancheur et animalité, mais parce que ''de fait'', dans le monde considéré, tout ce qui est blanc se trouve être animal. Cette lecture ''de re'' étendue est plus large : elle inclut des cas où le prédicat appartient nécessairement au sujet sans pour autant entrer dans son essence.
Patterson montre que cette dualité éclaire une foule de difficultés que Łukasiewicz avait considérées comme des incohérences. La validité des syllogismes modaux dépend de la lecture qu’on adopte : certains modes sont valides en lecture forte mais non en lecture faible, et inversement. La syllogistique modale aristotélicienne n’est pas un système formel inconsistant ; c’est un système ancré dans une métaphysique essentialiste où la distinction entre essence et accident détermine les règles d’inférence valides.
Cette interprétation a également l’intérêt de montrer comment les ''Premiers Analytiques'' préparent les ''Seconds Analytiques''. Les syllogismes scientifiques de la démonstration sont ''par excellence'' des syllogismes modaux à ''strong cop necessity'', où les termes sont liés par des connexions ''per se''. La logique modale n’est pas une curiosité périphérique chez Aristote : elle est l’instrument logique de sa théorie de la science.
====Syllogisme et déduction : une équivalence problématique====
Un point souvent débattu, sur lequel Harari et Crivelli ont apporté des éclairages utiles, concerne la prétention d’Aristote à identifier syllogisme et déduction. Aristote affirme, en ''Premiers Analytiques'' I, 23 (40b20), que tous les syllogismes se forment dans les trois figures, et il ajoute que toute déduction est en principe réductible à un syllogisme. Cette thèse, que Lear appelle « la thèse d’Aristote », est plus forte qu’il n’y paraît.
D’un côté, Aristote reconnaît certaines exceptions : les déductions hypothétiques (« si A alors B ; or A ; donc B ») et les raisonnements ''par l’absurde'' ne se ramènent pas à la forme syllogistique standard. D’un autre côté, il maintient que toute ''démonstration scientifique'' directe, dans la mesure où elle vise à établir une connexion essentielle entre des termes, peut être recoulée dans une forme syllogistique.
Comme le montre Harari, la logique syllogistique aristotélicienne n’est pas une logique des propositions au sens contemporain (où les prémisses peuvent être de structures variées), mais une logique des prédications. Elle suppose que toute proposition se laisse analyser en sujet-prédicat (« A appartient à B », « A n’appartient pas à B », etc.), et que la combinaison des termes via un moyen terme est l’opération fondamentale du raisonnement valide. C’est précisément cette restriction qui fait sa puissance et son intérêt, mais aussi ses limites par rapport aux logiques modernes plus expressives.
====Ce qu’il faut retenir====
Les ''Premiers Analytiques'' fournissent la théorie générale du syllogisme. Aristote en donne la définition technique (trois termes, deux prémisses, conclusion nécessaire), distingue trois figures (selon la position du moyen terme), identifie les modes valides à l’intérieur de chacune, et propose des techniques (conversion, ekthèse) pour ramener les figures imparfaites à la première, considérée comme parfaite parce qu’elle exprime directement le principe ''dictum de omni et nullo''. La syllogistique modale, lue avec Patterson, révèle une logique ancrée dans une métaphysique essentialiste. Aristote prétend identifier syllogisme et déduction, mais il reconnaît des inférences valides qui ne sont pas des syllogismes (déductions hypothétiques, raisonnements par l’absurde).
===Chapitre IV. ''Les Seconds Analytiques'' : la science démonstrative===
====Le projet des ''Seconds Analytiques'' et la définition de la science====
Les ''Seconds Analytiques'' (''Analytica posteriora'') prolongent les ''Premiers Analytiques'' mais opèrent un déplacement important. Là où les ''Premiers'' étudiaient le syllogisme dans sa forme générale, les ''Seconds'' s’attachent à une espèce particulière du syllogisme : le syllogisme démonstratif ou scientifique (''apodeixis''). C’est cette espèce qui produit la science, c’est-à-dire la connaissance véritable.
Aristote ouvre le traité, au chapitre 2 du livre I, par une définition triple de la science : « Nous estimons posséder la science d’une chose d’une manière absolue quand nous croyons que nous connaissons la cause par laquelle la chose est, que nous savons que cette cause est celle de la chose, et qu’en outre il n’est pas possible que la chose soit autre qu’elle n’est ».<ref>Aristote, ''Seconds Analytiques'' I, 2, 71b9-12.</ref>
Cette définition condense trois exigences. Premièrement, la science est connaissance ''par les causes''. Savoir qu’il pleut n’est pas avoir la science de la pluie ; savoir ''pourquoi'' il pleut, ''par quelle cause'', c’est avoir la science. Deuxièmement, cette connaissance doit être ''certaine'' : il faut savoir que la cause est ''bien'' la cause, et non se contenter d’opinions plausibles. Troisièmement, elle porte sur des nécessités : ce qui est connu scientifiquement « ne peut pas être autrement ». La science ne porte pas sur le contingent (qui peut être ou ne pas être), mais sur ce qui est nécessairement ce qu’il est.
Orna Harari soulève une question importante quant au sens du terme ''epistêmê''. La traduction traditionnelle par « science » ou « connaissance » a été contestée : certains commentateurs contemporains soutiennent que le sens d’''epistêmê'' chez Aristote serait plus proche de l’''understanding'' (compréhension) que de la ''knowledge'' (connaissance) au sens moderne, parce qu’Aristote serait moins préoccupé par le problème de la justification que par celui de la saisie des structures explicatives. Harari elle-même propose de distinguer deux types de compréhension chez Aristote : une compréhension perceptuelle, liée à l’expérience sensible, et une compréhension conceptuelle, qui saisit les essences universelles. La science aristotélicienne intègre ces deux dimensions : elle part de la perception pour aboutir à la saisie de structures essentielles.
====La démonstration : structure et conditions des prémisses====
La démonstration est, selon Aristote, le syllogisme qui produit la science. Mais tout syllogisme valide n’est pas une démonstration : il faut, pour cela, que les prémisses satisfassent à des exigences supplémentaires. Aristote en énumère six, dans le chapitre 2 du livre I (71b20-25). Les prémisses de la démonstration doivent être vraies (une démonstration ne peut produire la science si elle part du faux : ce serait une démonstration apparente, non réelle). Elles doivent être premières (''prôta'') et immédiates (''amesa'') : elles ne dérivent pas elles-mêmes d’une démonstration, et il n’y a pas de moyen terme entre leur sujet et leur prédicat. Ce sont les principes (''archai'') à partir desquels toute démonstration procède. Elles doivent être plus connues que la conclusion : la connaissance de la conclusion repose sur la connaissance des prémisses ; il faut donc que celles-ci soient mieux connues, faute de quoi nous expliquerions l’obscur par le plus obscur. Elles doivent être antérieures à la conclusion (antériorité non chronologique mais ontologique et explicative : les prémisses sont ce qui rend la conclusion vraie, ce qui la fonde). Elles doivent être causes de la conclusion (''aitia tou symperasmatos'') : la démonstration ne se contente pas de prouver que quelque chose est ; elle explique ''pourquoi'' c’est. Cette exigence, qui distingue la démonstration scientifique du simple syllogisme valide, est ce qu’Aristote oppose au « syllogisme du fait » (''syllogismos tou hoti'') : un syllogisme du fait peut prouver qu’un état de choses existe, mais s’il ne donne pas la cause, il n’est pas un syllogisme du ''pourquoi'' (''syllogismos tou dioti''), et il n’est pas démonstration. Elles doivent être enfin mieux connaissables par nature, même si elles peuvent être moins connues par nous. La science consiste à passer de ce qui nous est plus familier (les phénomènes sensibles, les conclusions immédiates) à ce qui est plus connaissable en soi (les principes universels, les essences).
Comme le montre David Bronstein, ces conditions sont liées entre elles : c’est parce que les prémisses sont causes de la conclusion qu’elles lui sont antérieures, et c’est parce qu’elles sont premières qu’elles sont mieux connaissables par nature.<ref>Bronstein, D., ''Aristotle on Knowledge and Learning: The Posterior Analytics'', Oxford, Oxford University Press, 2016.</ref>
====Le rôle du moyen terme : prouver le pourquoi====
Le moyen terme joue, dans la démonstration scientifique, un rôle qui dépasse celui qu’il a dans le syllogisme général. Aristote affirme, en ''Seconds Analytiques'' II, 2 (90a6) : « le moyen terme est la cause ». Cette identification a des implications importantes.
L’exemple classique qu’Aristote donne, dans le livre II, est celui de l’éclipse de la lune. Si l’on cherche à ''démontrer'' que la lune subit des éclipses, on construit un syllogisme : tout ce qui est privé de lumière par interposition de la Terre subit une éclipse ; la lune est privée de lumière par interposition de la Terre ; donc la lune subit des éclipses.
Le moyen terme (« être privé de lumière par interposition de la Terre ») n’est pas seulement un ''lien logique'' qui permet de relier le sujet (la lune) au prédicat (subir une éclipse). Il est la cause physique réelle de l’éclipse. C’est l’interposition de la Terre qui ''fait'' qu’il y a éclipse ; le syllogisme, pour être démonstratif, doit identifier cette cause et la mettre dans le moyen terme.
Pellegrin a souligné, dans son étude des ''Seconds Analytiques'', que connaître scientifiquement les choses, c’est les connaître sous la forme ou dans l’ordre où elles se trouvent dans la démonstration. La démonstration n’est pas une procédure heuristique pour découvrir des explications nouvelles ; elle est plutôt la forme canonique du savoir scientifique, où les relations causales sont déployées de la manière la plus claire et la plus explicite.
Aristote distingue, en ''Seconds Analytiques'' II, 11, quatre types de causes correspondant aux quatre causes de la ''Physique'' (II, 3) : la cause matérielle, la cause formelle, la cause efficiente (ou motrice) et la cause finale. La démonstration scientifique peut faire intervenir l’une ou l’autre de ces causes selon la nature de l’explication recherchée. Pellegrin a consacré un article remarqué à l’analyse de ce chapitre, soulignant les difficultés particulières que pose la démonstration de la cause finale, où le syllogisme doit faire intervenir un ''en vue de quoi'' qui ne se laisse pas réduire à un simple lien logique.<ref>Pellegrin, P., « Causal Explanation and Demonstration in ''Posterior Analytics'' II 11 », dans A. P. Mesquita et R. Santos (dir.), ''New Essays on Aristotle’s Organon'', Routledge, 2024, chap. 7.</ref>
====Les principes : axiomes, hypothèses et définitions====
Toute démonstration présuppose, comme on l’a vu, des principes (''archai'') qui ne peuvent être eux-mêmes démontrés. Aristote rejette à la fois la possibilité d’une régression infinie (qui ferait de chaque prémisse l’objet d’une démonstration ultérieure, sans terme) et celle d’une démonstration circulaire (où A serait démontré par B et B par A). Il faut donc admettre l’existence de principes premiers connus ''sans'' démonstration.
Aristote distingue trois catégories de principes.
Les axiomes (''axiômata'') ou principes communs sont des principes qui s’appliquent à toutes les sciences. Le plus fondamental est le principe de non-contradiction (« il est impossible que le même attribut appartienne et n’appartienne pas en même temps au même sujet et sous le même rapport », ''Métaphysique'' Γ, 3, 1005b19-20). Vient ensuite le principe du tiers exclu (« entre deux contradictoires, il n’y a pas de moyen terme »). Aristote considère ces axiomes comme des principes que toute pensée rationnelle présuppose nécessairement : les contester reviendrait à contester la possibilité même de penser et de parler. Il défend le principe de non-contradiction, dans le livre Γ de la ''Métaphysique'', par une ''réfutation dialectique'' de ses adversaires : dès lors que celui qui le conteste « dit quelque chose de déterminé », il présuppose le principe qu’il prétend nier.
Les hypothèses (''hypotheseis'') et les thèses (''theseis'') sont des principes propres à chaque science. Aristote distingue les hypothèses, qui affirment l’existence de certaines entités (les points en géométrie, les unités en arithmétique), et les thèses, qui prennent position sans nécessairement affirmer une existence. En géométrie, l’hypothèse selon laquelle « il existe des points » est un principe que la science ne démontre pas, mais qu’elle pose comme condition de possibilité de ses démonstrations.
Les définitions (''horoi'') sont des énoncés qui disent ce qu’est une chose, son essence (''ti esti''). Aristote consacre une grande partie du livre II des ''Seconds Analytiques'' à examiner si l’essence peut être démontrée. Il conclut négativement : la définition n’est pas une démonstration, parce qu’elle ne procède pas par syllogisme et qu’elle pose plutôt qu’elle ne prouve. Toutefois, certaines définitions peuvent ''découler'' de démonstrations : c’est le cas des définitions causales. La définition du tonnerre, par exemple (« bruit dans les nuages causé par l’extinction du feu »), peut être obtenue à partir d’une démonstration qui établit la cause (l’extinction du feu) du phénomène (le bruit dans les nuages).
====L’unité et la diversité des sciences====
Une thèse importante des ''Seconds Analytiques'' est l’interdiction du passage d’un genre à un autre (''metabasis eis allo genos''). Chaque science se définit par son genre propre (le genre des objets dont elle traite), et elle ne peut emprunter ses principes ou ses démonstrations à une autre science. La géométrie ne peut démontrer une vérité d’arithmétique ; la physique ne peut démontrer une vérité de biologie en utilisant des principes physiques.
Cette règle, expliquée en ''Seconds Analytiques'' I, 7, garantit l’autonomie des sciences. Chaque science a ses propres principes, son propre objet, ses propres méthodes adaptées à la nature de son objet. Comme l’écrira Aristote dans l’''Éthique à Nicomaque'' (I, 3) : il faut chercher dans chaque domaine la précision que cet objet permet ; il serait absurde d’exiger d’un mathématicien la rigueur d’un orateur, et tout aussi absurde d’exiger d’un orateur la précision du mathématicien.
Aristote admet cependant trois exceptions à cette règle d’autonomie. La première est la subordination d’une science à une autre : l’optique est subordonnée à la géométrie, en ce qu’elle utilise les théorèmes géométriques mais les applique à un objet particulier (la lumière). Il ne s’agit pas d’un transfert illicite, parce que la science subordonnée prend ses principes d’une science supérieure dont elle dépend. La deuxième est le partage des axiomes communs : le principe de non-contradiction n’est pas le monopole d’une science particulière, il est utilisé par toutes. Aristote précise toutefois que chaque science l’utilise « dans la mesure » où son objet l’exige. La troisième est l’existence des sciences mixtes (''metaxu'') : l’astronomie mathématique, la mécanique, l’harmonique sont des sciences qui utilisent les mathématiques pour étudier des phénomènes physiques. Ce sont des cas particuliers où la transition d’un genre à un autre est légitime parce que les phénomènes étudiés ont une structure mathématique intrinsèque.
Cette théorie de l’unité-diversité des sciences fonde l’organisation aristotélicienne du savoir. Chaque science possède une méthode adaptée à son objet : les mathématiques procèdent par démonstration nécessaire à partir d’axiomes ; la physique tient compte du changement et des causes naturelles ; la biologie observe les régularités qui se produisent « dans la plupart des cas » (''hôs epi to poly''), formule importante parce qu’elle reconnaît que le vivant n’obéit pas à une nécessité aussi rigoureuse que la matière inerte ; l’éthique et la politique se contentent de vérités qui valent « pour la plupart », parce que leur objet (l’action humaine) est essentiellement contingent.
====La connaissance des principes : induction et intellection====
Si toute science procède de principes indémontrables, comment pouvons-nous connaître ces principes eux-mêmes ? Cette question, posée dès le chapitre 3 du livre I, reçoit sa réponse dans le dernier chapitre des ''Seconds Analytiques'' (II, 19), l’un des textes les plus discutés de l’aristotélisme.
La réponse d’Aristote articule plusieurs étapes. La connaissance des principes ne peut pas être innée (comme le voudrait Platon avec sa théorie de la réminiscence), parce qu’il serait absurde que nous possédions une connaissance plus exacte que la science et que nous l’ignorions. Mais elle ne peut pas non plus naître de rien, parce que toute connaissance présuppose une certaine connaissance préalable.
La solution est qu’il existe en nous une ''capacité'' (''dynamis'') de connaître les principes, capacité qui n’est pas elle-même une connaissance déterminée mais qui se déploie progressivement à partir de la sensation. Aristote décrit ce processus en plusieurs étapes. La sensation (''aisthêsis'') est la base : elle saisit les choses singulières. La sensation laisse des traces qui constituent la mémoire (''mnêmê'') : nous nous souvenons des choses perçues. L’accumulation et l’organisation des souvenirs produisent l’expérience (''empeiria'') : nous reconnaissons des régularités, des cas semblables. À partir de l’expérience se forme l’universel (''katholou'') qui « se repose dans l’âme » et constitue l’art (''technê'') ou la science (''epistêmê'').<ref>Aristote, ''Seconds Analytiques'' II, 19, 100a3-9.</ref>
Aristote compare ce processus, dans une image célèbre, à une armée en déroute : « comme dans une bataille, quand une déroute se produit, un soldat fait halte, puis un autre, puis un autre, jusqu’à ce que se reconstitue le rang originel ». De même, à partir d’une multitude d’impressions sensorielles d’abord confuses, l’âme construit progressivement la saisie de l’universel.
Le terme qu’Aristote emploie pour ce processus est ''epagôgê'', qu’on traduit traditionnellement par induction. Mais Orna Harari a montré, dans une analyse minutieuse, que ce terme a chez Aristote (au moins) deux sens distincts.
Dans un premier sens, l’induction argumentative, ''epagôgê'' désigne un type d’inférence qui établit (ou justifie) une proposition universelle à partir de cas particuliers. C’est l’usage qu’on trouve dans les ''Topiques'' et dans les ''Premiers Analytiques'' II, 23. Cette induction est une ''forme de raisonnement'' qui peut être confrontée au syllogisme.
Dans un second sens, l’induction cognitive ou perceptuelle, ''epagôgê'' désigne un acte cognitif par lequel l’esprit reconnaît dans le particulier l’aspect universel. C’est cet usage qu’on trouve, selon Harari, en ''Seconds Analytiques'' II, 19 et I, 1. Quand Aristote dit que nous saisissons les principes par induction, il ne veut pas dire que nous les ''prouvons'' à partir de cas particuliers ; il veut dire que la perception elle-même, en saisissant un cas particulier, nous ouvre l’accès à l’universel qui s’y manifeste.
La saisie ultime des principes premiers relève d’une faculté qu’Aristote nomme intellect (''nous'') ou intuition intellectuelle. C’est, écrit-il en ''Seconds Analytiques'' II, 19 (100b12), « la disposition par laquelle nous connaissons les principes ». Le ''nous'' est, selon Aristote, supérieur même à la science démonstrative, parce qu’il saisit ce qui rend la science possible. Comme le formule l’''Éthique à Nicomaque'' VI, 6 : « l’intellect a pour objet les principes, dont aucune définition ne peut rendre compte ».
Cette doctrine soulève des difficultés notoires que les commentateurs ont longuement débattues. Comment l’intellect peut-il être à la fois une ''capacité innée'' (en puissance, depuis la naissance) et le ''résultat d’un apprentissage'' (en acte, à partir de l’expérience) ? Comment articuler le rôle de l’induction (qui est un processus discursif) et celui de l’intellect (qui est, selon l’''Éthique à Nicomaque'', ''non discursif'') ? Harari propose une articulation : l’induction est la ''procédure'' qui prépare la saisie ; l’intellect est l’''état cognitif'' qui résulte de cette préparation et qui ''saisit'' effectivement les principes. Les deux sont nécessaires : l’induction sans intellect est aveugle ; l’intellect sans induction n’a pas de matière à saisir.
====Le statut épistémologique des ''Seconds Analytiques'' : démonstration ou méthode ?====
Une question importante, sur laquelle Pellegrin et d’autres commentateurs (Brunschwig, Bronstein) ont insisté, concerne le statut même de la démonstration aristotélicienne. La démonstration est-elle une méthode de découverte, un instrument heuristique pour trouver des vérités nouvelles ? Ou est-elle plutôt la forme canonique du savoir établi, c’est-à-dire la manière dont une science déjà constituée s’expose et se transmet ?
La lecture traditionnelle, dominante depuis l’Antiquité jusqu’à la Renaissance, voyait dans la démonstration une méthode de découverte. La science moderne, à partir de Bacon et de Descartes, a critiqué cette lecture : la démonstration syllogistique, disait Bacon, ne fait que tirer ce qu’on a déjà mis dans les prémisses ; elle ne produit pas de connaissance nouvelle.
La lecture contemporaine, esquissée par Pellegrin et défendue par Bronstein, propose une autre interprétation. La démonstration n’est pas une méthode de ''découverte'', mais la ''forme du savoir scientifique constitué''. Une fois qu’une science a identifié ses principes (par induction et intellection) et a établi les connexions causales entre les phénomènes qu’elle étudie, elle peut ''exposer'' ce savoir sous la forme d’une chaîne de syllogismes démonstratifs. La démonstration est l’organisation rationnelle d’un savoir, son architecture logique, et non pas la procédure par laquelle ce savoir a été acquis.
Cette interprétation a deux mérites. D’abord, elle dissout l’objection baconienne-cartésienne : si la démonstration n’est pas une méthode de découverte, elle ne peut pas être critiquée pour ne pas en être une. Ensuite, elle restitue l’unité du projet aristotélicien : les ''Topiques'' (méthode dialectique de découverte des prémisses), les ''Premiers Analytiques'' (forme générale du syllogisme) et les ''Seconds Analytiques'' (forme spécifique du syllogisme scientifique) ne sont pas des projets disjoints, mais les pièces d’un dispositif où la dialectique fournit les matériaux que la science organise sous forme démonstrative.
====Ce qu’il faut retenir====
Les ''Seconds Analytiques'' développent la théorie de la science démonstrative. La science est connaissance par les causes, certaine et nécessaire ; la démonstration est le syllogisme qui la produit, à six conditions ; le moyen terme est la cause. Les principes (axiomes, hypothèses, définitions) ne sont pas démontrables, et chaque science a son genre propre (interdiction de la ''metabasis''). La connaissance des principes procède par induction sensorielle et culmine dans l’intellect (''nous''). La démonstration s’entend mieux, selon une lecture contemporaine, comme forme du savoir constitué que comme méthode heuristique de découverte.
===Chapitre V. ''Les Topiques'' : l’art de la dialectique===
====La dialectique : définition et statut====
Les ''Topiques'' constituent, selon l’hypothèse défendue notamment par Brunschwig, le traité chronologiquement parmi les plus anciens de l’''Organon'' (bien que l’arrangement andronicien l’ait relégué à la fin). Ils sont consacrés à l’art de la dialectique (''dialektikê''), c’est-à-dire à la pratique de la discussion réglée entre deux interlocuteurs.
Aristote distingue dès le premier chapitre du livre I trois types de raisonnement selon la nature de leurs prémisses. Le syllogisme démonstratif part de prémisses ''vraies et premières'', ou de prémisses qui sont elles-mêmes connues par des prémisses vraies et premières : c’est l’objet des ''Seconds Analytiques''. Le syllogisme dialectique part de prémisses qui sont des opinions valables (''endoxa''), c’est-à-dire « des opinions qui sont admises par tous, ou par la plupart, ou par les sages, et parmi les sages, par tous, ou par la plupart, ou par les plus connus et les plus reconnus ».<ref>Aristote, ''Topiques'' I, 1, 100a29-b23.</ref> Le syllogisme éristique ou sophistique, enfin, part de prémisses qui ''paraissent'' être des opinions valables sans l’être réellement : c’est l’objet des ''Réfutations sophistiques''.
La distinction entre démonstration et dialectique n’est pas une distinction de ''forme'' (les deux sont des syllogismes au sens des ''Premiers Analytiques'') mais de ''matière'' : ce qui les distingue, c’est la nature des prémisses qu’elles utilisent. Cette différence a néanmoins des conséquences importantes. La démonstration vise la connaissance scientifique ; la dialectique vise une argumentation rationnelle dans les domaines où la certitude scientifique n’est pas accessible, c’est-à-dire la grande majorité des domaines de la pensée et de la vie humaine.
====La structure du débat dialectique====
Le débat dialectique aristotélicien possède une structure formellement très précise. Comme l’a montré Brunschwig dans son introduction à l’édition des ''Topiques'' (Belles Lettres), il met en présence deux protagonistes : le questionneur et le répondant.
Le répondant (en grec, ''apokrinomenos'') commence par défendre une thèse, c’est-à-dire une proposition à laquelle il s’engage. Cette thèse peut être affirmative ou négative ; le répondant est libre de la choisir. Une fois la thèse posée, son rôle consiste à la ''défendre'' contre les attaques du questionneur, en accordant ou en refusant les prémisses que celui-ci lui propose.
Le questionneur (en grec, ''erôtôn'') a la tâche la plus lourde : il doit, écrit Brunschwig, « construire une argumentation formellement contraignante, ayant pour prémisses des propositions auxquelles le répondant ne puisse refuser son assentiment, et pour conclusion la proposition contradictoire de celle que soutient le répondant ».<ref>Brunschwig, J., introduction à Aristote, ''Topiques'' (livres I-IV), Les Belles Lettres, 1967, rééd. 2007, p. XXXVIII.</ref> Autrement dit, le questionneur doit ''réfuter'' la thèse du répondant en tirant, à partir de prémisses que le répondant ne peut refuser, la contradictoire de cette thèse.
Cette structure n’est pas un simple jeu : elle est le modèle aristotélicien du débat rationnel. Toute discussion philosophique sérieuse, toute confrontation intellectuelle où l’on cherche à éprouver la solidité d’une opinion, peut être analysée selon ce modèle. Et la fonction des ''Topiques'' est de fournir au questionneur (et secondairement au répondant) un manuel pratique pour mener ce type de discussion avec efficacité.
====Les quatre prédicables====
Avant de présenter les ''topoi'' eux-mêmes, Aristote introduit, au livre I, une distinction importante : celle des quatre prédicables. Quand on attribue un prédicat à un sujet, on peut le faire de quatre manières.
Par accident (''sumbebêkos''), le prédicat n’est ni essentiel au sujet ni de même extension que lui : « Socrate est blanc » ; « blanc » est un accident de Socrate, qui peut être remplacé par un autre attribut sans que Socrate cesse d’être Socrate. Par genre (''genos''), le prédicat est essentiel au sujet mais d’une extension plus large que lui : « Socrate est animal » ; « animal » est le genre auquel appartient l’espèce « homme », et Socrate, en tant qu’homme, hérite de tout ce qui appartient à l’animal. Par propre (''idion''), le prédicat n’est pas essentiel au sujet mais lui est coextensif (il s’applique à tout le sujet et seulement à lui) : « L’homme est rieur » ; être rieur n’entre pas dans la définition de l’homme, mais tout homme est rieur et tout rieur est homme. Par définition (''horos''), enfin, le prédicat est à la fois essentiel et coextensif au sujet : « L’homme est animal raisonnable » ; la définition exprime l’essence de manière exhaustive, en composant le genre et la différence spécifique.
Cette classification fournit un cadre pour organiser les ''topoi''. Les livres II et III des ''Topiques'' sont consacrés aux topoi de l’accident, le livre IV aux topoi du genre, le livre V à ceux du propre, les livres VI et VII à ceux de la définition. Pour chaque type de prédication, on dispose d’arguments qui permettent soit de l’établir soit de la réfuter. Pour démontrer qu’un prédicat est ''accidentel'' à un sujet, par exemple, on n’utilisera pas les mêmes outils que pour démontrer qu’il en constitue le ''genre'' : la stratégie argumentative dépend du type de relation prédicative qu’on cherche à établir ou à contester.
Cette classification aristotélicienne en quatre prédicables sera reprise par Porphyre dans son ''Isagoge'' (introduction aux ''Catégories''), qui en proposera une version à cinq prédicables (genre, espèce, différence, propre, accident). La version à cinq prédicables, qu’on appelle souvent les « cinq voix de Porphyre », a dominé la tradition logique médiévale ; mais le découpage proprement aristotélicien est bien celui à quatre prédicables.
====Les ''topoi'' : qu’est-ce qu’un lieu commun ?====
Le mot grec ''topos'' signifie « lieu », et l’''Aristoteles-Handbuch'' explique l’image : comme un général doit identifier le « lieu » à partir duquel attaquer son adversaire, le dialecticien doit identifier les ''lieux'' d’argumentation à partir desquels il pourra construire ses prémisses. Aristote ne donne nulle part une définition précise du ''topos'', mais on peut le caractériser comme un schéma général d’argumentation sous lequel tombent plusieurs arguments concrets.
Un exemple permet de saisir : le topos du plus et du moins (II, 10). Si ce qui est plus susceptible d’appartenir à quelque chose ne lui appartient pas, ce qui l’est moins ne lui appartiendra pas non plus. À partir de ce schéma général, on peut construire une multitude d’arguments concrets : si même la mer ne te paraît pas froide, comment l’eau de la rivière le serait-elle ? si même Socrate, qui est sage, ne sait pas la solution, comment quelqu’un de moins sage la saurait-il ? Le ''topos'' n’est pas un argument particulier, c’est une matrice qui permet d’engendrer des arguments adaptés à chaque cas.
Aristote présente, dans les ''Topiques'', plusieurs centaines de ''topoi''. Le projet est moins celui d’une théorie systématique que celui d’un manuel pratique : on y trouve des conseils stratégiques (livre VIII) sur la manière de poser les questions, de cacher ses intentions, d’amener progressivement le répondant à accorder les prémisses dont on a besoin.
====Les trois utilités de la dialectique====
Aristote précise, au chapitre 2 du livre I, à quoi sert la dialectique. Il distingue trois utilités. La première est l’entraînement intellectuel (''gymnasia'') : le débat dialectique est un exercice qui forme l’esprit, comme le sport forme le corps ; il habitue à formuler clairement ses idées, à anticiper les objections, à raisonner rapidement. La deuxième concerne les rencontres avec autrui : pour discuter efficacement avec ceux qui n’ont pas reçu de formation philosophique (« les Plusieurs »), il faut pouvoir argumenter à partir de leurs propres opinions, c’est-à-dire à partir des ''endoxa''. La dialectique fournit les outils pour ce type de discussion. La troisième utilité concerne les sciences philosophiques elles-mêmes ; c’est la plus importante et la plus subtile. Aristote affirme que la dialectique permet d’examiner ''critiquement'' (''peirastikê'') les principes des sciences, en confrontant les opinions opposées. Elle permet aussi de parcourir les difficultés (''aporiai'') et de dégager progressivement les principes véritables. Cette méthode est mise en œuvre par Aristote lui-même dans la quasi-totalité de ses traités : il commence presque toujours par exposer les opinions de ses prédécesseurs (les ''endoxa''), il en montre les insuffisances et les contradictions (les ''aporiai''), et il dégage progressivement sa propre position en cherchant à ''préserver'' ce qui était vrai dans les opinions reçues tout en évitant leurs erreurs.
Cette troisième utilité a un poids philosophique particulier. Elle implique que la dialectique n’est pas seulement un instrument de discussion publique, mais un instrument de recherche philosophique. Elle permet d’aborder les principes que la science démonstrative ne peut pas elle-même fonder : comme l’écrit Aristote en ''Topiques'' I, 2, les principes des sciences ne peuvent être tirés des sciences elles-mêmes (puisque les principes sont premiers dans chaque science), mais ce sont seulement les ''endoxa'' qui peuvent y conduire. La dialectique, par son examen critique des opinions reçues, fournit un chemin vers les principes ; chemin qui ne remplace pas l’intuition intellectuelle (''nous'') mais qui la prépare et l’éclaire.
L’''Aristoteles-Handbuch'' formule cette idée de la manière suivante : l’argumentation à partir des ''endoxa'', exercée dans la dialectique, ouvre la seule voie vers la consolidation argumentative des principes, quand bien même ceux-ci auraient été d’abord saisis par voie inductive et noétique. La dialectique aristotélicienne n’est pas une simple sous-discipline de la logique : elle est un mode d’accès à la vérité qui complète la démonstration par le bas (en approchant les principes) et la science par le haut (en discutant leurs présupposés).
====Ce qu’il faut retenir====
Les ''Topiques'' codifient l’art du débat dialectique entre questionneur et répondant. Le syllogisme dialectique part de prémisses simplement probables (''endoxa'') et non de prémisses vraies. Aristote distingue quatre prédicables (accident, genre, propre, définition) qui organisent les centaines de ''topoi'' du traité. La dialectique a trois utilités : entraînement intellectuel, discussion avec autrui, recherche philosophique. Cette dernière utilité est philosophiquement importante : elle permet d’approcher les principes que la science démonstrative présuppose sans pouvoir les fonder.
===Chapitre VI. ''Les Réfutations sophistiques'' : les paralogismes et leur démasquage===
====Le projet des ''Réfutations sophistiques''====
Les ''Réfutations sophistiques'' (''Peri sophistikôn elenchôn'') sont parfois considérées comme un appendice (ou même comme un neuvième livre) des ''Topiques''. Leur projet est complémentaire : alors que les ''Topiques'' enseignent à construire des syllogismes dialectiques ''valides'', les ''Réfutations sophistiques'' étudient les syllogismes qui ''paraissent'' valides sans l’être. Aristote y entreprend une typologie systématique des paralogismes (raisonnements fallacieux) pour permettre au dialecticien de les détecter et de les démasquer.
L’''Aristoteles-Handbuch'' précise le projet : il s’agit pour Aristote de fournir une analyse critique de la pratique argumentative des sophistes. Le sophiste est, pour Aristote (à la suite de Platon), celui qui « se donne l’apparence de la sagesse sans l’être réellement » et qui « gagne son argent avec l’apparence de la sagesse ». Pour produire cette apparence, le sophiste utilise des paralogismes, c’est-à-dire des raisonnements qui ressemblent à des syllogismes valides sans en être réellement.
====Les six sophismes liés au langage====
Aristote distingue treize types de sophismes, qu’il classe en deux catégories. Six dépendent du langage (''para tên lexin''), sept en sont indépendants.<ref>Aristote, ''Réfutations sophistiques'' 4, 165b23-166b19. Voir Dorion, L.-A., ''Les Réfutations Sophistiques d’Aristote'', Paris, Vrin, 1995.</ref>
Les six sophismes liés au langage sont d’abord l’''homonymie'', qui exploite l’ambiguïté d’un mot ayant plusieurs sens : « Le chien aboie ; or la canicule est un chien (en grec, ''kuôn'' signifie à la fois le chien et la constellation du Chien) ; donc la canicule aboie. » Vient ensuite l’''amphibologie'', qui repose sur l’ambiguïté syntaxique d’une phrase : « Je veux que vous capturiez les ennemis » peut signifier « je veux que ce soit vous qui capturiez les ennemis » ou « je veux que les ennemis soient capturés par vous ». Le sophisme de la ''composition'' consiste à confondre un sens où plusieurs termes sont pris ensemble et un sens où ils sont pris séparément. L’exemple d’Aristote : « Il est possible de se tenir debout pendant qu’on est assis » peut signifier soit qu’il est possible d’être à la fois assis et debout au même moment (sens composé, faux), soit qu’il est possible, pour quelqu’un actuellement assis, de se tenir debout à un autre moment (sens divisé, vrai). Le sophisme de la ''division'' procède à la confusion inverse, en prenant séparément ce qui doit être pris ensemble. Le sophisme de l’''accentuation'' joue sur une ambiguïté qui repose sur la prononciation, l’accent ou la quantité des syllabes. Enfin, le sophisme de la ''forme de l’expression'' confond des expressions qui ont la même forme grammaticale mais relèvent de catégories différentes : on peut par exemple traiter « courir » comme s’il désignait une qualité quand il désigne en réalité une action.
====Les sept sophismes hors du langage====
Les sept sophismes qui ne dépendent pas du langage sont les suivants.
Le sophisme de l’''accident'' confond ce qui est attribué à un sujet de manière essentielle et ce qui ne lui est attribué que de manière accidentelle. L’exemple classique d’Aristote : « Coriskos est différent de Socrate ; or Socrate est un homme ; donc Coriskos est différent d’un homme. » Le paralogisme consiste à transférer la différence entre Coriskos et Socrate (en tant qu’individus) à la relation entre Coriskos et l’humanité, comme si le fait que Socrate soit un homme rendait toute différence d’avec Socrate une différence d’avec l’humanité.
Le ''passage du qualifié à l’absolu'' (''secundum quid'') confond ce qui est vrai sous un certain rapport et ce qui est vrai absolument : « L’Éthiopien est blanc des dents ; donc l’Éthiopien est blanc. »
L’''ignorance de la réfutation'' (''ignoratio elenchi'') consiste à produire une réfutation qui ne réfute pas vraiment la thèse adverse, parce qu’elle ne porte pas exactement sur la même chose, ou ne respecte pas les conditions de la véritable contradiction.
La ''pétition de principe'' (''petitio principii'') suppose dans les prémisses ce qu’on prétend démontrer dans la conclusion.
Le ''faux enchaînement'' consiste à prendre pour cause ce qui n’est pas la cause. C’est le sophisme du ''non causa pro causa'', particulièrement répandu dans les ''reductio ad impossibile'' mal conduits.
La ''prise de l’antécédent comme conséquent'' infère « si A alors B ; or B ; donc A » (qui est formellement invalide). L’''Aristoteles-Handbuch'' en donne un exemple éclairant : si l’interlocuteur a admis que la terre est mouillée, le sophiste en conclut faussement qu’il a plu ; il a tacitement renversé la véritable relation de conséquence (« s’il a plu, la terre est mouillée ») en la pseudo-relation (« si la terre est mouillée, il a plu »).
La ''réunion de plusieurs questions en une'', enfin, consiste à poser une question complexe (« Avez-vous cessé de battre votre femme ? ») où une réponse unique implique des concessions sur plusieurs points distincts.
====La réduction à l’''ignoratio elenchi''====
Un point important, souvent négligé, est qu’Aristote affirme, au chapitre 6 des ''Réfutations'', que tous les treize types de sophismes peuvent être ramenés à un seul : l’ignorance de la réfutation (''ignoratio elenchi''). Pour chacune des treize espèces, la cause de la tromperie peut être analysée comme une méconnaissance de ce qu’est une véritable réfutation.
Une réfutation authentique exige que le syllogisme conclue à la ''contradictoire exacte'' de la thèse adverse, c’est-à-dire qu’il porte sur le même sujet, sous le même rapport, dans le même sens des termes, etc. Les sophismes manquent toujours, d’une manière ou d’une autre, à l’une de ces conditions : ils produisent une apparente contradiction qui n’est pas une véritable contradiction. C’est pourquoi la définition rigoureuse de la contradiction (que le ''De interpretatione'' avait déjà élaborée) est la clef de la détection de tous les paralogismes.
====Logique et défense de la rationalité====
Au-delà de son utilité technique, l’étude des sophismes a une portée philosophique propre. Elle implique qu’il existe des règles objectives du raisonnement correct, indépendantes de l’habileté rhétorique de celui qui argumente. Cette thèse a été souvent lue, dans la tradition interprétative, comme une réponse au relativisme attribué aux sophistes (relativisme dont Protagoras est le représentant emblématique).
Une partie de la recherche contemporaine nuance cependant cette lecture. Comme l’a montré L.-A. Dorion dans son étude sur la dialectique aristotélicienne, la « réponse aux sophistes » n’est pas un combat frontal contre des adversaires identifiés, mais une délimitation du domaine de la science par rapport à celui de l’argumentation persuasive. Aristote ne prétend pas réfuter le sophiste ; il prétend établir les conditions minimales pour qu’un discours rationnel soit possible. Comme dans la défense du principe de non-contradiction au livre Γ de la ''Métaphysique'', il s’agit moins de démontrer une thèse que de montrer que toute pensée présuppose certains principes faute de quoi elle s’effondre dans l’inintelligibilité.
C’est en ce sens que les ''Réfutations sophistiques'' ne sont pas un appendice mineur, mais une pièce nécessaire de l’''Organon'' : elles défendent la rationalité elle-même contre ses propres dégradations possibles. La logique aristotélicienne n’est pas seulement une théorie du raisonnement valide ; elle est aussi une éthique du raisonnement, qui distingue la recherche honnête de la vérité de la manipulation rhétorique des esprits.
====Ce qu’il faut retenir====
Les ''Réfutations sophistiques'' classent treize types de paralogismes (six liés au langage, sept indépendants du langage) et les ramènent tous à un seul, l’ignorance de la réfutation. Le traité défend les conditions minimales du discours rationnel et complète, par leur démasquage, la théorie du raisonnement valide exposée dans les autres traités de l’''Organon''.
===Conclusion. Postérité et lectures contemporaines de l’''Organon''===
====Continuités et transformations====
L’''Organon'' a fourni, pendant deux millénaires, le modèle dominant de la rationalité occidentale. Les ''Éléments'' d’Euclide, avec leur méthode axiomatique-déductive, ont été lus dans la tradition comme un exemple privilégié d’organisation déductive du savoir, en consonance avec l’idéal aristotélicien de science (sans qu’il faille pour autant supposer qu’Euclide ait composé son ouvrage en application directe du programme aristotélicien). La théologie scolastique médiévale, des grands commentateurs arabes (Al-Farabi, Avicenne, Averroès) à Thomas d’Aquin, a fait du syllogisme et de la démonstration les instruments fondamentaux de la pensée rationnelle. Les universités européennes, jusqu’au XVII{{e}} siècle, ont enseigné la logique sur la base des traités aristotéliciens.
La révolution scientifique moderne a ébranlé cet édifice. Bacon, dans le ''Novum Organum'' (1620, dont le titre même est un défi à Aristote), dénonce la stérilité de la logique syllogistique : elle ne fait que tirer ce qu’on a déjà mis dans les prémisses, elle ne produit pas de connaissance nouvelle. Descartes, dans le ''Discours de la méthode'', reproche au syllogisme de servir « plutôt à expliquer à autrui les choses qu’on sait, ou même à parler sans jugement de celles qu’on ignore, qu’à les apprendre ». La science moderne, avec son recours à l’expérimentation, à l’hypothèse provisoire, à la méthode hypothético-déductive, semble s’écarter résolument du modèle aristotélicien.
Cette rupture, longtemps présentée comme totale, est aujourd’hui nuancée par la recherche contemporaine. Comme le rappelle Pellegrin, la transition vers la science moderne combine continuités, relectures et oppositions plutôt qu’une opposition unilatérale. Les scolastiques tardifs (Zabarella, Pacius) avaient déjà élaboré, à l’intérieur du cadre aristotélicien, des distinctions méthodologiques (entre démonstration ''quia'' et démonstration ''propter quid'', entre méthode résolutive et méthode compositive) qui annoncent les analyses modernes.
====Les apports durables de la logique aristotélicienne====
Quelles que soient les critiques adressées à la logique aristotélicienne, son apport historique reste considérable.
Premièrement, Aristote a établi pour la première fois les règles de la déduction valide. Il a distingué clairement la ''forme'' du raisonnement (qui détermine sa validité) de sa ''matière'' (qui détermine la vérité de ses prémisses). Cette distinction, qui paraît aujourd’hui évidente, a constitué un acquis durable de la philosophie.
Deuxièmement, Aristote a montré la nécessité des principes premiers. Toute chaîne de justification doit s’arrêter quelque part, faute de quoi elle régresse à l’infini ou se mord la queue. Cette analyse du « trilemme d’Agrippa » avant l’heure est l’une des contributions les plus profondes des ''Seconds Analytiques'' à la théorie de la connaissance.
Troisièmement, sa conception de l’explication scientifique comme connaissance des causes (''hoti'' contre ''dioti'') continue de nourrir la réflexion contemporaine en philosophie des sciences. Les analyses contemporaines de l’explication scientifique (Hempel, Salmon, Woodward) peuvent être mises en dialogue avec les distinctions aristotéliciennes.
Quatrièmement, sa logique modale, longtemps négligée, a connu un renouveau avec le développement des logiques modales contemporaines (Kripke, Hintikka). La distinction entre modalité ''de dicto'' et ''de re'', déjà esquissée chez Aristote selon Patterson, est au cœur des débats actuels en métaphysique modale.
Cinquièmement, sa réflexion sur les futurs contingents a inspiré toute une famille de logiques non classiques (Łukasiewicz, Prior, logiques temporelles) qui formalisent l’idée d’une suspension de la bivalence pour les énoncés sur l’avenir.
====Aristote dans la philosophie analytique contemporaine====
La philosophie analytique du XX{{e}} siècle, après une longue phase de scepticisme à l’égard de la logique aristotélicienne (Russell, dans ses premiers travaux, jugeait la syllogistique aristotélicienne sans intérêt logique réel), a redécouvert la richesse de l’''Organon''. Les travaux de Łukasiewicz, Patzig, Lear, Patterson, Crivelli, Malink, Bronstein, Harari ont rendu à la logique aristotélicienne sa profondeur conceptuelle.
Plusieurs lignes de recherche méritent d’être signalées. La première concerne les rapports entre logique et métaphysique chez Aristote. Comme le montrent Patterson pour la logique modale et Harari pour la théorie de la démonstration, la logique aristotélicienne n’est pas une logique formelle abstraite, mais une logique ancrée dans une métaphysique des essences, des substances et des causes. Cette articulation, longtemps tenue pour une faiblesse, apparaît aujourd’hui comme une originalité féconde, en consonance avec les essentialismes contemporains (Kripke, Putnam, Fine).
La deuxième concerne les rapports entre dialectique et science. Pellegrin, Brunschwig, Berti, Crubellier ont montré que la dialectique aristotélicienne n’est pas une simple discipline subordonnée à la science, mais un mode d’accès à la vérité qui complète la démonstration et qui prépare la saisie des principes. Cette réhabilitation de la dialectique a des résonances avec les approches contemporaines de l’épistémologie, qui reconnaissent le rôle des présuppositions, des controverses et de la discussion dans l’élaboration des connaissances.
La troisième concerne les rapports entre langage, pensée et réalité. Le triangle sémiotique du ''De interpretatione'', la doctrine des catégories comme genres de l’être, l’analyse de la prédication, ont été réexaminés par la philosophie analytique du langage et par l’ontologie contemporaine.
====Bilan====
L’''Organon'' d’Aristote n’est pas un monument figé : c’est un ensemble vivant de questions, de distinctions et d’arguments qui continue de nourrir la pensée philosophique. Sa lecture exige une triple attention : à la ''lettre'' du texte, qui est souvent dense et elliptique ; à la ''tradition'' interprétative, qui en a sédimenté les significations ; et à la ''recherche contemporaine'', qui en renouvelle les enjeux. C’est par cette triple attention que l’''Organon'' peut être restitué dans sa fécondité, comme l’œuvre d’un penseur qui, plus de vingt-trois siècles après sa mort, continue de nous apprendre comment penser.
== La philosophie de la nature ==
=== La ''Physique'' – Les principes du mouvement et du changement ===
==== La nature comme principe interne de mouvement ====
La physique aristotélicienne n'est pas la physique au sens moderne, science mathématisée des phénomènes matériels. Elle est la science des êtres qui possèdent en eux-mêmes un principe de mouvement et de repos<ref>Aristote, ''Physique'', II, 1, 192b13-23. Pour une introduction d'ensemble à la philosophie naturelle aristotélicienne, voir Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie III ; ainsi que l'entrée « Aristotle's Natural Philosophy » de la ''Stanford Encyclopedia of Philosophy''.</ref>. Un être naturel (''phusei on'') se distingue ainsi d'un être artificiel : une plante croît et se reproduit par sa propre nature, tandis qu'un lit, fait de bois, ne produit pas naturellement d'autres lits.
Cette définition fonde l'autonomie de la nature et de son étude. Les êtres naturels ont leurs principes en eux-mêmes et ne dépendent pas de causes extérieures pour leur mouvement essentiel. Le physicien doit étudier non seulement la forme des choses, mais aussi leur matière, car la matière est le principe des mouvements naturels<ref>Aristote, ''Physique'', II, 2, 194a12-27.</ref>. Comme le souligne Larose, la défense aristotélicienne de l'autonomie de la physique constitue une contribution durable de la pensée du Stagirite : « Sa défense de l'autonomie des domaines du savoir, encore une fois contre Platon, est toujours d'actualité. Le refus de réduire la biologie aux mathématiques est bien aristotélicien »<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>.
==== Les quatre causes ====
Pour comprendre pleinement un être naturel, il faut connaître ses quatre causes. La cause matérielle est ce dont une chose est faite (le bronze est la cause matérielle de la statue). La cause formelle est l'essence ou la définition de la chose (la forme de l'Hermès est la cause formelle de la statue d'Hermès). La cause efficiente est ce qui a produit la chose (le sculpteur est la cause efficiente de la statue). La cause finale est ce en vue de quoi la chose existe (la décoration du temple est la cause finale de la statue)<ref>Aristote, ''Physique'', II, 3, 194b23-195a3.</ref>.
Ces quatre causes ne s'excluent pas mais se complètent. Plusieurs causes peuvent coïncider : la forme, le moteur et la fin peuvent être identiques. Dans la génération naturelle d'un homme, c'est la forme d'homme qui est à la fois dans le géniteur (cause efficiente), dans l'engendré (cause formelle), et visée comme fin du processus de génération<ref>Aristote, ''Physique'', II, 7, 198a24-27.</ref>.
==== Le mouvement et ses espèces ====
Le mouvement (''kinêsis'') ou changement est défini comme « l'actualité de ce qui est en puissance en tant que tel »<ref>Aristote, ''Physique'', III, 1, 201a10-11.</ref>. Cette définition signifie que le mouvement est l'acte d'un être qui n'est pas encore pleinement actualisé, mais en voie de l'être. C'est un acte imparfait, par opposition à l'acte parfait (''energeia'') qui est l'actualité achevée d'une chose.
Aristote distingue quatre espèces de changement selon les catégories : le changement substantiel (génération et corruption), le changement qualitatif (altération), le changement quantitatif (accroissement et diminution), et le changement local (déplacement)<ref>Aristote, ''Physique'', V, 1, 225a34-225b9.</ref>. Parmi ces changements, le mouvement local est premier, car il peut exister sans les autres<ref>Aristote, ''Physique'', VIII, 7, 260a26-260b7.</ref>.
==== L'éternité du mouvement et le Premier Moteur ====
Le mouvement est-il éternel ou a-t-il commencé ? Aristote argumente qu'il doit être éternel, car toute génération du mouvement supposerait un mouvement antérieur<ref>Aristote, ''Physique'', VIII, 1, 251a8-252b6.</ref>. Or tout ce qui est mû est mû par autre chose<ref>Aristote, ''Physique'', VII, 1, 241b24-242a15.</ref>. Pour éviter une régression à l'infini, il faut postuler un Premier Moteur immobile qui meut éternellement.
Ce Premier Moteur meut sans être mû, à la manière dont l'objet du désir meut le désirant. Il est donc cause finale plutôt qu'efficiente du mouvement éternel du ciel<ref>Aristote, ''Physique'', VIII, 6, 259b20-260a19.</ref>. Cette preuve « physique » du Premier Moteur prépare les développements métaphysiques du livre Λ de la ''Métaphysique''. Comme le souligne Annick Jaulin, l'interprétation de ce passage et sa relation aux livres centraux de la ''Métaphysique'' constitue l'un des problèmes les plus discutés de l'aristotélisme contemporain<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>.
=== Le ''De caelo'' – Le ciel et les éléments ===
==== La cinquième essence et l'éternité du monde ====
Le traité ''Du ciel'' étudie le mouvement circulaire du ciel et sa substance. Aristote établit qu'il existe un cinquième élément, l'éther (''aithêr''), distinct des quatre éléments sublunaires, animé d'un mouvement circulaire naturel et éternel<ref>Aristote, ''Du ciel'', I, 2, 269a2-269b17.</ref>. Cette quintessence ne connaît ni génération ni corruption, ni accroissement ni diminution.
Le ciel est, selon Aristote, éternel, sans commencement ni fin. Aristote réfute les cosmogonies qui, comme celle du ''Timée'' de Platon, faisaient naître le monde dans le temps<ref>Aristote, ''Du ciel'', I, 10-12, 279b4-284a35.</ref>. Cette thèse de l'éternité du monde entrera en conflit, au Moyen Âge, avec le dogme chrétien de la création ''ex nihilo'', donnant lieu à des tentatives de conciliation comme celles de Thomas d'Aquin.
==== La structure du cosmos ====
Aristote défend une cosmologie géocentrique. La Terre, sphérique, est immobile au centre de l'univers<ref>Aristote, ''Du ciel'', II, 14, 296b6-297b21.</ref>. Autour d'elle se trouvent les sphères concentriques des quatre éléments sublunaires (terre, eau, air, feu), puis les sphères célestes portant les astres<ref>Aristote, ''Du ciel'', II, 12, 292a14-293a11.</ref>.
Cette cosmologie restera dominante jusqu'à Copernic, Kepler et Galilée. Elle repose sur la distinction entre monde supralunaire, parfait et immuable, et monde sublunaire, siège de la génération et de la corruption. Cette distinction sera ébranlée par la découverte, au début du XVIIe siècle, des taches solaires et de la nature des comètes.
==== Les quatre éléments et leurs mouvements naturels ====
Dans le monde sublunaire, les quatre éléments possèdent des mouvements naturels rectilignes. La terre et l'eau, éléments lourds, se dirigent vers le bas, c'est-à-dire vers le centre de l'univers. L'air et le feu, éléments légers, se dirigent vers le haut, c'est-à-dire vers la périphérie du monde sublunaire<ref>Aristote, ''Du ciel'', IV, 4, 311a15-312a21.</ref>.
Comme le note Pellegrin, Aristote attache une grande importance à l'évidence sensible dans son traitement des questions physiques : il écrit lui-même, à propos de la transformation des éléments, que « le résultat final […] pour la science physique c'est l'évidence sensible qui toujours l'emporte » (''De caelo'', III, 7, 306a11)<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 94.</ref>.
Ces principes fondent la dynamique aristotélicienne, selon laquelle chaque corps tend vers son lieu propre avec une vitesse proportionnelle à son poids et inversement proportionnelle à la résistance du milieu<ref>Aristote, ''Du ciel'', I, 8, 277a27-277b8.</ref>. Cette physique sera critiquée par la révolution galiléenne, qui montrera que dans le vide tous les corps tombent à la même vitesse. Il faut cependant noter, comme l'a montré la recherche récente sur la philosophie naturelle de la Renaissance, que la transition entre la physique aristotélicienne et la mécanique moderne s'est opérée par étapes, à travers des relectures et des modifications internes au cadre péripatéticien plutôt que par un rejet abrupt et frontal<ref>Voir A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', Leiden, Brill, 2009.</ref>.
=== Le ''De generatione et corruptione'' – Génération, corruption et transformation ===
==== Les deux espèces de génération ====
La génération absolue (''genesis haplôs'') est le passage du non-être à l'être d'une substance : un homme naît. La génération relative (''genesis ti'') est l'altération d'une substance qui demeure : un homme devient musicien<ref>Aristote, ''De la génération et la corruption'', I, 3, 317a17-b18.</ref>. Aristote cherche à éviter deux écueils : l'éléatisme de Parménide, qui niait tout devenir, et l'atomisme de Démocrite, qui réduisait toute génération à une simple agrégation d'atomes éternels.
La solution réside dans les concepts de matière et de forme. Dans toute génération, quelque chose persiste (la matière) tandis que quelque chose advient (la forme). Dans la génération absolue, la matière première indéterminée reçoit une nouvelle forme substantielle. Dans la génération relative, la substance demeure identique tandis que ses accidents changent<ref>Aristote, ''De la génération et la corruption'', I, 4, 319b6-320a7.</ref>.
==== Action et passion, contact et mélange ====
Pour qu'il y ait génération, il faut qu'un agent agisse sur un patient. Mais l'action n'est pas séparée de la passion : ce sont deux aspects d'un même changement<ref>Aristote, ''De la génération et la corruption'', I, 7, 323b18-324a19.</ref>.
Le mélange (''mixis'') se distingue de la simple juxtaposition par le fait que les composants, tout en formant un nouveau corps homogène, peuvent être restitués par analyse. Aristote critique l'atomisme qui ramène le mélange à un simple entrelacement d'atomes : si les composants demeuraient inchangés, il n'y aurait pas véritable mélange<ref>Aristote, ''De la génération et la corruption'', I, 10, 327a30-328a5.</ref>. Dans le véritable mélange, les qualités des composants s'unissent pour former une nouvelle qualité intermédiaire.
=== Les ''Météorologiques'' – Les phénomènes du monde sublunaire ===
==== Le programme de la science naturelle ====
Les ''Météorologiques'' s'insèrent dans le programme de la physique aristotélicienne. Après la ''Physique'' (principes du mouvement), le ''De caelo'' (structure de l'univers), et le ''De generatione'' (transformations des éléments), Aristote étudie les phénomènes qui résultent de l'action du ciel sur le monde sublunaire<ref>Aristote, ''Météorologiques'', I, 1, 338a20-339a5.</ref>.
Le terme « météorologique » a ici un sens beaucoup plus large qu'aujourd'hui. Il désigne tous les phénomènes qui se produisent dans la région entre la surface de la terre et la sphère de la lune : phénomènes atmosphériques (pluie, vent, tonnerre), mais aussi comètes, Voie Lactée, tremblements de terre, mer et marées, fleuves et leurs crues.
==== Les deux exhalaisons ====
Le principe explicatif fondamental est celui des deux exhalaisons. Le soleil, par son mouvement et sa chaleur, produit deux sortes d'évaporations terrestres : une exhalaison humide (vapeur d'eau) et une exhalaison sèche (exhalations terrestres combustibles)<ref>Aristote, ''Météorologiques'', I, 3, 340b19-341a12.</ref>. Ces deux exhalaisons donnent naissance à la plupart des phénomènes météorologiques.
L'exhalaison humide, refroidie dans les régions supérieures, retombe en pluie. L'exhalaison sèche, enflammée au contact de la sphère du feu, produit les phénomènes ignés : étoiles filantes, comètes, Voie Lactée<ref>Aristote, ''Météorologiques'', I, 4-8, 341b6-346a34.</ref>. Ces explications, souvent fausses au regard de la science moderne, témoignent d'une démarche qui cherche à rendre compte des phénomènes par des causes naturelles, sans recourir au mythe.
=== Le ''De anima'' – L'âme, forme du corps vivant ===
==== Définition de l'âme ====
Le traité ''De l'âme'' relève à la fois de la physique – l'âme est principe de mouvement du corps vivant – et de ce qu'on appellerait aujourd'hui psychologie ou philosophie de l'esprit. Après avoir réfuté les conceptions de ses prédécesseurs, Aristote définit l'âme comme « l'entéléchie première d'un corps naturel ayant la vie en puissance »<ref>Aristote, ''De l'âme'', II, 1, 412a27-28.</ref>.
L'âme est la forme du corps vivant, son acte premier, principe de toutes ses opérations vitales. Elle n'est ni une substance séparée habitant le corps comme un pilote dans son navire (critique du dualisme platonicien), ni une simple harmonie ou arrangement du corps (critique du matérialisme), mais la forme substantielle indissociable du corps qu'elle anime<ref>Aristote, ''De l'âme'', II, 1, 413a3-10.</ref>. Cette doctrine hylémorphique de l'âme est aujourd'hui remise au premier plan par certains travaux de philosophie de l'esprit qui y voient une alternative au dualisme cartésien et au réductionnisme matérialiste<ref>Voir Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie IV ; ainsi que les travaux de Sophia Connell sur la psychologie aristotélicienne.</ref>.
==== Les trois âmes et leurs facultés ====
Il y a, selon Aristote, trois niveaux d'âme. L'âme nutritive, commune à tous les vivants (plantes, animaux, hommes), assure la nutrition, la croissance et la reproduction. L'âme sensitive, propre aux animaux, ajoute la sensation, le désir et le mouvement local. L'âme intellective, propre à l'homme, ajoute la pensée rationnelle<ref>Aristote, ''De l'âme'', II, 2-3, 413a20-414b28.</ref>.
Ces trois âmes ne sont pas trois substances séparées, mais trois niveaux de capacités, les supérieures incluant les inférieures. Un animal possède toutes les capacités de la plante plus les siennes propres ; l'homme possède celles de la plante et de l'animal plus l'intelligence.
==== La sensation et l'intellection ====
La sensation est la réception de la forme sensible sans la matière, comme la cire reçoit l'empreinte du sceau sans recevoir le métal dont il est fait<ref>Aristote, ''De l'âme'', II, 12, 424a17-21.</ref>. Chaque sens a son objet propre (la couleur pour la vue, le son pour l'ouïe). Il existe aussi un sens commun qui perçoit les sensibles communs (mouvement, repos, nombre, figure)<ref>Aristote, ''De l'âme'', III, 1-2, 425a13-427a16.</ref>.
L'intellect (''nous'') est la faculté de penser les formes intelligibles. Aristote distingue l'intellect patient, qui reçoit les formes, et l'intellect agent, qui les abstrait à partir des images sensibles<ref>Aristote, ''De l'âme'', III, 5, 430a10-25.</ref>. L'interprétation de ce passage célèbre et bref est l'une des plus controversées de l'aristotélisme : l'intellect agent est-il une partie de l'âme humaine ou une réalité séparée ? Est-il immortel ou périssable avec le corps ? Ces questions ont donné lieu, dans la tradition commentatoriale arabe et latine, à des positions divergentes (Alexandre d'Aphrodise, Avicenne, Averroès, Thomas d'Aquin).
=== Les ''Parva Naturalia'' – Les fonctions vitales ===
==== Organisation des Petits traités d'histoire naturelle ====
Les ''Parva Naturalia'' regroupent un ensemble de courts traités sur diverses fonctions vitales et leurs organes. Ils complètent le ''De anima'' en étudiant non plus l'âme en général mais ses opérations particulières<ref>Aristote, ''De la sensation'', 1, 436a1-17.</ref>.
Le ''De sensu'' traite des sensibles et des organes des sens. Le ''De memoria'' examine la mémoire et la réminiscence. Le ''De somno'' et le ''De insomniis'' étudient le sommeil et les rêves, expliqués par les mouvements qui persistent dans les organes sensoriels après la disparition des stimuli externes<ref>Aristote, ''Du sommeil'', 2, 455a12-455b2.</ref>. Le ''De divinatione'' traite de la divination dans les songes, dont Aristote nie la valeur prophétique.
==== Le cœur, principe de la vie ====
Aristote localise le principe vital et le sens commun dans le cœur plutôt que dans le cerveau<ref>Aristote, ''Des parties des animaux'', III, 4, 666a11-18.</ref>. C'est dans le cœur que réside la chaleur innée. Le cerveau, froid et humide, sert seulement à refroidir la chaleur excessive du cœur<ref>Aristote, ''Des parties des animaux'', II, 7, 652a24-652b34.</ref>.
Cette doctrine cardiocentrique est aujourd'hui jugée incorrecte du point de vue physiologique : Galien, dès l'Antiquité, reconnaîtra au cerveau un rôle dans les sensations et les mouvements volontaires. Comme le note Pellegrin, « aucune [observation] n'a amené Aristote à renverser l'une quelconque des conceptions fantaisistes qu'il a sur le fonctionnement du corps vivant »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 94.</ref>. Cette limite illustre les contraintes méthodologiques de la science aristotélicienne, tributaire des moyens techniques de son époque, sans pour autant invalider la démarche générale qui consiste à expliquer les phénomènes vitaux par des causes naturelles observables.
== La biologie et la connaissance du vivant ==
=== L'''Histoire des animaux'' – L'enquête empirique ===
==== Méthode et organisation de l'œuvre ====
L{{'}}''Histoire des animaux'' (''Peri ta zôia historiai''), en dix livres dont trois sont probablement apocryphes, constitue un travail de collection et de description des faits concernant les animaux<ref>Aristote, ''Histoire des animaux'', I, 6, 491a7-14. Pour une introduction à la biologie aristotélicienne et à son importance dans la recherche contemporaine, voir Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021.</ref>. Le terme ''historia'' signifie ici « enquête » ou « recherche », non pas histoire au sens temporel. Il s'agit d'un exposé systématique des données empiriques qui sert de fondement aux explications causales développées dans les autres traités biologiques.
Aristote y décrit l'anatomie externe et interne, le mode de reproduction, le régime alimentaire, les habitats et les comportements de plusieurs centaines d'espèces animales. Cette œuvre témoigne d'observations personnelles, complétées par des témoignages de pêcheurs, chasseurs et éleveurs<ref>D'Arcy Wentworth Thompson, introduction à sa traduction de l'''Histoire des animaux'', Oxford, 1910. Pour une mise au point récente sur le rôle de l{{'}}''Historia animalium'' dans le projet biologique aristotélicien, voir A. Gotthelf, « Data-organization, Classification, and Kinds: the Place of the History of Animals in Aristotle's Biological Enterprise », dans ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012, p. 261-292 ; ainsi que James G. Lennox, « Between Data and Demonstration: The Analytics and the Historia Animalium », dans A. Bowen (éd.), ''Science and Philosophy in Classical Greece'', New York, Garland, 1991, p. 261-295.</ref>.
La place de cet ouvrage dans le projet scientifique aristotélicien a été reconsidérée par la recherche contemporaine. La question du rapport entre les ''Seconds Analytiques'' (théorie de la science démonstrative) et la pratique effective des traités biologiques a fait l'objet de débats nourris, notamment autour des travaux de David Balme, Allan Gotthelf et James G. Lennox<ref>Voir David Balme, « Aristotle's Use of Division and Differentiae », dans A. Gotthelf et J.G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987 ; Mariska Leunissen, « History of Animals », dans Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
==== Principes de classification ====
Aristote organise les animaux selon une classification qui prend en compte plusieurs critères : mode de reproduction (vivipares, ovipares, larvipares), habitat (terrestres, aquatiques, aériens), régime alimentaire, présence ou absence de sang<ref>Aristote, ''Histoire des animaux'', I, 6, 490b7-491a6.</ref>. La division fondamentale oppose les animaux sanguins (en gros, les vertébrés) et les animaux non-sanguins (les invertébrés).
Contrairement à une idée parfois répandue, Aristote ne se contente pas d'une classification dichotomique rigide. Il reconnaît que les espèces forment un continuum, avec des formes intermédiaires qui rendent difficile le tracé de frontières nettes. Ainsi, les éponges occupent-elles une position intermédiaire entre les plantes et les animaux<ref>Aristote, ''Histoire des animaux'', I, 1, 487b6-10.</ref>. L'idée d'une ''scala naturae'' (échelle de la nature) influencera la pensée biologique jusqu'à Lamarck et Darwin, même s'il convient de ne pas projeter rétrospectivement sur Aristote des conceptions évolutionnistes qui lui sont étrangères<ref>Voir James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
=== Les ''Parties des animaux'' – La causalité finale dans le vivant ===
==== Méthode de la biologie : de la description à l'explication ====
Le traité ''Des parties des animaux'' se propose d'expliquer pourquoi les animaux possèdent telles parties avec telles configurations. Après l'''Historia'', qui répond à la question « qu'est-ce qui est ? », vient l'étude qui répond à « pourquoi est-ce ainsi ? »<ref>Aristote, ''Des parties des animaux'', I, 1, 639b7-640a9.</ref>.
Le livre I constitue un véritable traité de méthodologie scientifique. Aristote y défend la légitimité de l'étude de la nature : « il faut étudier chaque être sans dégoût, car en chacun réside quelque chose de naturel et de beau »<ref>Aristote, ''Des parties des animaux'', I, 5, 645a15-17.</ref>. Cette injonction est aujourd'hui souvent citée pour souligner l'importance accordée par Aristote à l'observation des phénomènes naturels, même dans leurs manifestations les plus humbles.
==== La priorité de la cause finale ====
Dans l'étude des vivants, la cause finale joue, selon Aristote, un rôle primordial. C'est en vue d'une fonction déterminée que chaque organe est configuré d'une certaine manière. Les dents de devant sont tranchantes pour couper, les molaires larges et plates pour broyer, parce que telle est leur fonction dans la nutrition<ref>Aristote, ''Des parties des animaux'', III, 1, 661b23-662a8.</ref>.
Aristote critique le mécanisme d'Empédocle et des atomistes, qui expliquaient les organes par des rencontres fortuites de particules matérielles. Selon lui, le hasard ne peut produire la régularité observée dans la nature, où chaque espèce reproduit invariablement la même organisation<ref>Aristote, ''Des parties des animaux'', I, 1, 639b11-640a9.</ref>. La matière joue un rôle, par ses propriétés et ses nécessités, mais elle est, dans cette perspective, au service de la forme et de la fin.
La nature de cette téléologie aristotélicienne est aujourd'hui l'un des sujets les plus discutés dans la recherche en philosophie de la biologie. Plusieurs interprétations s'opposent : la téléologie aristotélicienne est-elle « anthropocentrique » (la nature serait organisée pour le bien de l'homme), « cosmique » (le cosmos tout entier serait orienté vers une fin) ou « locale » (chaque espèce ou chaque organe a sa fin propre, sans qu'il y ait de finalité globale du vivant) ? Comme le souligne Pellegrin, « la téléologie aristotélicienne a comme horizon fondamental les espèces animales elles-mêmes »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Vivant », p. 196.</ref>. Cette lecture « locale », défendue notamment par Allan Gotthelf, James G. Lennox et Mariska Leunissen, est aujourd'hui largement partagée<ref>Voir Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', op. cit. ; James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Mariska Leunissen, ''Explanation and Teleology in Aristotle's Science of Nature'', Cambridge, Cambridge University Press, 2010.</ref>.
==== L'unité fonctionnelle de l'organisme ====
Chaque animal forme une totalité organisée dont toutes les parties coopèrent en vue de la vie de l'ensemble. Les poumons existent en vue de la respiration, qui existe en vue du refroidissement du cœur, qui existe en vue de la vie de l'animal. Réciproquement, la possession de poumons impose certaines autres caractéristiques : un animal pourvu de poumons doit avoir un sang et un cœur, doit respirer, donc doit avoir des voies aériennes<ref>Aristote, ''Des parties des animaux'', III, 6, 668b33-669a13.</ref>.
Cette conception « systémique » de l'organisme, où chaque partie trouve sa raison d'être dans sa contribution au tout, est aujourd'hui souvent rapprochée des approches fonctionnalistes en biologie contemporaine. Elle fonde aussi la possibilité d'une connaissance rationnelle du vivant : malgré la complexité des formes de vie, on peut les comprendre en dégageant les rapports fonctionnels entre les parties et le tout<ref>Voir Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit. ; Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., partie III.</ref>.
=== La ''Génération des animaux'' – Reproduction et hérédité ===
==== Les modes de reproduction ====
Le traité ''De la génération des animaux'' étudie la reproduction sexuée et asexuée, la formation de l'embryon, l'hérédité. Aristote distingue plusieurs modes de génération : par accouplement (la plupart des animaux), par génération spontanée (certains insectes, les anguilles qu'on croyait alors naître de la vase), par bourgeonnement (certaines plantes)<ref>Aristote, ''De la génération des animaux'', I, 1, 715a1-18.</ref>.
Dans la génération sexuée, le mâle apporte, selon Aristote, la forme et le principe du mouvement (la semence), tandis que la femelle apporte la matière (les menstrues chez les vivipares, l'œuf chez les ovipares)<ref>Aristote, ''De la génération des animaux'', I, 20, 729a9-b21.</ref>. Cette théorie reflète des préjugés androcentrés de l'époque : elle dénie à la femelle tout rôle actif dans la génération, la réduisant à fournir le substrat matériel informé par la semence mâle. La recherche contemporaine, notamment féministe, a discuté de manière approfondie ce volet de la pensée aristotélicienne ; elle souligne à la fois sa cohérence interne avec la métaphysique du composé hylémorphique et le caractère contestable de ses présupposés empiriques et sociaux<ref>Voir Sophia M. Connell, ''Aristotle on Female Animals: A Study of the Generation of Animals'', Cambridge, Cambridge University Press, 2016 ; ainsi que les contributions à Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
==== L'embryogenèse et la formation des parties ====
Aristote décrit avec précision le développement de l'embryon de poulet, qu'il a observé en ouvrant des œufs à différents stades d'incubation. Il voit d'abord se former le cœur, qui bat dès le troisième jour, puis progressivement les autres organes<ref>Aristote, ''Histoire des animaux'', VI, 3, 561a4-561b13.</ref>. Cette description fonde une conception épigénétique de l'embryologie : l'embryon se construit progressivement, par différenciation graduelle, et non par simple croissance d'un organisme préformé miniature.
La cause de cette différenciation progressive est, selon Aristote, la chaleur vitale contenue dans la semence, qui « cuit » et façonne la matière menstruelle comme la présure fait cailler le lait<ref>Aristote, ''De la génération des animaux'', II, 4, 739b20-740a4.</ref>. Ce processus n'est pas mécanique mais finalisé : c'est en vue de telle forme déterminée (l'homme adulte, le poulet adulte) que les parties se forment dans tel ordre.
==== L'hérédité et la ressemblance ====
Pourquoi les enfants ressemblent-ils à leurs parents ? Aristote explique ces phénomènes par le degré de « cuisson » et de maîtrise qu'exerce la semence mâle sur la matière femelle. Si la cuisson est parfaite, l'enfant ressemble au père ; si elle l'est moins, à la mère ; encore moins, aux grands-parents<ref>Aristote, ''De la génération des animaux'', IV, 3, 767b15-768a14.</ref>.
Ces explications, rudimentaires au regard de la génétique moderne, témoignent d'un effort pour rendre compte rationnellement de phénomènes que d'autres cultures expliquaient par l'intervention divine. Aristote pose les questions fondamentales de la biologie (qu'est-ce que la vie ? comment les formes se transmettent-elles ? pourquoi existe-t-il une telle diversité d'espèces ?) et invente des méthodes pour y répondre.
=== Le ''De motu animalium'' et le ''De incessu animalium'' – Le mouvement animal ===
==== Le principe du mouvement volontaire ====
Le ''De motu animalium'' examine comment les animaux se meuvent localement par eux-mêmes. Aristote établit qu'un animal ne peut se mouvoir que s'il s'appuie sur quelque chose d'immobile : de même qu'on ne peut pousser un bateau depuis l'intérieur du bateau, l'animal doit prendre appui sur le sol, l'eau ou l'air<ref>Aristote, ''Du mouvement des animaux'', 2, 698b7-699a11.</ref>.
Le principe moteur interne est le désir, excité par la sensation ou l'imagination d'un objet désirable. Le désir entraîne un réchauffement dans la région du cœur, qui se communique aux membres et produit leur contraction ou extension<ref>Aristote, ''Du mouvement des animaux'', 10, 703a4-b2.</ref>. Le mouvement animal, bien que produit de l'intérieur, a toujours une cause finale externe : l'objet désiré qui meut sans être mû.
==== Les modes de locomotion ====
Le ''De incessu animalium'' décrit et explique les différents modes de locomotion : marche, course, vol, nage. Aristote établit des lois générales : les animaux sanguins ne peuvent avoir plus de quatre points d'appui, car la nature ne fait rien en vain, et quatre suffisent à assurer la stabilité<ref>Aristote, ''De la marche des animaux'', 8, 708a9-708b9.</ref>. Les oiseaux ont des ailes parce qu'ils ont le corps léger et la poitrine large et musculeuse<ref>Aristote, ''De la marche des animaux'', 10, 710a10-710b7.</ref>.
Ces études relèvent de ce que nous appellerions aujourd'hui biomécanique. Elles montrent qu'Aristote ne se contente pas de contempler les formes vivantes, mais cherche à en expliquer le fonctionnement par des causes physiques, sans abandonner le cadre téléologique général qui voit dans la nature l'action d'une finalité immanente.
== La philosophie première : la métaphysique ==
=== Objet et divisions de la métaphysique ===
==== La science de l'être en tant qu'être ====
La métaphysique, qu'Aristote nomme « philosophie première » ou « sagesse », est définie comme la science de l'être en tant qu'être (''on hêi on'') et de ce qui lui appartient essentiellement<ref>Aristote, ''Métaphysique'', Γ, 1, 1003a21-22. Sur l'unité (et la possible disparité) du projet métaphysique aristotélicien, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction et chap. « La science recherchée » ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit.</ref>. Cette formulation distingue la métaphysique des sciences particulières qui étudient un aspect de l'être : la géométrie l'étudie en tant que continu, la biologie en tant que vivant. Seule la métaphysique considérerait l'être dans sa totalité.
Comme le souligne Annick Jaulin, le terme « métaphysique » lui-même n'apparaît jamais dans les traités aristotéliciens : il s'agit d'un titre éditorial donné par Andronicos<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Pellegrin recense quant à lui plusieurs définitions concurrentes de cette science chez Aristote : recherche des premiers principes et des premières causes, science de l'être en tant qu'être, science de la substance, science théologique<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Métaphysique », p. 136-137.</ref>.
Cette science est dite « première » en deux sens : elle porte sur ce qui est premier dans l'ordre de l'être (les principes et causes premiers), et elle examine les principes communs à toutes les sciences, comme le principe de non-contradiction<ref>Aristote, ''Métaphysique'', Γ, 3, 1005a19-b8.</ref>. Elle est aussi qualifiée de « science théologique » car elle porte sur ce qu'il y a de plus divin, le Premier Moteur immobile<ref>Aristote, ''Métaphysique'', Α, 2, 983a5-10.</ref>.
==== La question de l'unité de la métaphysique ====
Comment la métaphysique peut-elle être à la fois ontologie générale, étude de l'être en tant qu'être, et théologie, étude d'un être particulier (Dieu) ? Cette tension a donné lieu à plusieurs interprétations dans l'histoire de la philosophie<ref>Pour un état de la question, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit. ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 1-2.</ref>.
Une lecture, défendue notamment par Werner Jaeger, voit dans le corpus de la ''Métaphysique'' deux projets juxtaposés correspondant à deux périodes différentes de la pensée d'Aristote : une métaphysique ontologique générale, plus tardive, et une métaphysique théologique d'inspiration platonicienne, plus ancienne<ref>Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', op. cit. Cette lecture est cependant aujourd'hui largement contestée ; voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit.</ref>.
Une autre lecture, défendue par Thomas d'Aquin et reprise par toute une tradition, soutient que l'unité est assurée par le fait que Dieu est principe de tout être<ref>Thomas d'Aquin, ''In Metaphysicam Aristotelis Commentaria'', Prooemium.</ref>. C'est ce que la tradition appellera l'« onto-théologie ».
Une troisième lecture, plus récente, défendue notamment par Pierre Aubenque, considère que la synthèse entre ontologie et théologie est en fait impossible et que la ''Métaphysique'' aristotélicienne reste inachevée comme problème<ref>Pierre Aubenque, ''Le problème de l'être chez Aristote'', op. cit. Voir aussi Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 137.</ref>. Une quatrième lecture, présente notamment dans le travail d'Annick Jaulin, refuse de lire l'expression « substance séparée » au sens transcendant et soutient qu'Aristote, plutôt que d'opérer une rupture avec la physique, « réinscrit la substance immobile dans la tradition des penseurs de la nature »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>. Le débat reste ouvert.
==== Les apories de la métaphysique ====
Le livre Β de la ''Métaphysique'' expose méthodiquement les apories, c'est-à-dire les difficultés que rencontre toute tentative de construire une science de l'être et des principes premiers : Y a-t-il une science unique de toutes les causes ? La science de l'être porte-t-elle aussi sur les principes de la démonstration ? Y a-t-il seulement des substances sensibles, ou existe-t-il aussi des substances séparées ? Les principes sont-ils universels ou particuliers ? En acte ou en puissance ?<ref>Aristote, ''Métaphysique'', Β, 1, 995b4-996a17.</ref>
Cette méthode aporétique est caractéristique de la démarche aristotélicienne : « Il faut, pour bien rechercher, avoir auparavant développé les apories »<ref>Aristote, ''Métaphysique'', Β, 1, 995a24-27.</ref>.
=== La substance (livres Z-H) ===
==== Qu'est-ce que la substance ? ====
Si l'être se dit en plusieurs sens, et si la substance est le sens premier de l'être, la question centrale de la métaphysique devient : qu'est-ce que la substance (''ousia'') ?<ref>Aristote, ''Métaphysique'', Ζ, 1, 1028a10-1028b2.</ref> Quatre candidats se présentent : l'essence (''to ti ên einai''), l'universel (''to katholou''), le genre (''to genos''), et le substrat (''to hupokeimenon''). Ce dernier peut être entendu en trois sens : la matière, la forme, ou le composé des deux.
Aristote élimine d'abord l'universel et le genre : ils ne peuvent être substances parce qu'ils se prédiquent de plusieurs choses, alors que la substance de chaque chose lui est propre<ref>Aristote, ''Métaphysique'', Ζ, 13, 1038b8-16.</ref>. Cette exclusion vise notamment la théorie platonicienne des Idées.
L'interprétation de cet examen, et la question de savoir lequel des trois candidats restants (matière, forme, composé) Aristote retient finalement comme substance première, fait l'objet de débats considérables dans la recherche contemporaine. Comme le résume Christof Rapp, « les controverses interprétatives concernant l'interprétation des livres pertinents s'étendent de la question de savoir jusqu'où s'étend le traitement de l{{'}}''ousia'' (seulement le livre Z, ZH ou même ZHΘ), à la question de la structuration interne du traité de l{{'}}''ousia'', en passant par les questions sur l'objectif précis et la finalité philosophique de ces livres, jusqu'à la question de la nature de l'''eidos'' (la forme) – qui est au cours du traité plusieurs fois désignée comme ''ousia'' – et enfin la question du rapport entre matière et forme et l'unité de l{{'}}''ousia'' qui y est liée »<ref>Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', op. cit., chap. IV.18 (traduction libre).</ref>.
==== La forme, candidat à la substantialité ====
Le substrat semble avoir des titres à être appelé substance, puisqu'il est ce dont tout le reste se dit. Mais si l'on identifiait la substance à la matière pure, support ultime de toutes les déterminations, on aboutirait au paradoxe qu'une substance pourrait exister sans aucune détermination<ref>Aristote, ''Métaphysique'', Ζ, 3, 1029a10-26.</ref>.
C'est donc la forme (''morphê'', ''eidos'') qui apparaît, dans plusieurs passages des livres centraux, comme substance au sens propre. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence. Elle est aussi acte (''energeia'') par opposition à la matière qui est puissance (''dynamis''). Un morceau d'airain est en puissance une statue ; quand le sculpteur lui a donné la forme de l'Hermès, il est en acte une statue. La forme actualise la matière et lui confère l'être déterminé<ref>Aristote, ''Métaphysique'', Η, 2, 1042b9-1043a28.</ref>.
==== Le composé de matière et de forme ====
La substance concrète, l'individu réel, n'est ni la matière seule ni la forme seule, mais leur composé (''synolon''). Callias n'est ni simplement de la chair et des os, ni simplement la forme de l'homme, mais cet homme-ci composé de cette chair-ci et de ces os-ci structurés selon la forme humaine<ref>Aristote, ''Métaphysique'', Ζ, 10, 1035b14-27.</ref>.
La forme demeure cependant première en un sens, car c'est elle qui confère l'unité au composé. Sans la forme, la matière ne serait qu'un amas d'éléments disparates. C'est l'âme, forme du corps vivant, qui fait que ce corps est un organisme uni et non un simple agrégat. Dans l'ordre de la connaissance aussi, c'est par la forme qu'on définit et connaît la substance : on définit l'homme par sa forme (animal rationnel), non par sa matière (chair et os)<ref>Aristote, ''Métaphysique'', Ζ, 11, 1037a21-33. Pour une discussion approfondie, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « La substance ».</ref>.
=== Puissance et acte (livre Θ) ===
==== La distinction de la puissance et de l'acte ====
La distinction entre puissance (''dynamis'') et acte (''energeia'', ''entelecheia'') est l'une des contributions majeures d'Aristote à la philosophie. Elle permet de répondre aux apories de Parménide et de Platon concernant le devenir. Comment une chose peut-elle devenir ce qu'elle n'est pas ? En étant en puissance ce qu'elle devient en acte. Le bronze n'est pas une statue, mais il est en puissance une statue, de sorte qu'il peut le devenir sans passer du non-être à l'être<ref>Aristote, ''Métaphysique'', Θ, 6, 1048a30-1048b17.</ref>.
Une chose en puissance n'a pas encore telle propriété, mais elle a la capacité de l'acquérir. La capacité n'est ni l'absence pure (le bronze ne peut pas devenir homme), ni la présence actuelle (ce qui est actuellement chaud n'a plus la capacité de le devenir). Elle est un mode d'être intermédiaire<ref>Aristote, ''Métaphysique'', Θ, 7, 1049a1-18.</ref>.
==== La priorité de l'acte sur la puissance ====
Aristote établit que l'acte est antérieur à la puissance en plusieurs sens : dans l'ordre de la définition (on définit la puissance par l'acte correspondant), dans l'ordre de la connaissance, dans l'ordre de l'essence et du temps<ref>Aristote, ''Métaphysique'', Θ, 8, 1049b10-1050a3.</ref>.
Plus profondément, ce qui est éternellement en acte est antérieur à ce qui peut être tantôt en acte, tantôt en puissance. Or les substances divines sont éternellement en acte, tandis que les substances sensibles passent de la puissance à l'acte et de l'acte à la puissance. Les substances immobiles éternelles sont donc absolument premières<ref>Aristote, ''Métaphysique'', Θ, 8, 1050b6-28.</ref>.
Comme le souligne Annick Jaulin, cette primauté de l'acte sur la puissance n'est pas un simple point doctrinal mais structure l'ensemble de la philosophie première : « la primauté de l'acte sur la puissance permet de poser l'antériorité de la forme sur la matière », et elle « ouvre également la possibilité d'une interprétation positive du devenir »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « La science recherchée ».</ref>.
=== L'Un et le Multiple (livres I-K) ===
==== L'un se dit en plusieurs sens ====
Parallèlement à l'être, l'un aussi se dit en plusieurs sens. Il y a l'un par accident (le musicien et l'homme sont un quand le musicien est homme). Il y a l'un par soi, qui se divise en un par continuité (une route), un par indivisibilité en espèce (tout homme est un par l'espèce), un par le concept et la définition<ref>Aristote, ''Métaphysique'', Ι, 1, 1052a15-1052b14.</ref>.
Les pythagoriciens et Platon avaient fait de l'Un un principe suprême, antérieur même à l'être. Aristote critique cette position : l'un n'est pas une substance séparée, mais une propriété convertible avec l'être<ref>Aristote, ''Métaphysique'', Ι, 2, 1053b16-1054a13.</ref>. Dire qu'une chose est et dire qu'elle est une, c'est la même chose.
==== La pluralité et le nombre ====
La pluralité s'oppose à l'un comme le divisible à l'indivisible. Le nombre est une pluralité mesurée par l'un<ref>Aristote, ''Métaphysique'', Ι, 1, 1053a18-24.</ref>. Cette analyse fonde la possibilité des mathématiques et des sciences quantitatives.
=== Le Premier Moteur immobile (livre Λ) ===
==== La démonstration de l'existence du Premier Moteur ====
Le livre Λ de la ''Métaphysique'' constitue le sommet de la philosophie première aristotélicienne. Après avoir établi que les substances sont premières parmi les êtres, Aristote examine quelles substances existent. Il y a évidemment les substances sensibles, soumises au changement. Mais existe-t-il aussi une substance éternelle immobile ?<ref>Aristote, ''Métaphysique'', Λ, 6, 1071b3-5.</ref>
La démonstration procède à partir du mouvement. Il existe du mouvement, cela est manifeste. Or tout ce qui est mû est mû par autre chose. Ou bien il y a un premier moteur immobile, ou bien la série des moteurs remonte à l'infini. Mais une série infinie de causes ne peut rien expliquer, car en l'absence d'un premier il n'y aurait ni intermédiaire ni dernier<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a19-1072b4.</ref>. Il doit donc exister un premier moteur qui meut sans être mû.
==== La nature du Premier Moteur ====
Ce Premier Moteur est substance, acte pur, éternel, sans parties, sans grandeur. Il meut comme objet de désir et d'intellection : l'intellect désire le bien et se meut vers lui. Le Premier Moteur, étant le bien suprême et l'intelligible suprême, attire vers lui le premier ciel qui l'imite par son mouvement circulaire éternel<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a23-1072b4.</ref>.
Quelle est la vie de ce Premier Moteur ? Il est Pensée, mais que pense-t-il ? Il doit penser ce qu'il y a de plus excellent, donc lui-même. Il est donc Pensée de la Pensée (''noêsis noêseôs noêsis''), intellection qui se pense elle-même dans une contemplation éternellement bienheureuse<ref>Aristote, ''Métaphysique'', Λ, 9, 1074b33-35.</ref>.
==== Les moteurs des sphères ====
Le mouvement des astres requiert, outre le Premier Moteur qui meut la sphère des fixes, une pluralité de moteurs immobiles pour les sphères des planètes. Aristote, se fondant sur l'astronomie d'Eudoxe et de Callippe, compte cinquante-cinq sphères, donc cinquante-cinq moteurs<ref>Aristote, ''Métaphysique'', Λ, 8, 1073a14-1074b14.</ref>. Ces moteurs ne sont pas subordonnés les uns aux autres dans une hiérarchie, mais chacun meut directement sa sphère.
Cette pluralité d'intelligences motrices a posé un problème théologique au Moyen Âge : la tradition péripatéticienne et la scolastique médiévale ont tenté de la concilier avec l'unité divine en faisant des moteurs des substances secondes subordonnées au Premier Moteur. La recherche contemporaine, notamment Annick Jaulin, propose une lecture moins théologique : il s'agirait pour Aristote de fournir une explication causale du mouvement astronomique, sans projet théologique transcendant<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>.
=== Critique de la théorie platonicienne des Idées (livres M-N) ===
==== Les arguments contre les Idées séparées ====
Les livres M et N de la ''Métaphysique'' reprennent et développent la critique de la théorie platonicienne des Idées, déjà amorcée dans le livre A. Aristote reconnaît à Platon le mérite d'avoir affirmé l'existence de réalités intelligibles éternelles, mais lui reproche d'avoir séparé ces formes des choses sensibles et d'en avoir fait des substances subsistant par elles-mêmes<ref>Aristote, ''Métaphysique'', Μ, 4-5, 1078b7-1080a8.</ref>.
Cette séparation est, selon Aristote, inutile et impossible. Inutile, car les Idées ne servent ni à la connaissance des sensibles, ni à leur existence, ni à leur devenir<ref>Aristote, ''Métaphysique'', Α, 9, 991a8-991b9.</ref>. Impossible, car elle conduit à des apories comme l'argument du Troisième Homme<ref>Aristote, ''Métaphysique'', Α, 9, 990b17-991a8.</ref>.
==== Le statut des êtres mathématiques ====
Platon situait les êtres mathématiques (nombres, figures) dans un plan intermédiaire entre les Idées et les sensibles. Aristote refuse cette ontologie tripartite. Les objets mathématiques n'existent pas séparément, mais par abstraction<ref>Aristote, ''Métaphysique'', Μ, 3, 1078a21-31.</ref>. Le mathématicien considère les sensibles non en tant que sensibles mais en tant que continus ou quantifiés, faisant abstraction de leurs autres propriétés.
Cette solution préserve l'objectivité des mathématiques sans multiplier les êtres. Les vérités mathématiques sont nécessaires et universelles parce qu'elles portent sur des propriétés que les choses sensibles possèdent nécessairement, même si ces propriétés ne sont jamais réalisées dans les sensibles avec la perfection qu'étudie le mathématicien<ref>Aristote, ''Métaphysique'', Μ, 2, 1077a9-1077b17.</ref>.
== La philosophie pratique : éthique, politique, rhétorique, poétique ==
=== L'''Éthique à Nicomaque'' – La vie bonne ===
==== Le souverain bien et le bonheur ====
L'''Éthique à Nicomaque'' s'ouvre sur l'affirmation que toute action et toute recherche vise un bien. Parmi les biens, il y en a un qui est visé pour lui-même et en vue duquel tous les autres sont poursuivis : c'est le souverain bien, que tous appellent bonheur (''eudaimonia'')<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1095a14-26. Pour une introduction d'ensemble à l'éthique aristotélicienne, voir Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', Londres, Routledge, 2001 ; Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', Cambridge, Cambridge University Press, 2014.</ref>.
Comme le note Pellegrin, Aristote, dans le premier livre de l'''Éthique à Nicomaque'', « donne l'un des exemples les plus caractéristiques et les plus aboutis du traitement d'une notion léguée par la tradition »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Bonheur (eudaimonia) », p. 37.</ref> : il commence par exposer les opinions reçues sur le bonheur (plaisir, honneurs, richesse, vertu, contemplation), puis examine ce qu'il peut conserver de chacune.
Pour déterminer le bonheur véritable, Aristote recourt à la notion de fonction (''ergon'') : le bien pour chaque être réside dans l'accomplissement de sa fonction propre. La fonction propre de l'homme est l'activité de l'âme rationnelle selon l'excellence. Le bonheur est donc « une activité de l'âme selon la vertu parfaite, dans une vie complète »<ref>Aristote, ''Éthique à Nicomaque'', I, 7, 1098a16-18.</ref>.
L'interprétation de cette définition fait l'objet d'un débat important dans la recherche contemporaine, qui oppose une lecture « inclusiviste » à une lecture « dominante »<ref>Sur ce débat, voir Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', op. cit. ; Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit. La question fait l'objet d'une discussion approfondie dans la littérature anglo-saxonne, notamment depuis les travaux de J.L. Ackrill et T.H. Irwin.</ref>. Selon la lecture inclusiviste, le bonheur consiste en l'exercice de toutes les vertus, morales et intellectuelles, dans une vie complète. Selon la lecture dominante, le bonheur s'identifie à l'activité de la vertu la plus haute, c'est-à-dire la contemplation, comme le suggère le livre X. Cette tension entre deux perspectives au sein même de l'''Éthique à Nicomaque'' (entre les premiers livres, qui semblent privilégier une vie pratique vertueuse, et le livre X, qui exalte la vie contemplative) reste l'objet d'interprétations divergentes.
==== Les vertus éthiques et la doctrine du juste milieu ====
Aristote distingue les vertus intellectuelles (sagesse théorique, prudence) des vertus éthiques ou morales (courage, tempérance, justice). Les vertus morales sont des dispositions acquises par l'habitude à choisir le juste milieu entre deux extrêmes vicieux<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1106b36-1107a2.</ref>.
Ainsi, le courage est le juste milieu entre la lâcheté (défaut de crainte) et la témérité (excès d'audace). La tempérance est le milieu entre l'insensibilité et l'intempérance. La libéralité est le milieu entre l'avarice et la prodigalité<ref>Aristote, ''Éthique à Nicomaque'', II, 7, 1107a33-1108b10.</ref>. Ce milieu n'est pas arithmétique mais relatif à nous : il dépend des circonstances et de l'agent. Toute l'œuvre de la vertu consiste à trouver ce milieu, guidée par la droite raison (''orthos logos'') qu'incarne la prudence<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1107a1-2.</ref>.
Cette doctrine du juste milieu a connu une fortune durable dans la philosophie morale. Elle est aujourd'hui au centre du renouveau de l'éthique des vertus en philosophie morale contemporaine, à la suite des travaux d'Anscombe, MacIntyre et Nussbaum<ref>Voir les contributions à Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit.</ref>.
==== L'amitié ====
Les livres VIII et IX de l'''Éthique à Nicomaque'' traitent de l'amitié (''philia''). Aristote distingue trois espèces d'amitié : l'amitié utile, fondée sur l'intérêt réciproque ; l'amitié agréable, fondée sur le plaisir ; et l'amitié parfaite, celle des hommes vertueux qui s'aiment pour eux-mêmes<ref>Aristote, ''Éthique à Nicomaque'', VIII, 3, 1156a6-1156b7.</ref>.
Seule la dernière est véritablement amitié au sens plein, car elle est durable et réciproque. Les deux premières sont instables, car elles cessent quand cesse l'utilité ou le plaisir. L'amitié parfaite requiert du temps et de l'intimité<ref>Aristote, ''Éthique à Nicomaque'', VIII, 6, 1158a10-15.</ref>.
L'amitié n'est pas seulement agréable, elle est nécessaire à la vie bonne. L'homme est un animal politique qui ne peut s'accomplir dans l'isolement. L'ami est, selon Aristote, un autre soi-même : en conversant avec lui, en partageant ses joies et ses peines, nous nous connaissons et nous accomplissons nous-mêmes<ref>Aristote, ''Éthique à Nicomaque'', IX, 9, 1169b16-1170a4.</ref>.
==== La vie contemplative ====
Le livre X conclut l'éthique en affirmant que le bonheur suprême réside dans la vie contemplative. L'activité théorétique de l'intellect serait la plus haute et la plus autosuffisante. Elle nous apparente aux dieux, qui passent l'éternité dans la contemplation<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177a12-18.</ref>. Aristote reconnaît que cette vie purement intellectuelle dépasse les forces humaines prises isolément, mais affirme que dans la mesure où il y a en nous quelque chose de divin, nous devons tendre vers cette vie<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177b30-34.</ref>.
Comme le souligne Pellegrin, ce passage du livre X introduit la notion de « bonheur achevé » (''teleia eudaimonia'') et déclare que « le bonheur pratique, celui du citoyen vertueux, n'est bonheur "qu'à titre secondaire" »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 39, citant ''Éthique à Nicomaque'', X, 8, 1178a9.</ref>. La cohérence entre cette thèse et l'analyse de l'''eudaimonia'' développée dans les premiers livres est l'une des questions les plus discutées de l'aristotélisme moral contemporain.
=== Les ''Politiques'' – La cité et les constitutions ===
==== L'homme, animal politique ====
Les ''Politiques'' commencent par affirmer que la cité (''polis'') existe par nature et que l'homme est par nature un animal politique<ref>Aristote, ''Politiques'', I, 2, 1252b27-1253a3. Pour une vue d'ensemble de la pensée politique aristotélicienne, voir Marguerite Deslauriers et Pierre Destrée (éd.), ''The Cambridge Companion to Aristotle's Politics'', Cambridge, Cambridge University Press, 2013.</ref>. Cette affirmation s'oppose à la fois aux sophistes, qui faisaient de la société une convention artificielle, et à la tradition cynique, qui prônait l'autarcie individuelle.
L'homme ne peut, selon Aristote, ni vivre ni bien vivre en dehors de la cité, car il a besoin des autres pour satisfaire ses besoins matériels et pour actualiser sa nature rationnelle et morale. La cité n'est pas une simple alliance défensive ou commerciale, mais une communauté de vie bonne, ayant pour fin le bonheur de ses membres<ref>Aristote, ''Politiques'', III, 9, 1280b39-1281a4.</ref>.
Il faut signaler ici que les ''Politiques'' contiennent également des thèses aujourd'hui rejetées : la justification de l'esclavage par nature (livre I) et la subordination des femmes ont fait l'objet de critiques nombreuses, déjà au {{XIXe siècle}} et plus encore dans la philosophie féministe contemporaine. Comme le note Larose, « certains des textes [d'Aristote] choqueront à juste titre le lecteur, en particulier ceux qui traitent du statut de la femme et de l'esclavage. Tout philosophe qu'il soit, Aristote est bien un homme de son temps »<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>.
==== Les formes de constitution ====
Aristote distingue six formes de constitution selon deux critères : le nombre de gouvernants (un seul, quelques-uns, la multitude) et la fin poursuivie (l'intérêt commun ou l'intérêt privé des gouvernants). Les formes droites sont la royauté (gouvernement d'un seul pour le bien commun), l'aristocratie (gouvernement de quelques-uns pour le bien commun), et la république ou ''politeia'' (gouvernement de la multitude pour le bien commun). Les formes déviées sont la tyrannie, l'oligarchie et la démocratie au sens péjoratif de démagogie<ref>Aristote, ''Politiques'', III, 7, 1279a22-1279b10.</ref>.
Comme le souligne Pellegrin, l'originalité d'Aristote ne réside pas dans la quête d'une constitution idéale unique, mais dans l'idée qu'« une constitution est dite droite si elle gouverne la cité en vue de "l'avantage commun" »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Politique », p. 57.</ref>. Aucune constitution n'est absolument la meilleure en tout lieu et en tout temps : la meilleure constitution pour une cité donnée dépend des circonstances – étendue du territoire, richesses, mœurs des habitants. Aristote fait preuve ici d'un réalisme politique qui contraste avec l'utopisme de la ''République'' de Platon.
==== La constitution mixte et la classe moyenne ====
La constitution la plus stable, selon le livre IV, est celle qui mêle des éléments oligarchiques et démocratiques, donnant le pouvoir à la classe moyenne<ref>Aristote, ''Politiques'', IV, 11, 1295a25-1295b1.</ref>. Les classes moyennes ne sont ni assez pauvres pour envier les riches, ni assez riches pour mépriser les pauvres. Elles recherchent la stabilité et l'égalité plutôt que les révolutions<ref>Aristote rappelle aussi que « les bons législateurs sont sortis de la classe moyenne », citant l'exemple de Solon, Lycurgue et Charondas. Voir Daniel Larose, ''Aristote de A à Z'', op. cit., article « Constitution mixte ».</ref>.
Cette théorie de la classe moyenne et de la constitution mixte a influencé la pensée politique occidentale, de Polybe à Montesquieu. La méthode aristotélicienne, comme le souligne Pellegrin, ne se contente pas d'observer la diversité des constitutions, mais « rend la diversité intelligible en en construisant un modèle théorique » à partir d'un nombre fini de paramètres<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 60.</ref>.
==== L'éducation ====
Les derniers livres des ''Politiques'' sont consacrés à l'éducation. Celle-ci ne peut être laissée aux familles privées, car la cité a pour fin de rendre les citoyens vertueux. Il doit donc y avoir une éducation publique commune, qui forme le caractère et l'intelligence des jeunes en vue de la vie civique et de la vie bonne<ref>Aristote, ''Politiques'', VIII, 1, 1337a11-21.</ref>.
Cette éducation comprend la gymnastique pour le corps, la musique pour l'âme, les lettres pour l'usage pratique, et le dessin pour apprécier la beauté des œuvres. Mais son but ultime n'est pas l'utilité mais le loisir bien employé (''scholê''), c'est-à-dire l'activité libre de l'esprit<ref>Aristote, ''Politiques'', VIII, 3, 1337b28-1338a13.</ref>.
=== La ''Rhétorique'' – L'art de persuader ===
==== La rhétorique comme art ====
La ''Rhétorique'' étudie les moyens de persuasion dans tous les genres de discours. Elle est l'homologue (''antistrophos'') de la dialectique : de même que la dialectique enseigne à raisonner sur toute question à partir de prémisses probables, la rhétorique enseigne à persuader tout auditoire sur tout sujet<ref>Aristote, ''Rhétorique'', I, 1, 1354a1-11.</ref>.
Aristote prend ses distances avec la critique platonicienne de la rhétorique formulée dans le ''Gorgias''. Bien utilisée, la rhétorique est un art (''technê'') légitime. Elle sert à défendre la vérité et la justice, car « il serait absurde que l'incapacité de se servir de ses forces corporelles soit honteuse, mais non l'incapacité de se servir de la parole »<ref>Aristote, ''Rhétorique'', I, 1, 1355a20-24.</ref>.
==== Les trois genres rhétoriques ====
Aristote distingue trois genres de rhétorique. Le genre délibératif conseille ou dissuade concernant l'avenir (devons-nous faire la guerre ?). Le genre judiciaire accuse ou défend concernant le passé (X a-t-il commis ce crime ?). Le genre épidictique loue ou blâme concernant le présent (célébrons la vertu du héros)<ref>Aristote, ''Rhétorique'', I, 3, 1358b2-29.</ref>.
Chaque genre a ses lieux propres. Le délibératif porte sur l'utile et le nuisible. Le judiciaire porte sur le juste et l'injuste. L'épidictique porte sur le beau et le laid moral<ref>Aristote, ''Rhétorique'', I, 3, 1358b29-1359a5.</ref>.
==== Les preuves rhétoriques : ethos, pathos, logos ====
Aristote distingue trois moyens de persuasion : l'''ethos'' (le caractère de l'orateur), le ''pathos'' (les émotions de l'auditoire), et le ''logos'' (le raisonnement lui-même)<ref>Aristote, ''Rhétorique'', I, 2, 1356a1-13.</ref>.
L'''ethos'' persuade en inspirant confiance : l'orateur doit paraître prudent, vertueux et bienveillant. Le ''pathos'' persuade en suscitant des émotions favorables à la thèse défendue. Le livre II étudie systématiquement les émotions (colère, pitié, crainte, envie), leurs causes et leurs manifestations. Le ''logos'' persuade par les raisonnements, notamment l'enthymème (syllogisme rhétorique à partir de prémisses probables) et l'exemple (induction rhétorique)<ref>Aristote, ''Rhétorique'', I, 2, 1356a35-1356b5.</ref>.
Cette analyse fonde la rhétorique comme discipline rationnelle et systématique. Elle constituera la base de l'enseignement rhétorique jusqu'à l'époque moderne et nourrit aujourd'hui des recherches actives en philosophie de l'argumentation et théorie de la communication.
=== La ''Poétique'' – La création artistique ===
==== La ''mimêsis'' et la ''catharsis'' ====
La ''Poétique'' étudie l'art poétique, principalement la tragédie et l'épopée. La poésie, comme tous les arts, est imitation (''mimêsis''). Mais elle n'imite pas les choses telles qu'elles sont (c'est le rôle de l'histoire), mais telles qu'elles pourraient ou devraient être selon la vraisemblance ou la nécessité<ref>Aristote, ''Poétique'', 9, 1451a36-1451b5.</ref>. C'est pourquoi la poésie est, selon Aristote, plus philosophique que l'histoire : elle dit l'universel, alors que l'histoire dit le particulier.
La tragédie représente une action sérieuse et complète, en suscitant pitié et crainte, pour opérer la purification (''catharsis'') de ces émotions<ref>Aristote, ''Poétique'', 6, 1449b24-28.</ref>. La doctrine de la ''catharsis'' est l'une des plus discutées de toute la philosophie ancienne. L'interprétation médicale (la tragédie « purge » les émotions excessives) a été défendue notamment par Jacob Bernays au {{XIXe siècle}} ; d'autres interprétations y voient plutôt une « clarification » morale ou cognitive des émotions<ref>Sur ces interprétations divergentes, voir Stephen Halliwell, ''Aristotle's Poetics'', Londres, Duckworth, 1986 ; Christof Rapp, « Katharsis der Emotionen », dans B. Seidensticker et M. Vöhler (éd.), ''Katharsiskonzeptionen vor Aristoteles'', Berlin, De Gruyter, 2007 ; Christof Rapp, « Aristoteles über das Wesen und die Wirkung der Tragödie », dans O. Höffe (éd.), ''Aristoteles. Poetik'', Berlin, Akademie Verlag, 2009. La question demeure ouverte dans la recherche contemporaine.</ref>.
==== La structure de la tragédie ====
Aristote analyse avec précision la structure de la tragédie. Celle-ci doit former un tout avec commencement, milieu et fin. L'intrigue (''mythos'') est l'âme de la tragédie, plus importante que les caractères<ref>Aristote, ''Poétique'', 11, 1452a15-32.</ref>. L'intrigue idéale comprend une péripétie (''peripeteia''), renversement de l'action en sens contraire, et une reconnaissance (''anagnôrisis''), passage de l'ignorance à la connaissance.
Le héros tragique ne doit être ni parfaitement vertueux ni complètement vicieux, mais occuper une position intermédiaire. Son malheur doit résulter non d'un vice mais d'une erreur (''hamartia'')<ref>Aristote, ''Poétique'', 13, 1453a7-10.</ref>. Ainsi Œdipe qui, sans le savoir, tue son père et épouse sa mère, inspire-t-il pitié plutôt que répulsion.
Comme le rappelle Pellegrin, la ''Poétique'' que nous connaissons est une œuvre incomplète : « nous ne possédons qu'une partie, celle qu'Aristote a consacrée à la tragédie, et en partie à l'épopée »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 109.</ref>. La partie consacrée à la comédie est perdue. Ces analyses ont profondément influencé la théorie littéraire occidentale, notamment à la Renaissance avec la redécouverte du traité, et nourrissent encore les débats en théorie littéraire et esthétique contemporaine.
== Réception et postérité ==
L'œuvre d'Aristote a connu une transmission complexe et une réception multiforme dans l'histoire de la pensée. Dans l'Antiquité tardive, les commentateurs néoplatoniciens (Porphyre, Alexandre d'Aphrodise, Simplicius, Philopon) étudient et expliquent ses œuvres, en cherchant souvent à les harmoniser avec le platonisme.
Au IXe siècle, les philosophes et savants du monde arabo-musulman traduisent Aristote en syriaque puis en arabe. Al-Fârâbî (872-950), Avicenne (980-1037) et Averroès (1126-1198), surnommé « le Commentateur », développent un aristotélisme islamique qui sera lui-même reçu en Occident latin. À partir du XIIe siècle, les œuvres d'Aristote, accompagnées des commentaires arabes, sont traduites en latin et transforment l'enseignement universitaire médiéval.
Albert le Grand (1200-1280) et Thomas d'Aquin (1225-1274) intègrent largement Aristote dans la théologie chrétienne, montrant la possibilité d'une articulation entre la philosophie péripatéticienne et la foi. Le thomisme deviendra une philosophie de référence dans l'Église catholique. Cette domination scolastique provoquera, à la Renaissance et à l'époque moderne, des remises en cause variées.
La science moderne, de Galilée à Newton, se construit en partie en réaction à la physique aristotélicienne, mais sans en constituer la simple négation : la recherche récente sur la philosophie naturelle de la Renaissance et la scolastique tardive décrit un tableau plus nuancé, fait à la fois de continuités, de relectures et d'oppositions<ref>Voir notamment, pour les débats sur la transition entre l'aristotélisme tardif et la science moderne, A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', op. cit. ; et l'entrée « Aristotle's Natural Philosophy » de la ''Stanford Encyclopedia of Philosophy''.</ref>.
Au {{XXe siècle}} et au début du {{XXIe siècle}}, plusieurs domaines de la pensée aristotélicienne ont fait l'objet d'un regain d'attention universitaire. En philosophie morale, le renouveau de l'éthique des vertus (Anscombe, MacIntyre, Nussbaum) a remis au premier plan les analyses de l'''Éthique à Nicomaque''<ref>Voir Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit. ; Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', op. cit.</ref>. En philosophie de l'esprit, certains philosophes ont vu dans l'hylémorphisme aristotélicien une alternative aux apories du dualisme cartésien et du réductionnisme matérialiste. En métaphysique, la conception de la substance et des catégories nourrit les débats sur l'ontologie réaliste. En philosophie de la biologie, la téléologie et la conception de l'organisme comme totalité fonctionnelle font l'objet de relectures<ref>Voir notamment Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', op. cit. ; James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>.
Au-delà de ces actualisations, l'œuvre d'Aristote demeure un objet d'étude central de l'histoire de la philosophie. Comme le rappelle Daniel Larose, « il existe ainsi plusieurs "Aristote" selon les époques » : la pluralité des lectures (logicienne, physicienne, métaphysicienne, théologienne, éthicienne) reflète à la fois la richesse interne de son œuvre et la diversité des projets philosophiques qui s'en sont nourris<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>. La recherche universitaire actuelle aborde le corpus aristotélicien comme un ensemble cohérent sans pour autant le juger systématique au sens classique du terme.
== Notes et références ==
{{Références|colonnes = 2}}
== Bibliographie ==
=== Éditions et traductions de référence ===
* Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014.
* Bekker, Immanuel (éd.), ''Aristotelis Opera'', Berlin, Reimer, 1831-1870.
* Jonathan Barnes (éd.), ''The Complete Works of Aristotle. The Revised Oxford Translation'', Princeton, Princeton University Press, 1984.
* Aristote, ''Catégories'', éd. et trad. R. Bodéüs, Paris, Les Belles Lettres, 2001.
* Aristote, ''Topiques I-IV'', éd. et trad. J. Brunschwig, Paris, Les Belles Lettres, 1967 et 2007.
* Aristote, ''Poétique'', éd. et trad. J. Hardy, Paris, Les Belles Lettres.
* Aristote, ''De l'Âme'', éd. et trad. A. Jannone et E. Barbotin, Paris, Les Belles Lettres.
* Aristote, ''Politique'', éd. et trad. J. Aubonnet, Paris, Les Belles Lettres, 1960 et suiv.
=== Synthèses générales ===
* Pierre Aubenque, ''Le problème de l'être chez Aristote'', Paris, PUF, 1962.
* Jonathan Barnes (éd.), ''The Cambridge Companion to Aristotle'', Cambridge, Cambridge University Press, 1995.
* Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923).
* Daniel Larose, ''Aristote de A à Z'', Paris, PUF, « Que sais-je ? », 2021.
* Pierre Pellegrin, ''Dictionnaire Aristote'', Paris, Ellipses, 2007.
* Pierre Pellegrin, ''Aristote'', Paris, Bordas, 1990.
* David Ross, ''Aristotle'', London, Methuen, 1923.
=== Études spécialisées par domaine ===
* Logique et épistémologie : Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', Paris, Vrin, 2009 ; Jan Lukasiewicz, ''La syllogistique d'Aristote'', trad. fr., Paris, Vrin ; J. Brunschwig, ''Aristote: Topiques I-IV'', Paris, Les Belles Lettres, 1967 et 2007 ; L.A. Dorion, ''Les Réfutations Sophistiques d'Aristote'', Paris, Vrin, 1995.
* Métaphysique : Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', Londres-New York, Routledge, 2004 ; Annick Jaulin, ''Aristote. La métaphysique'', Paris, PUF, 1999 ; Maddalena Bonelli (dir.), ''Physique et métaphysique chez Aristote'', Paris, Vrin ; Michel Narcy et Alonso Tordesillas (dir.), ''La « Métaphysique » d'Aristote. Perspectives contemporaines'', Paris, Vrin ; Richard Bodéüs, ''Aristote et la théologie des vivants immortels'', Montréal-Paris, Bellarmin-Les Belles Lettres, 1992.
* Philosophie de la nature et biologie : Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021 ; James G. Lennox, ''Aristotle's Philosophy of Biology: Studies in the Origins of Life Science'', Cambridge, Cambridge University Press, 2001 ; Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012 ; Allan Gotthelf et James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987 ; A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', Leiden, Brill, 2009.
* Éthique et politique : Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', Cambridge, Cambridge University Press, 2014 ; Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', Londres, Routledge, 2001 ; Marguerite Deslauriers et Pierre Destrée (éd.), ''The Cambridge Companion to Aristotle's Politics'', Cambridge, Cambridge University Press, 2013 ; Pierre-Marie Morel, ''Aristote. Une philosophie de l'activité'', Paris, Flammarion, 2003.
* Synthèses de référence en langue allemande et anglaise : Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', Oxford, Oxford University Press, 2012 ; Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch. Leben – Werk – Wirkung'', Stuttgart, Metzler, 2011.
===L{{'}}''Organon''===
*Bronstein, David, ''Aristotle on Knowledge and Learning: The Posterior Analytics'', Oxford, Oxford University Press, 2016.
*Dorion, Louis-André, ''Les Réfutations Sophistiques d’Aristote'', Paris, Vrin, 1995.
*Harari, Orna, ''Knowledge and Demonstration: Aristotle’s Posterior Analytics'', Dordrecht, Springer / Kluwer, 2004.
*Husson, Suzanne (éd.), ''Interpréter le'' De Interpretatione, Paris, Vrin, 2009.
*Lear, Jonathan, ''Aristotle and Logical Theory'', Cambridge, Cambridge University Press, 1980.
*Mesquita, António Pedro, et Santos, Ricardo (éd.), ''New Essays on Aristotle’s Organon'', Abingdon-Oxon, Routledge, 2024 (contributions notamment de Crivelli, Pellegrin, Bronstein/Zuppolini, Fait).
*Patterson, Richard, ''Aristotle’s Modal Logic: Essence and Entailment in the Organon'', Cambridge, Cambridge University Press, 1995.
*Whitaker, C. W. A., ''Aristotle’s'' De Interpretatione: ''Contradiction and Dialectic'', Oxford, Clarendon Press, 1996.
=== Ressources en ligne ===
* ''Stanford Encyclopedia of Philosophy'', entrées : « Aristotle » ; « Aristotle's Categories » ; « Aristotle's Logic » ; « Aristotle's Metaphysics » ; « Aristotle's Ethics » ; « Aristotle's Political Philosophy » ; « Aristotle's Natural Philosophy » ; « Aristotle's Biology » ; « Aristotle's Aesthetics ». [https://plato.stanford.edu/]
* ''Internet Encyclopedia of Philosophy'', entrée « Aristotle ». [https://iep.utm.edu/aristotle/]
{{Autocat}}
[[Catégorie:Philosophe]]
{{DEFAULTSORT:Aristote}}
9qlanjy2zua3ysiih6te1u13mbq6zma
Discussion Wikilivres:Le Bistro/2026
5
83406
765106
764088
2026-04-26T00:57:31Z
MediaWiki message delivery
36013
/* Request for comment (global AI policy) */ nouvelle section
765106
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 -->
p3qxi6pi129k0ba0eb2mbpe19vmp1br
Introduire la biodiversité dans la construction et l'urbanisme/Biodiversité dans l'environnement bâti : de quoi parlons nous ?/Changer la notion d'espaces verts
0
83829
765107
764505
2026-04-26T01:00:20Z
JackBot
14683
Formatage, [[Spécial:Pages non catégorisées]]
765107
wikitext
text/x-wiki
= De l’espace vert à l’infrastructure écologique urbaine =
[[File:Écopaturage urbain Lille moutons chèvres landscape grazing Mai 2019bandeau.jpg|thumb|center|upright=3|Écopâturage urbain (Lille, bois de la Citadelle)|alt=Ecopâturage urbain dans le Bois de la citadelle, à Lille]]
[[File:Parc Barbieux, Roubaix J1.jpg|thumb|Vaste espace ouvert, engazonné (Parc Barbieux, Roubaix, 2014)]]
[[File:Jielbeaumadier parc barbieux 2 roubaix 2006.jpg|thumb|Aménagement paysager (Parc Barbieux de Roubaix, 2006)]]
La notion d’« [[w:Espace verte|espace vert]] » en urbanisme a longtemps été associée à des fonctions surtout esthétiques, récréatives ou hygiénistes.
Elle peut désormais s'inscrire dans le '''[[w:Infrastructure verte|réseau des infrastructures écologique urbaine]]''' et tendre à devenir un ''espace à haute valeur écosystémique'', conçu non plus seulement pour offrir les aménités d'un jardin beau et reposant, mais aussi destiné à soutenir la biodiversité, restaurer les fonctionnalités écologiques et renforcer la résilience des territoires face aux perturbations, notamment climatiques (inondations et [[w:Bulle de chaleur urbaine|bulles de chaleur urbaine]] notamment)<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Stratégie de l’UE en matière d’infrastructure verte|url=https://climate-adapt.eea.europa.eu/fr/metadata/publications/eu-green-infrastructure-strategy|site=European Environment Agency}}</ref>..
Cette évolution s’inscrit dans le cadre de l’[[w:Écologie du paysage|écologie du paysage]], des [[w:Solutions fondées sur la nature|solutions fondées sur la nature]] et des politiques de connectivité écologique. Elle suppose de considérer les espaces végétalisés, les sols, les eaux et les habitats associés comme des composantes fonctionnelles d’un [[w:Réseau écologique|réseau écologique]], et non comme de simples surfaces décoratives ou résiduelles<ref>{{Lien web|langue=fr|titre=Les réseaux écologiques contre le déclin de la biodiversité ?|url=https://www.encyclopedie-environnement.org/vivant/reseaux-ecologiques-biodiversite-amenagement-territoire/|site=Encyclopédie de l’environnement}}</ref>.
== Services écosystémiques prioritaires ==
Les espaces verts urbains fournissent plusieurs catégories de [[w:Service écosystémique|services écosystémiques]]. En contexte urbain, les services les plus stratégiques sont généralement les '''services de régulation''' et les '''services culturels''', car ensemble, ils contribuent directement à l’adaptation climatique, à la santé publique et au bien-être des habitants<ref>{{Lien web|langue=fr|titre=Les services rendus par la biodiversité|url=https://ofb.gouv.fr/les-services-rendus-par-la-biodiversite|site=Office français de la biodiversité}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Les services écosystémiques urbains, vers une multifonctionnalité des espaces verts publics|url=https://www.erudit.org/en/journals/eue/2017-v11-eue03888/1050485ar/|site=Environnement urbain}}</ref>..
Les services de régulation comprennent notamment :
* l’atténuation des îlots de chaleur urbains par l’ombrage et l’évapotranspiration ;
* la gestion des eaux pluviales par l’infiltration, le ralentissement du ruissellement et le soutien à l’épuration naturelle ;
* l’amélioration de la qualité de l’air ;
* la réduction de certains risques liés aux épisodes extrêmes, notamment les canicules et les inondations<ref>{{Lien web|langue=fr|titre=Les services rendus par la biodiversité|url=https://ofb.gouv.fr/les-services-rendus-par-la-biodiversite|site=Office français de la biodiversité}}</ref>..
Les services culturels et sociaux incluent l’accès à la nature, le bien-être psychologique, les pratiques de loisirs, les fonctions éducatives, l’identité paysagère et la cohésion sociale. En milieu dense, ces services sont aussi des leviers d’acceptabilité sociale des projets de renaturation et de protection de la biodiversité<ref>{{Lien web|langue=fr|titre=Les services écosystémiques urbains, vers une multifonctionnalité des espaces verts publics|url=https://www.erudit.org/en/journals/eue/2017-v11-eue03888/1050485ar/|site=Environnement urbain}}</ref>..
Les services d’approvisionnement existent également, mais ils sont souvent secondaires en ville ; ils concernent par exemple la production de biomasse, de fruits, de graines ou de bois. Les services de soutien, comme la formation des sols, le recyclage des nutriments ou l’hébergement d’habitats, sont moins visibles mais essentiels au fonctionnement des écosystèmes urbains<ref>{{Lien web|langue=fr|titre=Les services rendus par la biodiversité|url=https://ofb.gouv.fr/les-services-rendus-par-la-biodiversite|site=Office français de la biodiversité}}</ref>.
== Biodiversité comme priorité ==
Le passage d’un espace vert ornemental à un espace écologique implique de faire de la biodiversité un objectif de conception, de gestion et d’évaluation. Il ne s’agit plus seulement de paysager de manière classique en terrassant et en plantant du végétal ornemental structuré, mais de créer des milieux dynamique et favorables à une diversité d’espèces, de strates, de microhabitats et de processus écologiques proches de ceux qui existent dans la Nature<ref>{{Lien web|langue=fr|titre=Des espaces verts écologiques en ville|url=https://www.lpo.fr/la-lpo-en-actions/mobilisation-citoyenne/nature-en-ville/fiches-conseils-nature-en-ville/des-espaces-verts-ecologiques-en-ville|site=LPO}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>..
Cette priorité suppose de favoriser les espèces locales, mieux adaptées aux contextes biogéographiques, ainsi que certaines espèces dites ''[[w:espèce facilitatrice|facilitatrices]]'' et ''[[w:espèce ingénieur|ingénieures]]'', capables de modifier leur environnement de manière positive pour d’autres organismes. Leur présence peut contribuer à structurer les habitats, à stabiliser les sols, à réguler l’humidité, à créer de l’ombre ou à générer des refuges écologiques<ref>{{Lien web|langue=fr|titre=Espèce ingénieure|url=https://fr.wikipedia.org/wiki/Esp%C3%A8ce_ing%C3%A9nieure|site=Wikipédia}}</ref>..
Cette logique doit cependant rester écologiquement prudente : l’intérêt d’une espèce dépend du contexte local, de son origine biogéographique et du risque d’introduction d’espèces exotiques envahissantes. La bonne approche n’est donc pas la standardisation, mais l’adéquation entre espèces, sols, hydrologie, usages et continuités écologiques<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>..
== Réseau écologique urbain ==
Pour être réellement fonctionnels, les espaces verts doivent être intégrés dans un '''[[w:Réseau écologique|réseau écologique urbain]]''' garantissant la circulation, l’alimentation, la reproduction et le refuge des espèces. La simple présence d’îlots végétalisés ne suffit pas si ceux-ci restent isolés les uns des autres ou séparés par des obstacles infranchissables<ref>{{Lien web|langue=fr|titre=Les réseaux écologiques contre le déclin de la biodiversité ?|url=https://www.encyclopedie-environnement.org/vivant/reseaux-ecologiques-biodiversite-amenagement-territoire/|site=Encyclopédie de l’environnement}}</ref>..
Ce réseau associe plusieurs trames complémentaires :
* '''[[w:Trame verte|trame verte]]''' : parcs, jardins, friches, haies, alignements d’arbres et continuités végétales ;
* '''[[w:Trame bleue|trame bleue]]''' : cours d’eau, mares, zones humides, fossés et berges ;
* '''[[w:Trame brune|trame brune]]''' : sols vivants, continuités pédologiques, zones peu artificialisées et milieux favorables à la faune et à la flore du sol ;
* '''[[w:Trame noire|trame noire]]''' : réduction de la pollution lumineuse ;
* '''[[w:Trame blanchetrame blanche|trame blanche (de silience)]]''' : milieux ouverts, prairies, friches herbacées, [[w:Corridor biologique|corridors biologiques]]<ref>{{Lien web|langue=fr|titre=Trame noire - Méthodes d'élaboration et outils pour sa mise en oeuvre|url=https://ofb.gouv.fr/doc/trame-noire-methodes-elaboration-et-outils-pour-sa-mise-en-oeuvre|site=Office français de la biodiversité}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Trames verte bleue et noire|url=https://www.siarja.fr/trames-verte-bleue-et-noire|site=SIARJA}}</ref>.
À l’échelle urbaine, ces trames doivent être pensées du quartier à la ville entière ; à l’échelle régionale, elles doivent s’articuler avec les continuités écologiques du territoire biogéographique ; à l’échelle supra-régionale, elles peuvent s’inscrire dans des cadres plus vastes, tels que les réseaux écologiques européens<ref>{{Lien web|langue=fr|titre=Les réseaux écologiques contre le déclin de la biodiversité ?|url=https://www.encyclopedie-environnement.org/vivant/reseaux-ecologiques-biodiversite-amenagement-territoire/|site=Encyclopédie de l’environnement}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Textes adoptés - L’importance de l’infrastructure verte urbaine|url=https://www.europarl.europa.eu/doceo/document/TA-9-2020-0241_FR.html|site=Parlement européen}}</ref>.
== Gestion restauratoire ==
La gestion des espaces verts évolue vers une '''gestion restauratoire''', c’est-à-dire une gestion orientée vers la restauration ou le maintien des fonctions écologiques, et non vers la simple conservation d’un aspect paysager figé. Cette approche privilégie la dynamique des écosystèmes, la diversité structurelle et la réduction des interventions inutiles<ref>{{Lien web|langue=fr|titre=Préserver, conserver ou restaurer les milieux et leurs fonctionnalités|url=https://ofb.gouv.fr/preserver-conserver-ou-restaurer-les-milieux-et-leurs-fonctionnalites|site=Office français de la biodiversité}}</ref>.
Elle repose notamment sur :
* la diminution des intrants chimiques et une éventuelle [[w:eutrophisation|déseutrophisation]]
* la diversification des habitats ;
* la fauche tardive et/ou différenciée ;
* l'import et/ou la conservation du bois mort lorsque cela est compatible avec la sécurité ;
* le cycle de la matière organique ;
* la prise en compte des cycles biologiques et des périodes et besoins de tranquillité pour la faune<ref>{{Lien web|langue=fr|titre=Gestion des espaces verts : vers un modèle plus vertueux|url=https://www.saran.fr/gestion-differenciee-espaces-verts|site=Mairie de Saran}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Des espaces verts écologiques en ville|url=https://www.lpo.fr/la-lpo-en-actions/mobilisation-citoyenne/nature-en-ville/fiches-conseils-nature-en-ville/des-espaces-verts-ecologiques-en-ville|site=LPO}}</ref>.
Cette gestion peut être qualifiée de restauratoire lorsqu’elle vise explicitement à rétablir des fonctions perdues : infiltration de l’eau, pollinisation, continuité d’habitats, stockage de carbone, fonctionnalité des sols, régulation thermique et accueil d’espèces inféodées aux milieux urbains ou périurbains<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>.
== Enjeux pour l’urbanisme ==
Pour l'urbaniste, ceci implique de concevoir les espaces verts comme des composantes d’un système socio-écologique et non comme des reliques décoratives officiellement simulées et entretenues. Il doit donc intégrer les sols, l’eau, la lumière, les usages, les temporalités biologiques et les continuités écologiques dès la planification et non en fin de projet<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>.
Elle suppose aussi de privilégier les solutions fondées sur la nature, les infrastructures vertes et bleues, et une articulation cohérente entre biodiversité, santé publique, gestion des risques et qualité du cadre de vie. Dans cette perspective, l’espace vert devient une infrastructure vivante, utile à la fois aux habitants et aux autres formes du vivant<ref>{{Lien web|langue=fr|titre=Stratégie de l’UE en matière d’infrastructure verte|url=https://climate-adapt.eea.europa.eu/fr/metadata/publications/eu-green-infrastructure-strategy|site=European Environment Agency}}</ref>.
== Références ==
{{AutoCat}}
1gz8j3ssj1wwhe8bfgc457k6kmhdizj
Discussion utilisateur:~2026-25430-78
3
83865
765109
2026-04-26T08:03:10Z
JackPotte
5426
Page créée avec « == Annulation de [[Wikijunior:Alphabet/V]] == Bonjour, j'ai annulé le remplacement du volcan car il n'était pas justifié et mal fait : il restait le son et que ça faisait doublon avec [[Wikijunior:Alphabet des animaux]]. ~~~~ »
765109
wikitext
text/x-wiki
== Annulation de [[Wikijunior:Alphabet/V]] ==
Bonjour, j'ai annulé le remplacement du volcan car il n'était pas justifié et mal fait : il restait le son et que ça faisait doublon avec [[Wikijunior:Alphabet des animaux]]. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 26 avril 2026 à 10:03 (CEST)
8jm1h5mm4s9tzrlmy88bqxbk5r53jen
765111
765109
2026-04-26T08:04:30Z
JackPotte
5426
765111
wikitext
text/x-wiki
== Annulation de [[Wikijunior:Alphabet/V]] ==
Bonjour, j'ai annulé le remplacement du volcan car il n'était pas justifié et mal fait : il restait le son et que ça faisait doublon avec [[Wikijunior:Alphabet des animaux]].
Idem pour [[Wikijunior:Alphabet/R]]. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 26 avril 2026 à 10:03 (CEST)
tuobcy84jdcvz2e6m03iwztylcupey4