Vous êtes sur la page 1sur 15

Technologies des ordinateurs

1. Rappels :
1.1. Information binaire :

Puisque nous travaillons avec des circuits électroniques, chaque instruction


peut être codée en tension électrique. Pour simplifier les choses, on prend
uniquement deux niveaux de tension (0 et 5 volts). Ainsi chaque instruction est
codée sur une combinaison de ces deux niveaux de tension (bit pour binary
digit).

Par convention, le niveau haut de tension se présente par un "un" et le niveau


bas par un "zéro". Le potentiel de la sortie est défini par l'état des transistors
interne du circuit logique.

Entre ces deux états, la haute impédance (HZ) est l'état d'une broche de sortie
qui n'est connectée ni à la masse ni à la source de tension = Ø. Cela signifie que
le signal est à un niveau logique ni haut, ni bas : il y absence d’informations (si
parasité à 0,4 volts le signal reste à 0).

Un autre avantage du signal digital, c’est qu’il est possible de le remettre en


forme (éliminé le bruit) grâce au circuit logique trigger de Schmidt.

Contrairement donc au signal analogique qui peut prendre une infinité de


valeurs possibles (entre 0 et 5 volts), le signal digital est donc représenté de son
côté par une succession de 0 et de 1.

1.2 Mot binaire :


Un nombre binaire composé de 8 bits s’appelle un octet et peut prendre des
valeurs (décimales) de 0 à 255. C’est la taille d’une case mémoire. Deux cases
mémoire ensemble peuvent contenir 16 bits et s’appellent parfois « mot
binaire ».

11000111 : le bit le plus à droite est le bit de poids faible et dans 11000111 : le
bit le plus à gauche est le bit de poids fort.

1.3 Transformation binaire décimale :

10001010 = 74 en décimale

Deux méthodes : division rapide par deux avec un reste et les puissances
descendantes de deux et la soustraction (avec le tableau des puissances).

1.4 Correspondance base 8 ou 16 :

Pour écrire le nombre binaire 101101000110 en base 8, on exprime chaque


groupe de 3 bits (en partant des bits de poids faible) dans son équivalent octal.
On obtient ici successivement de droite à gauche :

110 = 6, 000 =0, 101 =5, 101 =5, ce qui donne 55068.

On opère de la même façon pour le passage vers la base 16, en regroupant les
bits quatre à quatre :

1011=B, 0100=4, 0110=6 ce qui donne B46.

Si le nombre de bits n’est pas divisible par 3 ou 4, il est alors nécessaire


d’ajouter des bits nuls en tête du nombre.

Par exemple : 11010102 = (001 101 010) = 1528 en octal et 11010102 = (0110
1010) = 6A en hexadécimal.

À l’inverse, pour passer des bases 8 ou 16 à la base 2, on remplace chaque


symbole octal ou hexadécimal par les 3 ou 4 bits équivalents.
Par exemple 3278 = 110101112 et 4CE = 100110011102.

Exemple FFAB en Hexa :

F=15 donc 1111 et à nouveau F=15 donc 1111 puis A=10 donc 1010 puis B=11
donc 1011. Le résultat est 1111 1111 1010 1011 en binaire et 65451 en décimal
(15*16³+ 15*16²+10*16+11) =15*4096+15*256+10*16+11.

Autre exemple : 0001 1100 = 1C en Hexa et 28 en Déc.

Conversion de base 3, 4 et base 7 en décimale :

On commence par le premier chiffre, on multiplie par trois et on ajoute le


suivant.
Exemple pour 2101 on a : 2*3+1=7 puis 7*3+0=21 puis 21*3+1=64

Pour la base 7 vers la base 10 : 2101 on a 2*7+1=15 puis 15*7+0=105 puis


105*7+1=736

Pour la base 4 vers la base 10 : 2101 on a 2*4+1=9 puis 9*4+0=36 puis


36*4+1=145

Codage quelconque

Dans un ordinateur, toute l’information est représentée sous forme de bits qui
sont regroupés en octets. Il faut donc qu’il y ait un codage de cette
information. Ce codage dépend bien sûr du type des données.
Le codage ASCII affecte un code sur 7 bits aux principaux caractères :
2. Opérations simples
2.1 Nombre binaire négatif :

Un nombre positif est représenté de façon standard par son écriture binaire.
On représente un nombre négatif en ajoutant 1 à son complément à 1 (obtenu
en inversant tous les bits) et en laissant tomber une éventuelle retenue finale.

Ex : 00011100 ce qui donne en complémentation à 1 = 11100011

11100011 + 1 pour la complémentation à 2 = 11100100

Nombre positif  89 s’écrit toujours 01011001

Nombre négatif  –52 s’écrit maintenant 11001100.

En effet, en binaire sur 8 bits, 52 s’écrit 00110100, ce qui donne un


complément à 1 égal à 11001011 et un complément à 2 égal à 11001100.

2.2 Addition binaire :

Le grand intérêt du complément à 2 est de simplifier les additions.


Pour effectuer l’addition de 118 et de –36, il suffit d’exprimer chacun des
nombres en complément à 2 et d’effectuer l’addition bit à bit en laissant
tomber une éventuelle retenue :

Exemple : 118 et 36
118=1110110 et 36=100100 avec complément à 1= 1011011 puis complément
à 2 = 1011100. Si on fait 118 + (-36)= 1110110 +1011100= 1010010= 82

2.3 Soustraction binaire :

Soustraire un nombre revient à additionner son opposé, c’est-à-dire son


complément à 2.
Par conséquent, on peut utiliser le complément à 2 dans les microprocesseurs
pour réaliser une soustraction, en utilisant des additions.
2.4 Décalage à gauche et à droite :

Le développement en série de Taylor-Mac Laurin de la fonction sinx


=ax+bx²+cx³+… peut être décomposée en ax+bxx+cxxx…

Cela reste valable pour n’importe quelles autres fonctions.

Donc pour la multiplication, on décale d’un rang vers la gauche en ajoutant un


zéro. Par ex : 1001=9 si je décale vers la gauche de 2 zéros = 100100=36

Je vérifie 9*2*2=36

Par contre, si je décale vers la droite d’un rang, je divise par deux.

Une soustraction = une complémentation avec addition

Une multiplication= une addition plus décalé

Une division= une soustraction avec addition

Pour résumé :

Les nombres sont au cœur de l’ordinateur. Il est facile de représenter les


entiers positifs à l’aide des puissances de 2 et les nombres négatifs à l’aide de la
convention de représentation du complément à 2. On le voit, le CPU ne fait
que décaler, complémenter et additionner.
Les bits peuvent aussi servir à représenter des caractères même s’il n’y a pas
vraiment de correspondance universelle valable sur toutes les machines et tous
les systèmes.

Les portes logiques :


L'algèbre de Boole utilise plusieurs opérateurs que l'on nomme portes logiques.
Il ne contient que deux éléments, que l'on appelle couramment variables
booléennes. Ces variables ne peuvent avoir que deux états, 1 ou 0 et permet
de réaliser les différentes fonctions logique (et de décrire un circuit combinant
des portes logiques).

L'universalité de la porte NAND : Il est possible de réaliser n'importe quelle


fonction logique de base en utilisant uniquement des portes NAND.
Le demi-additionneur :

A
B S

R

Ce premier circuit est la brique de base. Il prend en entrée deux bits A et B et


calcule la somme S et la retenue R (Carry en anglais). Les bits R et S peuvent
aussi être vus comme les bits de poids fort et de poids faible de l’écriture sur
deux bits de la somme A + B.

S = A Xor B
est la somme

R = A And B
est le report

On remarque sur la table de vérité que S est le ou exclusif des deux entrées A
et B et que R vaut 1 lorsque les deux entrées valent 1, c’est-à-dire la porte ET.

L’additionneur complet 1 Bit (FULL ADDER) :

Addition de 2 bits en tenant compte du report précédent

Exemple : Calculons 1 + 3
En binaire cela donne : 0001 + 0011

L'addition des bits de droite est une addition de deux bits, elle peut être
réalisée avec le demi-additionneur. Pour les bits suivants par contre, il faut
tenir compte d'un éventuel report.
Ainsi dès le deuxième bit de notre exemple (en comptant les bits de droite à
gauche) il a fallu faire 2 additions (1 + 0 + 1 = 10 " on pose 0 et on reporte 1")

Schéma du circuit plein additionneur

Cette table de vérité comporte 3 entrées : R - (le report de l'addition


précédente), A et B

Il lui faut deux sorties :

 S = la somme de 3 bits (A + B + R-)


 R = le nouveau report

R-

A S
B

R+
Additionneur par propagation de retenue :

L’additionneur par propagation de retenue est le plus simple. Les paires de bits
sont additionnés colonne par colonne et les retenues sont propagées vers la
gauche.
En mettant en cascade plusieurs additionneurs complets 1 bits, on construit un
additionneur appelé additionneur par propagation de retenue car la retenue
se propage d’additionneur en additionneur.

Additionneur 4 bits avec Cin pour le bit de récupération et Cout pour le bit de
report.

Qu’est-ce qu’une instruction et comment cela fonctionne ?

Le microprocesseur réalise une succession d’action tenant compte de ce qu’on


lui demande de faire, en fonction des signaux de commande extérieur. Il utilise
pour cela un décodeur d’instructions (une instruction-machine est une
instruction codées sous une forme binaire qui est directement exécutable par
le processeur).
Le processeur distingue les instructions en faisant une comparaison : il reçoit
les instructions, il lit le code binaire, fait correspondre avec l’action à réaliser en
les comparants. Une fois déterminé, il signifie à la partie quelles sont les
successions d’actions à réaliser (exemple avec 27=0, il fait une soustraction).

Pour leur intelligibilité ces instructions sont représentées par un langage plus
évolué intitulé langage assembleur.
Dans celui-ci, des expressions symboliques, appelées « mnémoniques »,
remplaçaient les codes numériques. Ainsi, au lieu de saisir le code 5ef416 en
hexadécimal (ou son équivalent binaire), on écrivait ADD A, B. Cette dernière
formulation était beaucoup plus compréhensible pour le programmeur.

Cependant, l’ordinateur ne savait travailler qu’avec des codes numériques et,


même si ceux-ci avaient chacun un équivalent symbolique, il fallait les
transformer pour qu’ils puissent être exécutés.

C’était le rôle du programme d’assemblage, qui prenait comme entrée un


autre fichier décrivant un programme à l’aide de mnémoniques et qui générait
le code numérique équivalent (ou code binaire), permettant ainsi à l’ordinateur
d’exécuter les instructions.

L’ensemble de toutes les instructions exécutables par le processeur s’appelle le


" jeu d’instructions " de l’ordinateur.

CISC et RISC

Il existe 2 types de jeux d’instruction : processeur à architecture CISC dit


complexe et processeur à architecture RISC dit réduit

Dans un processeur RISC (par ex : processeur MOTOROLA) le jeu d'instructions


possède les propriétés suivantes :

 Le nombre de classes d'instructions différentes est réduit par rapport à


un CISC, chez celui-ci en termes de séquentialité les temps sont
variables-court ou long (par ex : processeur INTEL).
 Les instructions sont de taille fixe.
 Il fonctionne avec un pipe-line

Qu’est-ce qu’un cycle pipeline ?

Soulignons qu'un processeur est une machine séquentielle, ce qui signifie que
le cycle de traitement d'une instruction se déroule séquentiellement (elles
seront exécutées l'une après l'autre, dans l'ordre de leur apparition).

Le pipe-line est une technologie visant à permettre une plus grande vitesse
d’exécution des instructions en modularisant le CPU en différentes parties
autonomes (étages du pipe-line). Extraction de l’instruction puis décodage et
exécution et pendant ce temps extraction et puis décodage d’une autre
instruction et ainsi de suite.

Il faut prévoir des zones tampons (file d’attente de type FIFO ou LIFO en
mémoire) qui amortissent les différentes vitesses.

Ports d’entrée-sortie :
Les ports d’entrée-sortie sont des éléments matériels de l’ordinateur,
permettant au système de communiquer avec des éléments extérieurs, c’est-à-
dire d’échanger des données, d’où l’appellation d’interface entrée/sortie
(notée E/S).

Liaison parallèle :

Des fils mis côte à côte, généralement 8, 16, 32 ou même 64, transmettent
simultanément autant de bits qu'il y a de conducteurs. L'intérêt de ce type de
communication est que le débit des données est multiplié par le nombre de
fils mis côte à côte. Ce type de transmission a longtemps été considéré comme
plus rapide que les transmissions de type série.

Application :

 Port de l'imprimante (DB25 femelle)

Des interférences dues à des phénomènes d'induction électromagnétique


apparaissent entre les conducteurs électriques mis côte à côte. Ce problème
de diaphonie (cross-talk) devient gênant pour les fréquences élevées ou sur les
lignes trop longues. Il peut-être plug and Play et son débit est variable suivant
la norme. Il n’est plus très utilisé.
Liaison série :

Les informations à envoyer sont transmises bit par bit sur l’unique ligne de
transmission. Au lieu d'être envoyés simultanément sur 8 fils parallèles, les 8
bits de l'octet à envoyer sont "sérialisés" par un registre à décalage (shift
register) et envoyés les uns à la suite des autres sur un seul conducteur.

Le récepteur reçoit les 8 bits qui se succèdent dans un autre registre où ils sont
remis côte à côte ("dé-sérialisés") pour reformer l'octet d'origine.

Synchrone :

Le conducteur qui véhicule les données est accompagné d'un second


conducteur affecté au signal de synchronisation (horloge ou clock) pour
cadencer les transmissions.
Le flux de données peut dès lors être ininterrompu sans séparation entre les
données envoyées.

On retrouve ce type de communication dans les ports PS/2 pour le


raccordement du clavier et de la souris et les connexions USB (Universal Serial
Bus) par exemple.

L'architecture qui a été retenue pour le port USB est en série parce que celle-ci
permet d'utiliser une cadence d'horloge beaucoup plus élevée qu'une interface
parallèle (dans une architecture à haut débit, les bits circulant sur chaque fil
arrivent avec des décalages, provoquant des erreurs).

Asynchrone :

La liaison asynchrone, dans laquelle chaque caractère est émis de façon


irrégulière dans le temps.

Il est donc précédé d'une information indiquant le début de la transmission du


caractère (l'information de début d'émission est appelée bit START) et
terminé par l'envoi d'une information de fin de transmission (appelée bit STOP,
il peut éventuellement y avoir plusieurs bits STOP).

En résumé il existe deux méthodes :

La synchronisation par signaux de validation (START) et d’acquittement (STOP),


mise en œuvre sur les bus asynchrones, et la transmission accompagnée d’une
horloge, de l’information et des commandes, mise en œuvre sur les bus
synchrones.

Les interruptions :
Un événement externe ou interne imprévu peut se produire, qui nécessite une
réaction de l’ordinateur. Il faut alors temporairement interrompre le
fonctionnement normal du processeur pour lui faire exécuter un programme
en réponse à l’événement. (Par ex : le programme détecte que le Wifi n’est pas
connecté, il envoie un message). Le processeur n’arrête pas d’être interrompu.
Les interruptions sont utilisées pour la gestion des entrées/sorties et pour la
gestion des processus.

On les classes par

A. Origine :

Interruption matériel (ou externe): Une information qui arrive sur un


connecteur vers le circuit intégré du processeur. Elles proviennent souvent de
périphériques liés à l’ordinateur et informent le processeur d’un événement.

Interruption logiciel (ou interne) : Souvent un logiciel ne fonctionne pas bien.


Par exemple lors d’un défaut de page (Une instruction fait référence à une
adresse virtuelle contenue dans une page qui n’a pas encore été ramenée en
mémoire principale), c’est une interruption semblable aux interruptions
matérielles mais émise par un programme.

Interruption planifié (mode debug) :


On peut obliger le CPU à s’arrêter pour vérifier la structure dans le protocole de
programmation.
Pour ce faire, on utilise le mode TRAP.

Watchdog pour s'assurer qu'un ordinateur ne reste pas bloqué à une étape
particulière du traitement qu'il effectue. Au bout d’un certain temps, on sort et
on signale qu’il y a problème.

B. Priorités :

Il existe des interruptions non masquable (NMI), généralement dédiée au


signalement d’une erreur importante pour le système et que l’on est obligé de
prendre en considération et des interruptions masquable, il en
effet parfois nécessaire de pouvoir ignorer les interruptions pendant un
temps.

Les interruptions peuvent donc être associées à une échelle de priorité globale
mais aussi traitées de façon individuelle (c’est alors le programmeur qui décide
de l’ordre de priorité, ex de l’incendie dans une usine de surgelée).

Comment cela fonctionne-t-il ?

Lorsqu’une interruption est acceptée, le programme s’interrompt. Notons


qu’aujourd’hui il existe un module précis qui s’occupe de gérer les
interruptions, cela ne vient donc pas perturber le fonctionnement du
programme.

Le CPU termine toujours l’instruction en cours et quitte le programme dans


des conditions particulières : il sauvegarde le contexte (grâce au registre
d’état=bit qui caractérise la dernière instruction) dans une mémoire afin de
pouvoir revenir au programme à exécuter.
Cette structure particulière (une partie de la mémoire) qui permet la gestion de
l’interruption s’appelle une pile.
Celle-ci est de type FIFO (First In first Out) ou LIFO (Last In First Out) pointé par
un registre. Ce registre s'appelle le pointeur de pile (il contient à tout instant le
sommet de la pile).

Quand le CPU est mis sous tension, le contenu du pointeur de pile est à zéro. Il
pointe donc sur la case mémoire se trouvant en haut de la RAM. Maintenant
pour mettre une donnée sur la pile, il suffit d’empiler la valeur dans le registre
et ensuite mettre la donnée à l'adresse pointée par le pointeur de pile.

On empile donc en tenant compte de l’ordre des cycles d’interruptions,


lorsque c’est fini le pointeur de pile revient étapes par étapes à l’adresse de
départ.

Interruption vectorisé :

Après avoir sauvegardé le contexte dans la pile. Un vecteur d’interruption


identifie la source de l’interruption via un numéro toujours identique (un
entier de 8 bits, dont la valeur varie de 0 à 255) : le type (souris type 2, clavier
type 4) et associé à une adresse fixe.

Ce numéro permet d’adresser un tableau des vecteurs d’interruptions placées


dans la RAM. Quand un numéro IRQ est mis en mémoire, celui-ci indique
l’adresse fixe où se trouvent les différentes fonctions de traitement de
l’interruption.

La gestion dynamique de la mémoire : dans la programmation modulaire, les


programmes sont plus faciles d’utilisation puisque l’on utilise uniquement la
partie du programme dont on a besoin. Les programmes sont dès lors de
tailles variables.
La plupart des programmes ayant des besoins en mémoire dépendant de
l'usage qu'on en fait, il est nécessaire de pouvoir demander au système, à des
moments arbitraires de l'exécution, l'allocation de nouvelles zones de
mémoire (on change le programme d’adresse ) , et de pouvoir restituer au
système ces zones (à chaque allumage du pc, les adresses sont remises à zéro).