Les architectures programmables, présentées ici regroupent deux grandes catégories de circuits intégrés numériques qui seront étudiés dans les chapitres suivants.
La structure générale d'un microcontrôleur est définie par les différentes fonctionnalités :
Ces principaux blocs fonctionnels communiquent par d'intermédiaire du bus d'interconnexion qui contient les données ainsi que les contrôles et sélection des autres circuits. Il permet de synchroniser tous les signaux échangés.
L'horloge Clk qui cadence le rythme de calcul et d'échange des données. Cette horloge n'est, en général, pas connectées aux mémoires dont le temps de propagation entre adresse et donnée est inférieur à la période de l'horloge. Certains périphériques génèrent des signaux séquentiels, ce qui justifie la présence de l'horloge sur le bloc de circuits périphériques. La ligne Reset permet d'initialiser le processeur ainsi que les circuits périphériques au démarrage, comme cela a été justifié dans le chapitre sur la logique séquentielle. Le signal AS (Address Strobe) est un signal de synchronisation qui indique que l'adresse présente sur le bus d'adresse est stable.
La mémoire est en général composée de deux composants mémoires :
Le bus d'interconnexion se décompose en trois bus :
Le codage hexadécimal est très utilisé pour représenter des valeurs en mémoire. Il s'agit du codage des octets en base 16 où les valeurs de 10 à 15 sont représentées par les lettres A à F (ou bien a à f).
décimal | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
hexadécimal | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
La conversion de la base 10 vers la base 16 se fait avec une suite de division par 16 et en remplaçant les restes compris entre 10 et 15 par la lettre correspondante.
Selon les langages, l'indication d'un code exprimé en hexadécimal est le préfixe "$" ou bien "0x".
Exemples de nombres non signés :
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
1 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
2 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
3 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
4 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
5 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 |
6 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 |
7 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 |
8 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |
9 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 |
A | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 |
B | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 |
C | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 |
D | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 |
E | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 |
F | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 |
Pour convertir une valeur décimale en hexadécimal, il faut chercher la valeur dans la table, la valeur hexadécimale correspond à la valeur hexadécimale de la ligne suivie de la valeur hexadécimale de la colonnne. Exemple : 167 correspond à la ligne A et la colonne 7 ce qui donne 167=0xA7 (ce qui peut se vérifier avec le calcul 16×10+7 en appliquant la formule de conversion
Les plages des adresses mémoires des différents composants s'appelle le plan mémoire. Un exemple est présenté sur le schéma pour une capacité d'adressage de 16 bits (n=16).
Certains bits mémoires sont connectés aux circuits périphériques, d'autres à la logique de décodage. Ce composant permet d'activer un signal de sélection de circuit en fonction de l'adresse de façon à éviter le conflit des données sur le bus de données. En effet un seul circuit doit échanger des données à chaque instant. Pour ce faire, il faut donc activer le circuit concerné et désactiver les autres, c'est le rôle de la logique de décodage et des signaux CSx.
La logique de décodage est un circuit combinatoire qui active une des sorties CSx en fonction de la valeur de l'adresse. Cette technique s'appelle le décodage d'adresse.
Le plan mémoire présenté ici respecte le tableau suivant :
Circuit activé | Adresse basse | Adresse haute | A15...A10 | CS1 | CS2 | CS3 |
---|---|---|---|---|---|---|
mémoire de programme (k=14) | $0000 | $3FFF | 00XXXX | 1 | 0 | 0 |
mémoire de données (l=11) | $4000 | $47FF | 01000X | 0 | 1 | 0 |
circuits périphériques (p=10) | $4800 | $4BFF | 010010 | 0 | 0 | 1 |
non utilisé | $4C00 | $FFFF | XXXXXX | 0 | 0 | 0 |
Afin que la logique de décodage respecte ce tableau, elle doit traiter les lignes d'adresses de A15 à A10 ce qui donne q=10
L'espace d'adressage occupé réellement dépend du microcontrôleur.
On retrouve cette structure générale sur le microcontrôleur atmega 8 de la famille des processeur atmel avr.
Les différentes composantes de ce processeur seront étudiés dans les chapitre suivants : les mémoires , les périphériques et le processeur.