Vous êtes sur la page 1sur 11

2 Principes Généraux des Microcontrôleurs

L’unité centrale de traitement (CPU) d’un microcontrôleur contient plusieurs parties qui sont cruciales pour
réaliser toutes les instructions possibles, incluant l’unité arithmétique et logique (ALU), les registres, le
compteur ordinal, le décodeur d’instruction, et la mémoire.

2.1 Architectures des CPU


Il existe de principales architectures pour les CPUs utilisées dans les dispositifs de calcul. L’architecture
Harvard utilise deux mémoires distinctes (séparées), une pour le programme et l’autre pour les données. Cela
permet au microcontrôleur d’accéder simultanément aux deux mémoires, e.g., lire une instruction et écrire
une information dans la mémoire de données. Un schéma bloc simplifié d’une CPU à architecture Harvard est
montré dans Figure 2.1. Cet accès simultané à l’instruction et aux données augment la vitesse de traitement
du composant (microcontrôleur). Un stockage séparé signifie aussi que les mémoires de programme et de
données peuvent être de largeurs différentes. La mémoire de donnée est restreinte à 8 bits, mais la mémoire
de programme est de sur ATmega328P.

Figure 2.1: CPU à architecture Harvard caractérisée par des mémoires


programme et données séparées.
En revanche, l’architecture von Neumann (en l’honneur du mathématicien et physicien John von Neumann)
adresse la mémoire de programme et de données à l’aide d’un seul bus. Un schéma bloc simplifié d’une CPU
à architecture von Neumann est montré dans Figure 2.2. Elle est utilisée de manière intensive dans les PC var
la ROM et la RAM sont externes à la CPU car l’utilisation de bus séparés sur la carte mère reviendra très cher.

Figure 2.2: CPU à architecture von Neumann caractérisée par une mémoire
unique pour le programme et les données.
Le Microcontrôleur ATmega328P
Le microcontrôleur ATmega328P utilise l’architecture Harvard, ce qui signifie que le programme et les
données sont stockées dans des mémoires différentes. Un schéma bloc de la CPU du ATmega328P CPU est
montré dans Figure 2.3. (Noter que presque toutes les interconnexions sont des bus mais elles ne sont pas
symbolisées ainsi pour la clarté).
2.2 Calculateur à Jeu d’Instructions Réduit (Reduced Instruction Set Computing - RISC)
Les ordinateurs des années 1980s commençaient à utiliser toute sorte d’instructions imaginable, qui ne
sont pas toutes utilisées, ce qui conduisit à des codes d’instruction et des CPU très compliqués. A contrario,
les processeurs RISC (Reduced instruction set computing) utilise seulement un nombre limité d’instructions et
ils ont des tailles d’instruction fixes ; la plupart des instructions du ATmega328P sont sur 16 bits (certaines sont
sur 32 bits).
Les processeurs utilisant le RISC sont, généralement, caractérisés par beaucoup de registres, car les
données ne peuvent pas être traitées directement en mémoire (la donnée doit être, en premier, chargées
dans un registre). Les processeurs RISC ont un petit jeu d’instruction, ce qui ne pose pas de problème quant
on utilise un langage de programmation évolué comme le C (mais, peut rendre de codage en assembleur plus
fastidieux). La plupart des instructions RISC peuvent s’exécuter en un cycle d’horloge.
2.3 Instructions Machine
Les instructions constituent la base de tout calcul numérique. Un bout de donnée binaire, appelé une
instruction, contient l’information sur l’opération spécifique à mener. Il y a des instructions arithmétiques
telles que l’addition et la soustraction, les opérations de branchement comme le saut vers une autre partie du
code, les opérations de transfert de données comme le chargement et le copiage d’une donnée d’une place à
une autre dans la mémoire, les instructions sur bit comme l’effacement et le décalage d’une donnée, et les
instructions de contrôle comme la mise en veille ou la remise à zéro (resetting) de la minuterie « chien de
garde » (watchdog timer). En plus de contenir l’information sur l’opération (appelé code opération ou opcode),
l’instruction contient aussi l’information sur quelles données à manipuler (appelée opérande ou opérandes).
Chacune de ces instructions est ensuite analysée de manière matérielle par le décodeur d’instruction, qui
achemine alors les commandes appropriées et les signaux de données vers l’unité arithmétique et logique
(ALU).
En général, pour un ensemble de n différents codes opératoires (opcodes), il doit y avoir un nombre à
log (𝑛) bits pour le stocker. L’ensemble d’instructions des microcontrôleurs AVR 8-bit, qui est utilisé pour
ATmega328P, a approximativement 130 instructions uniques. Donc, log (130) = 8, ce qui signifie que 8 bits
sont nécessaires dans chaque instruction sur 16-bit pour spécifier l’opération à accomplir. Ceci ne laisse que
8 bits pour le(s) opérande(s). Il y a 32 registres à usage général qui peuvent être utilisés pour stocker
temporairement les données et il existe plusieurs instructions qui nécessitent les contenus de deux de ces
registres. Dans ce cas 8 bits ne suffisent pas à adresser proprement ces deux registres (nécessitant chacun 2
bits d’adresse).
Figure 2.3: Schéma bloc de l’UAL du microcontrôleur ATmega328P

Pour surpasser cette limitation, le jeu d’instruction AVR utilise le concept d’instructions de longueur
variable, ou codes « opératoires extensible » ou expanding opcodes. Les instructions ayant des opérandes
multiples ou très longues sont conçues pour avoir des opcodes courts alors que celles ayant moins
d’opérandes ou pas du tout sont conçues avec des opcodes longs. Il existe 32 registres à usage général (GP
registers), et ATmega328P a en plus 32ko de mémoire programme et 2ko de mémoire de données, devant
être adressées. De plus, il existe d’autres registres spéciaux comme le registre d’état et le registre de pile qui
peuvent être affectés par les instructions machine.
Pour mettre en lumière l’usage des opcodes extensibles, considérer les instructions suivantes qui couvrent
toute la gamme de celles ayant un long opcode à celles ayant un court opcode.

• L’instruction CLI est utilisée pour effacer le drapeau d’interruptions globales (GIF) dans le
registre d’état et le registre de contrôle SREG. Puisque cette instruction ne nécessite pas
d’opérandes, tous les 16 bits de l’instruction sont utilisés pour stocker l’opcode.
• L’instruction NEG convertit le contenu d’un registre GP en complément à 2. Puisqu’il y a 32
registres GP, 2 bits sont donc nécessaires pour l’opérande, laissant les 11 bits restants pour
l’opcode.
• La plupart des instructions ont deux registres GP comme opérandes. Par exemple, l’instruction
ADD va additionner les contenus de deux registres GP. Alors, 10 bits sont nécessaires pour
adresser les deux registres, laissant 6 bits pour l’opcode.
• Quelques instructions nécessitent des opérandes très longs. Pour pouvoir adresser proprement
jusqu’à 4 Mo de mémoire, il est nécessaire d’utiliser 22 bits de données pour l’opérande. Pour
cela, une instruction 32 bits est utilisée. Dont 22 bits dédiés pour l’adressage de la mémoire et
les 10 autres bits pour l’opcode.
Alors que l’étalement des opcodes permet une plus grande flexibilité dans les opérandes, il rend aussi plus
difficile le décodage de l’instruction. Ceci est dû aux faites qu’il n’y a plus de position et de longueur fixe pour
chaque opcode dans chaque instruction.
2.4 Décodeur d’instructions
Le décodeur d’instructions traduit une instruction en signaux de commande et d’adressage appropriés.
Cela est accompli en utilisant des portes logiques combinatoires ou une ROM. Par exemple, l’instruction ADD
(sans retenue) nécessite deux registres GP comme opérandes (dont un est désigné comme registre de
destination où sera stocké le résultat). Le décodeur d’instructions va adresser ces deux registres et achemine
leurs contenus à l’additionneur matériel dans l’UAL, puis réachemine la solution vers le registre de destination.
2.2 Unité Arithmétique et Logique (UAL ou ALU)
L’UAL contient tout le matériel nécessaire à la réalisation d’opérations arithmétiques et logique. Alors que
les conceptions de la plupart des UAL sont propriétaires, l’inspection du jeu d’instructions offre une bonne
idée sur type de matériel qui doit être inclus dans l’UAL. Par exemple, l’ALU AVR doit contenir, au moins, un
additionneur, des portes logiques comme AND, OR, XOR, et NOT, et d’autre matériel similaire.
2.6 Les Registres
Les registres sont omniprésents dans la conception du microcontrôleur. Les registres à usage général
(General purpose registers) contiennent des données qu’on peut traiter immédiatement, et permettent de
stocker des données avec un accès facile à l’UAL avant de stocker les résultats en mémoire. Les registres
d’adresse mémoire ou les registres pointeurs dictent au microcontrôleur où regarder dans les données
programme pour trouver la prochaine instruction à exécuter. Le registre d’état (SREG sur ATmega328P) stocke
l’information relative à la plus récente opération qui vient d’être exécuter par le microcontrôleur. Les registres
d’entrées/sorties (E/S) et les registres d’E/S étendus (parfois appelés registres périphériques) stocke
l’information relative à l’opération sur les broches d’E/S et leurs fonctionnalités périphériques. Parmi ceux-ci,
DDRxn, PORTxn, et PINxn. De plus, il y a un registre de pointeur de pile qui est utilisé pour sauvegarder
momentanément les adresses mémoire.
Architectures des Registres
Il y a quatre types d’architectures pour les registres : entrée-série/sortie-série (serial-in/serial-out ou SISO),
entrée-parallèle/sortie-parallèle (parallel-in/parallel-out ou PIPO), et entrée-parallèle/sortie-série (parallel-
in/serial-out ou PISO). Ils sont définis par leur taille, qui dépend du nombre de bascules (flip-flops) qu’ils
contiennent, et ultimement définissent le nombre de bits de donnée qui peuvent y être stockés. La donnée
peut être chargée soit de manière série ou en parallèle. Une opération de décalage peut être ajoutée aux
registres pour accroitre leurs fonctionnalités, au prix d’un supplément d’électronique.
a) Registres à Entrée-Série/Sortie-Série (SISO)
Les registres à entrée-série/sortie-série ou SISO (Serial-in /serial-out) peuvent être utilisés pour la mise en
mémoire tampon de données, le stockage temporaire de données lors des transferts entre leurs sources et
leurs destinations. Une donnée série est envoyée à l’entrée de la première bascule logique, et à chaque cycle
d’horloge, elle est décalée vers les bascules suivantes. Les registres à entrée série prennent plus de temps
pour transmettre la donnée. Enfin, les registres à entrée série nécessite plus de temps que les registres à entée
parallèle pour transmettre une donnée d’un bout à l’autre. Un schéma d’un registre SISO à 4-bit est illustré
dans Figure 2.4.

Figure 2.4: Schéma d’un registre SISO à 4-bits.


b) Registres à Entrée-Parallèle/Sortie-Parallèle (PIPO)
Les registres à Entrée-Parallèle/Sortie-Parallèle ou PIPO (parallel-in/parallel-out) sont utilisés dans les
registres à usage général, parmi d’autres applications. La donnée est accessible immédiatement et
simultanément pour toutes les bascules D (flip-flops). De plus, toutes les sorties sont disponibles
immédiatement. A chaque cycle d’horloge, les sorties sont mises à jour pour refléter toute nouvelle donnée
disponible sur les entrées. Il existe des registres à décalage PIPO ayant des signaux de commande pour soit
charger la donnée ou la décaler dans les deux sens. Un schéma d’un registre PIPO (sans décalage) est montré
dans Figure 2.2.

Figure 2.2: Schéma d’un registre PIPO à 4-bits.

c) Registres à Entrée-Série/Sortie-Parallèle (SIPO)


Les registres à entrée-série/sortie-parallèle ou SIPO (serial-in/parallel-out) sont utilisés pour réccupérer une
donnée provenant d’un protocole de communication série pour la mettre ensuite dans un registre à usage
général ou en mémoire. La donnée série est envoyée à la première bascule D, et à chaque cycle d’horloge, la
donnée est décalée vers les bascules suivantes. Toutes les données sont disponibles immédiatement. Un
schéma d’un registre SIP à 4-bit SIPO est donnée dans Figure 2.6.
Figure 2.6: Schéma d’un registre SIPO à 4-bits.

d) Registres à Entrée-Parallèle/Sortie-Série (PISO)


Les registres à entrée-parallèle/sortie-série ou PISO (parallel-in/serial-out) sont utilisés pour transférer une
donnée d’un registre à décalage ou d’une mémoire vers un protocole de communication série. Dans Figure
2.7, on voit un registre PISO à 2-bit (seulement, à titre illustratif). Un signal de commande 𝑤 /𝑆 est utilisé pour
charger la donnée dans les bascules D (si le signal est à un niveau logique bas) ou décaller le contenu des
bascules vers la droite (si le signal est à un niveau logique haut).

Figure 2.7: Schéma d’un registre PISO à 2-bits.


2.7 Compteur de Programme ou compteur ordinal (Program Counter - PC)
Le compteur de programme (ordinal) est un registre qui contient l’adresse mémoire du premier octet de
la prochaine instruction à exécuter. Il s’incrémente à chaque instruction. Un schéma donné dans Figure 2.8,
montre le fonctionnement interne du compteur de programme. A la mise sous tension, le compteur ordinal
est forcé à zéro et le recherche d’instruction (fetch) commence à l’adresse 0 (reset=0 force les bascules à la
valeur 0).
Figure 2.8: Schéma d’un compteur de programme (PC).
Si l’instruction est un branchement conditionnel, branch=1, et la valeur courante du PC (sorties Q des bascules
D) est additionné au décalage de branchement (branch offset) qui passe par le multiplexeur MUX1, et le
résultat est envoyé aux entrées D des bascules pour mettre à jour le compteur ordinal.
Si l’instruction n’est pas une instruction de contrôle du flux de programme (i.e. ce n’est ni un branchement ou
ni un saut), alors le compteur ordinal est incrémenté de 1 après chaque recherche d’instruction (instruction
fetch).
2.8 La Mémoire
Il y a deux types de mémoires celle volatile et celle non-volatile. Cela est en rapport au fait que les données
soient persistantes ou non à l’extinction du microcontrôleur (calculateur, de manière générale). Avant de
discuter de ces deux types de systèmes mémoire, il est cependant important de prendre en compte la manière
dont cette dernière est adressée (i.e. comment chaque élément mémoire est stocké ou rappelé) car cela est
d’importance capitale pour le fonctionnement d’un microcontrôleur.
Mémoire Volatile
La mémoire volatile est utilisée pour un stockage temporaire car les données ne persistent pas après
extinction de l’alimentation. Souvent appelée mémoire à accès aléatoire (random-access memory - RAM)
puisque toute case mémoire arbitraire peut être adressée en tout temps. Les types de mémoire RAM incluent
la RAM statique (SRAM), la RAM dynamique (DRAM), et les registres.
La RAM diffère de la mémoire à accès séquentiel, où les données doivent être accédée dans l’ordre de leur
stockage. Comme exemple de mémoire à accès séquentiel, on peut citer les bandes magnétiques, les bandes
perforées et les disques magnétiques. Un lecteur de bande magnétique doit rembobiner la bande avant de
commencer à lire les données du début vers la fin, et sans sauts.
a) SRAM
La SRAM est un type de mémoire volatile utilisée dans le Caractéristiques de la SRAM
microcontrôleur ATmega328P.
Un schéma d’une SRAM est donné dans Figure 2.9, et les • Utilisation de bascules ;
• Plus rapide que la DRAM
modes de fonctionnement sont décrits au Tableau 2.1. Chaque
• Plus chère que la DRAM ;
inverseur dans le schéma doit être bien sûr alimenté pour
• Faible consommation d’énergie.
retenir la donnée.
Figure 2.9: Schéma d’une cellule SRAM.

Modes Description
Standby 𝑊𝐿 = 𝐿𝑂𝑊, mosfets are OFF (open switches)
𝑄 and 𝑄 will not change and are floating
Write WL = HIGH, mosfets are ON (closed switches)
BL and BL are asserted
Q = BL, 𝑄 = 𝐵𝐿
Read 𝑊𝐿 = 𝐻𝐼𝐺𝐻, mosfets are ON (closed switches) read
data from BL and 𝐵𝐿
Table 2.1: Modes de fonctionnement de la SRAM.

b) DRAM
Caractéristiques de la DRAM
C’est un type de mémoire volatile utilisée dans les
• Utilisation d’un transistor et d’un
ordinateurs pour son faible volume et son faible coût. Un
condensateur ;
schéma d’une mémoire DRAM est donné dans Figure 2.10, • Plus lente que la SRAM
avec les modes de fonctionnement décrits dans Tableau • Moins chère que la SRAM
2.2. Si le condensateur n’est pas rafraîchi en continu, il se • Moins encombrante que la SRAM
déchargera et la mémoire sera perdue. • Consomme moins d’énergie que la SRAM
• Nécessite un rafraîchissement permanant.

Figure 2.10: Schéma d’une cellule DRAM.

Modes Description
Write WL = HIGH, mosfets are ON (closed switches)
BL is asserted, must wait for cap to charge or discharge
Read WL = HIGH, mosfets are ON (closed switches) charge
stored on cap goes to BL value must be re-written after
every read
Tableau 2.2: Modes de fonctionnement d’une mémoire DRAM.
Un sous ensemble de mémoire DRAM appelée RAM pseudo-statique (PSRAM) utilise des cellules similaires à
celles de la DRAM, mais inclut une circuiterie permettant un autorafraîchissement, ce qui signifie un usage
simplifié comme une SRAM.
Mémoire Non-Volatile
La mémoire non-volatile est utilisée pour un stockage plus permanant car les données persistent même après
la mise hors tension. Au fil des années, la mémoire non-volatile a pris différentes formes : cartes perforées ;
cylindres de cire ; disques optiques (CD et DVD) ; disques magnétiques ; bandes magnétiques ; et mémoires à
semiconducteurs. Puisque la mémoire non-volatile ne nécessite pas d’alimentation électrique pour maintenir
les données stockées, elle est utilisée pour stocker le micrologiciel (firmware) sur les ordinateurs, et les
instructions de programme et les constantes dans les microcontrôleurs. Elle est souvent appelée mémoire à
lecture seule (read-only memory - ROM), du fait que durant le fonctionnement normal, elle est effectivement
à lecture seule. Ecrire dans une ROM nécessite une tension plus élevée que ce qui est nécessaire pour
l’opération de lecture.
Les premiers types de ROM incluent les ROM à masque, qui étaient fabriquées, sous forme de masques
semiconducteurs, dans une chambre blanche à la manière des circuits intégrés. Cela signifie que tous les bits
mémoire sont câblés physiquement sur la puce et ne peuvent plus être altérés (effacés ou réécrits). Les ROM
à maque sont par conséquent inadaptées pour de petits projets qui nécessiteraient un éventuel débogage ou
pour les systèmes embarqués qui nécessiteraient une mise à jour du firmware ou toute autre modification du
contenu mémoire.
a) EPROM
C’est une mémoire ROM programmable électriquement. Ce genre de circuits contient généralement une
fenêtre en quartz au-dessus de la micropuce ; une exposition à la lumière UV pendant une longue durée de
temps efface la mémoire et positionne tous ces bits à 1. Un programmateur externe est utilisé pour
programmer toutes les données désirées sur la mémoire. L’EPROM a l’avantage d’être réinscriptible, mais
souffre de la nécessité de son extraction physique du circuit pour son effacement et sa reprogrammation. De
plus, la fenêtre en quartz est chère à fabriquer et les circuits EPROM peuvent être plus chers que d’autres
types de mémoire. Cependant, elles constituaient une amélioration par rapport aux circuits à programmation
unique (one-time-programmable - PROM), qui comme leur nom l’indique, ne peuvent être programmés
qu’une seule fois et ne peuvent plus être ni effacés ni reprogrammés.
b) Mémoire Flash
Cette mémoire est utilisée comme mémoire programme dans le
microcontrôleur ATmega328P. elle utilise des transistors à grille flottante,
comme ce celui montré dans Figure 2.11 à architecture "NOR". La broche CG
(control gate) signifie la « grille de commande », et c’est où les signaux de
commande sont appliqués. La broche FG (floating gate) signifie la « grille
flottante », et c’est par là où des électrons sont injectés ou retirés pour stocker
la donnée. La broche S est la source, qui est généralement la connexion au
potentiel bas (la masse) du transistor. La broche D est le drain, qui est
généralement la connexion au potentiel haut du transistor.
Figure 2.11: Schéma d’une
cellule à grille flottante.

Les modes de fonctionnement d’une cellule à grille-flottante sont décrits dans Tableau 2.3.
Mode Description

Clear ≈ 12 V applied to CG, channel on electrons travel from S to D in


the process they tunnel through oxide to FG

Set ≈ -12 V applied to CG electrons tunnel from FG to CG and are


removed

Read 2 V applied to CG if FG has electrons, a channel will not form (0 if


FG has no electrons, a channel will form (1) from S to D

Tableau 2.3: Modes de fonctionnement d’une mémoire flash.

La mémoire Flash est une sous-catégorie des mémoires effaçable et programmable électriquement ou
EEPROM (Electrically Erasable Programmable ROM). De nos jours, il y a une légère différence entre les
architectures EEPROM et Flash. Cependant, le ATmega328P contient à la fois une mémoire EEPROM et une
mémoire Flash comme espace de stockage non-volatile. La mémoire Flash est là où résident les données
programme et le bootloader optionnel. L’EEPROM sur ATmega328P est utilisée pour le stockage de données
réinscriptibles mais qui ne changent pas fréquemment, comme les mots de passe ou les constantes physiques
et mathématique. Un bit fusible sur le ATmega328P peut être configuré pour prévenir la perte des données
inscrites en EEPROM durant l’effacement du microcontrôleur, ce qui offre une propriété supplémentaire pour
le microcontrôleur.
2.9 Processus & Timing d’exécution d’une Instruction
C’est le processus par lequel le microcontrôleur exécute chaque instruction. De cette façon, la CPU n’est autre
qu’une machine d’états finis compliquée. Le diagramme d’état est donné dans Figure 2.12.

Figure 2.12: Diagramme d’état du processus d’exécution d’une


instruction sur microcontrôleur.

Etape 1. La prochaine instruction, indiquée par l’adresse stockée dans le compteur de programme (PC),
est lue à partir de la mémoire ;
Etape 2. L’instruction est traduite (décodée) en un ensemble de commandes ou de signaux pour chaque
composante du microprocesseur ;
Etape 3. Le compteur programme s’incrémente pour pointer sur la prochaine case mémoire ;
Etape 4. Les données sont chargées à partir de la mémoire (ou des périphériques d’entrée/sortie) dans
le(s) registre(s), leurs emplacements sont toujours inscrits dans le code instruction comme des
opérandes ;
Etape 5. Si l’UAL est nécessaire pour exécuter une opération, le processeur instruit le matériel pour la
réaliser ;
Etape 6. Le résultat est réécrit dans un emplacement mémoire, un registre, ou même sur périphérique ;
Etape 7. Saut arrière vers l’étape 1.
Le microcontrôleur ATmega328P utilise le concept du pipelining pour accélérer le traitement par la CPU. Cela
est permis par son architecture Harvard, qui permet à la CPU de chercher (fetch) la prochaine instruction à
partir de la mémoire pendant l’exécution de l’instruction courante. Ceci est appelé recherche (fetch)
instruction parallèle comme décrit dans Figure 2.13.

Figure 2.13: Chronogramme du processus d’instruction fetch parallèle.


Figure 2.14 montre le timing interne pour la CPU, et montre comment la plupart des instructions du
ATmega328P s’exécutent en un cycle d’horloge.

Figure 2.14: Chronogramme d’une opération ALU à un cycle d’horloge.

Vous aimerez peut-être aussi