Outils pour utilisateurs

Outils du site


nsi:premiere:architecture:machine_von_neumann

Ceci est une ancienne révision du document !



Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Constant SVG_DPI already defined in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 75

Warning: Undefined variable $ml_array in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 264

Warning: Undefined array key "inResponsiveUnits" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 282

Warning: Undefined array key "hasCssClasses" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 301

Warning: Undefined array key "print" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 322

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Fonctionnement d'une machine de Von Neumann

Les principes évoqués ici sont valables pour différentes sortes de machines programmables. La machine programmable que nous allons envisager adopte l'architecture de Von Neumann. En dépit des nombreuses améliorations et complexifications depuis 1945, le principe général utilisé dans les microprocesseurs d'aujourd'hui reste le même.

D'autres architectures existes. L'architecture de Von Neumann se caractérise par le fait que le programme et les données sur lesquelles s'exécutera le programme se trouvent dans une même mémoire. Dans l'architecture Harvard, il y a une mémoire pour le programme et une mémoire pour les données. Autrement les principes généraux sont semblables.

Dans ce TD nous allons travailler sur un exemple. Les choix que nous ferons seront très simplifiés par rapport à une machine réelle. Mais les principes rencontrés sont valables. Une vraie machine contient seulement beaucoup plus de circuits, beaucoup plus de connexions et on y ajoute tout un tas d'astuces pour optimiser les performances.

Dans ce cours, nous avons étudié comment, à partir de simples circuits logiques, fabriquer une mémoire, orienter des données sur un bus, produire des séquences de signaux. Nous allons pousser tout cela un peu plus loin ici.

Nous utiliserons Logisim. Vous pourrez toujours entrer dans les circuits pour voir ce qu'ils contiennent.

Choix de la taille des données

La mémoire contient les données et le programme. Ici nous choisissons :

  • Des données sur 8 bits,
  • Des adresses sur 5 bits également – Nous n'aurons donc que $2^5 = 32$ octets en mémoire !
  • La mémoire comme toute la machine est cadencée par une horloge CLK.
    Les changements opèrent quand CLK a un front montant (passe de 0 à 1)
  • sel permet d'activer la mémoire, soit en lecture soit en écriture
  • ld met la mémoire en lecture (Mémoire vers BUS). ld = 0, signifie qu'on est dans l'autr sens (BUS vers mémoire)

Unité arithmétique et logique

L'UAL est le circuit qui fait les calculs. On attend d'un microcontrôleur qu'il sache faire des calculs comme l'addition, la soustraction, le OU, le ET, le NON. Un composant plus performant comme un microprocesseur pourra en faire plus, comme la multiplication.

Notre UAL contient un registre ACCAccumulateur. Tous les calculs stockent leur résultat dans ACC. Il contient également un registre temporaire WWork.

Voici ce que sait faire notre UAL :

  • WR : Lit le BUS et l'écrit dans W,
  • ADD : additionne les valeurs de W et ACC et stocke le résultat dans ACC,
  • SUB : calcule ACC - W et stocke le résultat dans ACC,
  • LD : (LOAD) charge W dans ACC
  • RD : écrit ACC sur le BUS

Par ailleurs l'UAL transmet des informations sur ACC :

  • si UAL = 0
  • si UAL > 0

Pour l'éventualité de nombres négatifs, on utilise le CA2.

Jeu d'instructions

On définit ce que notre machine saura faire. Pour chaque instruction, l'unité de commande (UC) devra savoir quoi faire.

Les données en mémoire font 1 octet = 8 bits. On pourrait faire 2 lectures pour obtenir un mot de 2 octets = 16 bits. C'est le choix qui est fait en général pour les composants réels. Ici nous choisissons la simplicité ce qui nous met un peu à l'étroit ! Néanmoins, avec ces 8 instructions, nous pourrons déjà écrire des programmes.

Nous choisissons qu'une instruction fera toujours 1 octet. Voici les instructions que nous voulons avoir :

  • HLT : halt, le programme s'arrête.
    code : 000xxxxx
  • ADD : addition, l'UC demande une addition à l'UAL.
    code : 001@@@@@
    @@@@@ représente l'adresse d'une case mémoire. Le contenu de cette case est chargé dans W de UAL.
  • SUB : soustraction, l'UC demande une soustraction.
    code : 010@@@@@
  • LDA : chargement, l'UC demande de charger une valeur de la mémoire dans ACC
    code : 011@@@@@
  • STO : stockage, l'UC demande l'écriture de ACC dans un case mémoire
    code : 100@@@@@
  • BRA : branchement, l'UC change la valeur de la ligne d'exécution en cours
    code : 101#####
    ##### représente le nouveau numéro de ligne
  • BRZ : branchement si zéro. Même chose que le précédent mais à condition que ACC = 0
    code : 110#####
  • BRP : branchement si positif. Même chose que le précédent mais à condition que ACC > 0
    code : 111#####

Sans les deux dernières instructions, un programme ferait toujours la même suite d'instruction. Ces deux instructions sont comme des if.

Questions

La mémoire contient :\\écrit en hexadécimal, octets séparés par un espace

6A 2B 8C 00 00 00 00 00   00 00 05 03 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
  1. Y a-t-il un moyen de savoir quelles cases correspondent aux instructions d'un programme ?
  2. Les 4 premiers octets sont les instructions d'un programme.
    Écrivez ces octets en binaire puis traduisez-les selon le code définit plus haut.
  3. Que fait ce programme ?

Les registres

En plus des registres W et ACC dans l'UAL, nous utiliserons 3 registres très importants :

  • Registre d'adresse R@ : contient l'adresse de la case mémoire en cours de lecture.
  • Registre instruction RI : contient l'instruction en cours d'exécution.
  • Pointeur de ligne (Program Counter) PC : contient le numéro de la prochaine ligne programme
    Cette ligne correspond à la case mémoire de même numéro.
    Comme le fonctionnement basique est de passer à la ligne suivante, ce registre est doté d'une commande +1.

Cycle instruction

L'unité de commande (UC) se charge, en fonction de l'instruction en cours, de produire la suite de signaux nécessaires à l'exécution de cette instruction.

Vous pouvez constater que l'UC pilote tous les organes avec les signaux RD, WR…

Cycle instruction

Le graphique ci-dessous décrit la totalité du fonctionnement de l'UC.


Comment lire ce diagramme

Ce diagramme décrit une machine à état. Chaque cercle jaune représente un état.

  • L'UC commence dans l'état 0,
  • à chaque front d'horloge, l'état change selon les chemins (transitions) représentés par les flècles,
  • dans certains cas, plusieurs chemins quittent un état. La machine emprunte alors le seul chemin possible selon le cas (des conditions sont précisées surs ces transitions)
  • dans les états, on précise ce que doit faire la machine.
    Par exemple, dans l'état 1 il faut faire le transfert MEM → RI et aussi incrémenter PC (faire +1)
  • Pour mémoriser l'état dans lequel est la machine, on utilise des mémoires. Ici 4 mémoires $Q_3Q_2Q_1Q_0$ suffisent. Par exemple pour l'état 5, on a $Q_3Q_2Q_1Q_0 = 0101$

Questions

  1. Quel signaux l'UC doit-elle activer pour produire le transfert MEM → RI ?
  2. Dans quels états le signal WR du registre R@ doit-il être activé ?
  3. Déduisez-en l'équation logique de ce WR en fonction des $Q_3$, $Q_2$, $Q_1$, $Q_0$.
  4. Un peu plus difficile : à quelle condition $Q_3$ doit passer à 1 ?
    Pour répondre, constatez que $Q_3$ vaut 1 dans les états 8 et 9 et que l'on active 8 si on est dans l'état 3 et que la commande est STO ou si on est dans l'état 2 et que… je vous laisse finir.

Ces quelques questions vous montre comment on peut définir les équations logiques de tous les signaux dont nous avons besoin et obtenir les transitions prévues par le schéma. Si nous voulions une UC plus performante avec un jeu d'instruction plus riche, le principe serait le même mais avec une machine à état plus volumineuse.

Simulation sur Logisim

Chargez vonneumann.circ et ouvrez-le avec logisim.

Pour simuler, choisissez l'outil avec la main (en haut à gauche) puis appuyez sur le bouton RESET une fois.

Ensuite, vous ferez avancer la simulation pas à pas en faisant des tops d'horloge. Pour cela vous pouvez par exemple faire CTRL+T au clavier ce qui change l'état de l'horloge. La simulation avance chaque fois que l'horloge passe de 0 à 1.

À faire

  • Avec l'outil de sélection activé, cliquez-droit sur la mémoire et choisissez Edit Contents
  • Entrez dans la mémoire le contenu vu précédemment :
    6A 2B 8C 00 00 00 00 00   00 00 05 03 00 00 00 00
    00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
    
  • Exécutez (comme décrit ci-dessus).
    Observez que le programme se déroule bien comme prévu, en passant bien par tous les états indiqués par la machine à états.

Plus gros programme

  • Télécharger le fichier p2.txt,
  • dans la mémoire, chargez ce fichier,
  • décodez le contenu de ce programme.
    En particulier vous devez deviner quelles cases mémoires correspondent à des instructions et quelles cases correspondent à des données utilisées par le programme.
  • Exécutez et vérifiez le bon fonctionnement.

Dans le 2e cas, faire toute l'exécution pas à pas peut être long. Contentez-vous alors de faire quelque pas pour voir ce qui se produit, puis passez en mode automatique en appuyant CTRL+K. Quand vous constaterez que la simulation est bloquée sur HLT, ce sera que l'exécution est terminée. Rappuyez alors sur CTRL+K et constatez le résultat en mémoire.

nsi/premiere/architecture/machine_von_neumann.1650444086.txt.gz · Dernière modification : de goupillwiki