là on est pas trop mal
authorPaul Kocialkowski <contact@paulk.fr>
Wed, 13 May 2015 18:23:50 +0000 (20:23 +0200)
committerPaul Kocialkowski <contact@paulk.fr>
Wed, 13 May 2015 18:23:50 +0000 (20:23 +0200)
applications-logiques.tex
aspects-informatique.tex
memoire.tex
phenomenes-circuits-temps.tex

index 4140fd8..f31cb76 100644 (file)
@@ -5,14 +5,14 @@ On s'intéresse particulièrement aux interactions entre les montages électroni
 \section{Concepts et définitions}
 \subsection{Systèmes logiques}
 \label{systemes-logiques}
-Dans les systèmes électroniques logiques, l'information est représentée par des grandeurs électriques prenant la forme de valeurs discrètes\notecitepage{Tocci}{4}. On définit alors deux états en chaque point du circuit, correspondants à la présence de la grandeur considérée (une tension, un courant) : c'est l'état logique \emph{haut} ou en son absence : l'état logique \emph{bas}.\\
+Dans les systèmes électroniques logiques, l'information est représentée par des grandeurs électriques prenant la forme de valeurs discrètes\notecitationpage{Tocci}{4}. On définit alors deux états en chaque point du circuit, correspondants à la présence de la grandeur considérée (une tension, un courant) : c'est l'état logique \emph{haut} ou en son absence : l'état logique \emph{bas}.\\
 
 On parle de système \emph{analogique} (par opposition à système logique) lorsque les grandeurs qui représentent l'information varient de manière continue (une infinité de valeurs est possible).\\
 Pourtant, il n'y a pas de différence fondamentale du point de vue électrique entre un système logique et un système analogique : c'est bien l'interprétation que l'on porte aux différents états possibles qui donne sens à l'information.\\
 
-Ainsi, dans la pratique, on définit un état logique en un point à partir de la tension mesurée en ce point (par rapport à la masse, le $0$ V du générateur). Les tensions correspondantes à chaque état logique sont spécifiques à la technologie des composants utilisés, il en existe plusieurs sortes et les deux plus répandues sont le TTL\notetrad{Transistor-Transistor Logic}{logique transistor-transistor}, qui utilise des transistors bipolaires et le CMOS\notetrad{Complementary Metal Oxide Semiconductor}{Semi-conducteur à complémentarité métal-oxide}, qui utilise des transistors à effet de champ. Pour la technologie TTL, les tensions d'alimentation sont de l'ordre de 5V. Ainsi, on attribue l'état bas à un intervalle de tensions proche de $0$ V (de $0$ V à $0,8$ V) et l'état haut à un autre intervalle, proche de $5$ V (de $2$ V à $5$ V). L'intervalle de tensions entre $0,8$ V et $2$ V ne représente donc pas d'état logique défini.\\
+Ainsi, dans la pratique, on définit un état logique en un point à partir de la tension mesurée en ce point (par rapport à la masse, le $0$ V du générateur). Les tensions correspondantes à chaque état logique sont spécifiques à la technologie des composants utilisés, il en existe plusieurs sortes et les deux plus répandues sont le TTL\notetraduction{Transistor-Transistor Logic}{logique transistor-transistor}, qui utilise des transistors bipolaires et le CMOS\notetraduction{Complementary Metal Oxide Semiconductor}{Semi-conducteur à complémentarité métal-oxide}, qui utilise des transistors à effet de champ. Pour la technologie TTL, les tensions d'alimentation sont de l'ordre de 5V. Ainsi, on attribue l'état bas à un intervalle de tensions proche de $0$ V (de $0$ V à $0,8$ V) et l'état haut à un autre intervalle, proche de $5$ V (de $2$ V à $5$ V). L'intervalle de tensions entre $0,8$ V et $2$ V ne représente donc pas d'état logique défini.\\
 
-Cette représentation dite \emph{logique} de l'information présente de nombreuses applications. En effet, elle permet tout d'abord de représenter des nombres sous la forme de quantités discrètes : on parle alors de bits\notecitepage{Tocci}{10}. Un \emph{bit} représente l'unité fondamentale d'un système de numération ne pouvant prendre que deux valeurs possibles (les états logiques haut et bas), c'est à dire de la base 2. Afin de représenter des nombres plus grands que 1 (le nombre maximal représentable sur un bit), on forme des ensembles de bits (de la même manière que l'on forme des ensembles de chiffres allant de 0 à 9 pour représenter un nombre supérieur à 9 en base 10). Chaque bit porte un poids, c'est à dire qu'il représente une puissance de 2 plus ou moins élevée. Par exemple, dans la notation 101 en base 2, le bit de droite porte un poids 0 (il représente l'unité), le bit du milieu un poids 1 (représente $2^1$) et le bit de gauche un poids 2 (représente $2^2$). On lit alors la valeur numérique en base 10 : $1 \cdot 1 + 0 \cdot 2^1 + 1 \cdot 2^2 = 5$. Un ensemble de 8 bits est appelé un \emph{octet} (ou \textit{byte} en Anglais).\\
+Cette représentation dite \emph{logique} de l'information présente de nombreuses applications. En effet, elle permet tout d'abord de représenter des nombres sous la forme de quantités discrètes : on parle alors de bits\notecitationpage{Tocci}{10}. Un \emph{bit} représente l'unité fondamentale d'un système de numération ne pouvant prendre que deux valeurs possibles (les états logiques haut et bas), c'est à dire de la base 2. Afin de représenter des nombres plus grands que 1 (le nombre maximal représentable sur un bit), on forme des ensembles de bits (de la même manière que l'on forme des ensembles de chiffres allant de 0 à 9 pour représenter un nombre supérieur à 9 en base 10). Chaque bit porte un poids, c'est à dire qu'il représente une puissance de 2 plus ou moins élevée. Par exemple, dans la notation 101 en base 2, le bit de droite porte un poids 0 (il représente l'unité), le bit du milieu un poids 1 (représente $2^1$) et le bit de gauche un poids 2 (représente $2^2$). On lit alors la valeur numérique en base 10 : $1 \cdot 1 + 0 \cdot 2^1 + 1 \cdot 2^2 = 5$. Un ensemble de 8 bits est appelé un \emph{octet} (ou \textit{byte} en Anglais).\\
 
 Cette représentation se révèle particulièrement efficace pour effectuer des opérations sur ces nombres ou simplement les représenter : on peut aisément associer à chaque point du circuit représentant un bit, une LED dont l'état (allumé ou éteint) traduit directement l'état logique du bit (haut ou bas).
 
@@ -177,9 +177,9 @@ Il existe d'autres types de bascules, faisant office de mémoire du circuit et d
 \subsection{Horloges et synchronisation}
 \label{horloges-synchronisation}
 \label{h-\thepage}
-Dans un cadre plus général que les bascules, il existe deux grandes familles de circuits logiques : les circuits synchrones et les circuits asynchrones. Les circuit asynchrones sont les plus immédiats à la compréhension : en effet, il s'agit de circuits dans lesquels une variation d'un état d'entrée entraîne immédiatement (aux temps de propagation du signal et de réaction des composants près) une variation des sorties en conséquence (ce qui n'exclut pas non plus l'utilisation de rétroactions et de dispositifs de mémoire). De fait, l'état du circuit peut potentiellement changer à tout moment, ce qui rend le système complexe à concevoir et à dépanner\notecitepage{Tocci}{167}. De plus, la communication entre deux circuits asynchrones peut s'avérer particulièrement ardue dès lors qu'il s'agit de transférer des informations numériques en série ou en parallèle, comme détaillé dans la partie \ref{synchronisation-echange-donnees}.\\
+Dans un cadre plus général que les bascules, il existe deux grandes familles de circuits logiques : les circuits synchrones et les circuits asynchrones. Les circuit asynchrones sont les plus immédiats à la compréhension : en effet, il s'agit de circuits dans lesquels une variation d'un état d'entrée entraîne immédiatement (aux temps de propagation du signal et de réaction des composants près) une variation des sorties en conséquence (ce qui n'exclut pas non plus l'utilisation de rétroactions et de dispositifs de mémoire). De fait, l'état du circuit peut potentiellement changer à tout moment, ce qui rend le système complexe à concevoir et à dépanner\notecitationpage{Tocci}{167}. De plus, la communication entre deux circuits asynchrones peut s'avérer particulièrement ardue dès lors qu'il s'agit de transférer des informations numériques en série ou en parallèle, comme détaillé dans la partie \ref{synchronisation-echange-donnees}.\\
 
-Au contraire, dans les circuits asynchrones, le moment exact où un point du circuit change d'état peut être commandé par un signal externe : il s'agit d'un signal de synchronisation que l'on appelle le signal d'horloge\notecitepageagain{Tocci}{167}. Généralement, le signal d'horloge est rectangulaire, périodique et de rapport cyclique\footnote{Il s'agit du rapport entre le temps haut du signal sur une période et l'ensemble de la période.} égal à $\frac12$.\\
+Au contraire, dans les circuits asynchrones, le moment exact où un point du circuit change d'état peut être commandé par un signal externe : il s'agit d'un signal de synchronisation que l'on appelle le signal d'horloge\notecitationpageencore{Tocci}{167}. Généralement, le signal d'horloge est rectangulaire, périodique et de rapport cyclique\footnote{Il s'agit du rapport entre le temps haut du signal sur une période et l'ensemble de la période.} égal à $\frac12$.\\
 
 Dans la plupart des cas, on synchronisera les états logiques du circuit sur un front de l'horloge, c'est à dire au moment où le signal d'horloge passe d'un état bas à un état haut (front montant) ou d'un état haut à un état bas (front descendant) : on parle alors de synchronisation sur front. Il est également possible de synchroniser l'état sur un niveau logique (haut ou bas) et d'interdire les changements pendant cet état logique : on parle alors de synchronisation sur niveau. Selon le système en question et son utilisation, on cherchera à exploiter l'un de ces mécanismes de synchronisation, ou une combinaison habile de plusieurs d'entre eux, afin de donner cohérence au système et de faciliter l'opération recherchée.\\
 
@@ -236,16 +236,16 @@ On propose une solution de synchronisation en deux temps, où la valeur d'entré
 \caption{Schéma de la solution de synchronisation proposée}
 \end{figure}
 
-On utilise deux bascules RS asynchrones, simples à réaliser et au fonctionnement bien connu. On synchronise alors la première bascule sur le temps haut de l'horloge avec deux portes ET reliées à $H$ sur les entrées $R$ et $S$, on relie l'entrée du montage à la porte ET reliée à l'entrée $S$ de la bascule et on relie l'inverse de l'entrée du montage pour la porte ET reliée à l'entrée $R$ de la bascule. De fait, l'état de l'entrée est recopié en sortie de la bascule pendant l'état haut de l'horloge et reste inchangé pendant le temps bas. On y associe alors une seconde bascule synchronisée de la même façon mais sur l'état bas de l'horloge (avec deux portes ET reliées à $\overline{H}$) et on relie la sortie $Q$ (respectivement $\overline{Q}$) de la première bascule à l'entrée $S$ (respectivement $R$) (au travers des portes ET). De fait, pendant le temps bas de l'horloge, l'état intermédiaire de sortie de la première bascule (qui est inchangé) est recopié en sortie par la seconde bascule, qui restera alors inchangée pendant le temps haut, ce qui fournit le résultat attendu. Il s'agit d'une technique d'utilisation des bascules avec sensitivité aux états logiques de l'horloge\notecite{CoursLogique}.\\
+On utilise deux bascules RS asynchrones, simples à réaliser et au fonctionnement bien connu. On synchronise alors la première bascule sur le temps haut de l'horloge avec deux portes ET reliées à $H$ sur les entrées $R$ et $S$, on relie l'entrée du montage à la porte ET reliée à l'entrée $S$ de la bascule et on relie l'inverse de l'entrée du montage pour la porte ET reliée à l'entrée $R$ de la bascule. De fait, l'état de l'entrée est recopié en sortie de la bascule pendant l'état haut de l'horloge et reste inchangé pendant le temps bas. On y associe alors une seconde bascule synchronisée de la même façon mais sur l'état bas de l'horloge (avec deux portes ET reliées à $\overline{H}$) et on relie la sortie $Q$ (respectivement $\overline{Q}$) de la première bascule à l'entrée $S$ (respectivement $R$) (au travers des portes ET). De fait, pendant le temps bas de l'horloge, l'état intermédiaire de sortie de la première bascule (qui est inchangé) est recopié en sortie par la seconde bascule, qui restera alors inchangée pendant le temps haut, ce qui fournit le résultat attendu. Il s'agit d'une technique d'utilisation des bascules avec sensitivité aux états logiques de l'horloge\notecitation{CoursLogique}.\\
 
-On considérera ici que les temps de propagation des signaux sont négligeables, de sorte que les états $H$ et $\overline{H}$ sont identiques en tous points du circuit. Si ce n'est pas exactement rigoureux, les temps nécessaires aux bascules pour changer d'état, toujours supérieurs aux temps de propagation des signaux\notecitepage{Tocci}{187} pourront jouer en notre faveur et éviter que, même dans le cas où on a effectivement  $H = \overline{H}$, le circuit recopie directement l'entrée à la sortie.
+On considérera ici que les temps de propagation des signaux sont négligeables, de sorte que les états $H$ et $\overline{H}$ sont identiques en tous points du circuit. Si ce n'est pas exactement rigoureux, les temps nécessaires aux bascules pour changer d'état, toujours supérieurs aux temps de propagation des signaux\notecitationpage{Tocci}{187} pourront jouer en notre faveur et éviter que, même dans le cas où on a effectivement  $H = \overline{H}$, le circuit recopie directement l'entrée à la sortie.
 
 \subsubsection*{Expérimentation}
 
 On conçoit alors un premier montage qui utilise directement cette solution de synchronisation pour la rétroaction des bits $D_0$ et $D_1$. On a alors un additionneur pour chaque bit (et on ne s'intéresse pas à la porte ET qui amène au calcul de $D_2$. Le détail du schéma logique est reporté en annexe \ref{incrementation}. Comme l'addition est effectuée sur chaque bit en un temps d'horloge, on incrémente effectivement le compteur d'une unité par cycle d'horloge : c'est le résultat attendu.\\
-Cependant, on peut directement simplifier le montage avant de le réaliser : la porte OU EXLUSIF de l'additionneur du bit $D_0$ avec une entrée à $1$ est simplifiable en NON, on se retrouve alors avec une double inversion que l'on peut supprimer. Une inversion simple du bit $D_0$ peut directement être obtenue avec la sortie $\overline{Q}$ de la dernière bascule. De même, la porte ET de l'additionneur du bit $D_0$ avec une entrée à $1$ recopie l'entrée et peut-être supprimée. On peut formellement démontrer ces simplifications dans l'algèbre booléenne en utilisant des méthodes systématiques telles que les diagrammes de Karanaugh\notecitepage{Tocci}{108}. Le détail du schéma logique simplifié est détaillé en annexe \ref{incrementation-simplifie}.\\
+Cependant, on peut directement simplifier le montage avant de le réaliser : la porte OU EXLUSIF de l'additionneur du bit $D_0$ avec une entrée à $1$ est simplifiable en NON, on se retrouve alors avec une double inversion que l'on peut supprimer. Une inversion simple du bit $D_0$ peut directement être obtenue avec la sortie $\overline{Q}$ de la dernière bascule. De même, la porte ET de l'additionneur du bit $D_0$ avec une entrée à $1$ recopie l'entrée et peut-être supprimée. On peut formellement démontrer ces simplifications dans l'algèbre booléenne en utilisant des méthodes systématiques telles que les diagrammes de Karanaugh\notecitationpage{Tocci}{108}. Le détail du schéma logique simplifié est détaillé en annexe \ref{incrementation-simplifie}.\\
 
-Dans un premier temps, le circuit a été mis en œuvre en réalisant les portes logiques à l'aide de composants électroniques fondamentaux tels que les résistances, diodes et transistors (on parle de logique DTL\notetrad{Diode-Transistor Logic}{logique diode-transistor}). Vu la quantité de composants nécessaires et la place requise, seul l'étage d'addition du bit $D_0$ a été réalisé, qui permet de valider la solution de synchronisation. Par ailleurs, cette expérience a été réalisée alors qu'aucun circuit de génération d'horloge n'était disponible : l'horloge a donc été émulée par un bouton poussoir relié à un état logique haut. La sortie est représentée par une LED, allumée pour signifier un état haut et éteinte pour un état bas. Une photographie du montage réalisé est reportée en annexe \ref{compteur-experimental}.\\
+Dans un premier temps, le circuit a été mis en œuvre en réalisant les portes logiques à l'aide de composants électroniques fondamentaux tels que les résistances, diodes et transistors (on parle de logique DTL\notetraduction{Diode-Transistor Logic}{logique diode-transistor}). Vu la quantité de composants nécessaires et la place requise, seul l'étage d'addition du bit $D_0$ a été réalisé, qui permet de valider la solution de synchronisation. Par ailleurs, cette expérience a été réalisée alors qu'aucun circuit de génération d'horloge n'était disponible : l'horloge a donc été émulée par un bouton poussoir relié à un état logique haut. La sortie est représentée par une LED, allumée pour signifier un état haut et éteinte pour un état bas. Une photographie du montage réalisé est reportée en annexe \ref{compteur-experimental}.\\
 
 Les premiers résultats indiquent que le circuit se comporte comme prévu, mais présente sporadiquement une anomalie : la LED clignote très rapidement à l'appui ou au relâchement du bouton et indique l'état inverse à l'état attendu. Afin d'étudier le problème, on utilise un analyseur logique qui va enregistrer l'état de plusieurs points du circuit ($H, \overline{H}, Q,\overline{Q}, D_0, \overline{D_0}$)\footnote{$Q$ représente la sortie de la première bascule du circuit de synchronisation.} à une fréquence maximum de $24$ MHz. On effectue la capture en utilisant le logiciel \bsc{PulseView}, faisant partie de la suite d'outils libres \bsc{Sigrok}. Le chronogramme obtenu est reporté en annexe \ref{chronogramme-compteur} et on y observe l'anomalie après $1800$ ms. Un agrandissement de la zone en question, reporté en annexe \ref{chronogramme-compteur-bouton} permet de constater de très rapides oscillations du signal d'horloge : la partie logique du circuit se comporte finalement correctement, mais en des temps trop courts pour que l'on puisse l'observer. On émet l'hypothèse que cette gigue\footnote{Il s'agit d'une fluctuation parasite rapide du signal.} est le résultat d'un phénomène d'oscillation mécanique lié au bouton poussoir, ce qui sera jugé comme vraisemblable par M. Lebret, professeur d'électronique à l'ENSEIRB-MATMECA. Il s'agit du phénomène de rebonds mécaniques, très courant lorsque l'on utilise de tels boutons.
 
@@ -270,7 +270,7 @@ Une fois le multivibrateur astable à transistors réalisé, il a été possible
 \subsection{Composants actuels, état de l'art et évolution des montages}
 \label{composants-actuels}
 
-Dans l'état de l'art actuel\notecitepage{Tocci}{199}, la manière la plus directe de réaliser un compteur sur un bit consiste à utiliser une bascule synchronisée sur front d'horloge et dont la valeur de sortie s'inverse à chaque cycle. On souhaitera par exemple synchroniser sur le front descendant de l'horloge de sorte que le décompte du premier bit soit effectif un cycle d'horloge après la mise sous tension du système, si on considère que l'horloge démarre avec un état bas (si ce n'est pas le cas, on pourra encore une fois inverser sa sortie).\\
+Dans l'état de l'art actuel\notecitationpage{Tocci}{199}, la manière la plus directe de réaliser un compteur sur un bit consiste à utiliser une bascule synchronisée sur front d'horloge et dont la valeur de sortie s'inverse à chaque cycle. On souhaitera par exemple synchroniser sur le front descendant de l'horloge de sorte que le décompte du premier bit soit effectif un cycle d'horloge après la mise sous tension du système, si on considère que l'horloge démarre avec un état bas (si ce n'est pas le cas, on pourra encore une fois inverser sa sortie).\\
 
 C'est bien là le cœur du système que l'on a réalisé : il apparaît bien (en particulier dans le schéma simplifié donné en annexe \ref{incrementation-simplifie} et dans le chronogramme en annexe \ref{chronogramme-compteur-fonctionne}) que le bit $D_0$ est inversé à chaque cycle d'horloge. On remarque alors que le compteur a pour effet de diviser par deux la fréquence de l'horloge pour le premier bit, générant donc une horloge secondaire de rapport cyclique toujours égal à $\frac12$, vu que la fréquence de l'horloge initiale est constante.\\
 
@@ -282,7 +282,7 @@ Ainsi, on pourra réaliser simplement un compteur sur $n$ bits en utilisant $n$
 
 On peut appliquer la même logique au montage de synchronisation que nous avons réalisé : on obtient alors le schéma reporté en annexe \ref{incrementation-final-nor}. On peut réaliser le même circuit en utilisant uniquement des portes NON-ET (il faut alors remplacer les portes ET par des portes NON-ET vu que les bascules à base de NON-ET sont à état logique bas actif) : on obtient le schéma reporté en annexe \ref{incrementation-final-nand}.\\
 
-On réalise ce montage fondamental $n$ fois pour $n$ bits en utilisant des portes NON-ET, qui sont disponibles en grande quantité et à faible coût (le composant TTL très répandu \emph{7400} de \bsc{Texas Instruments}\notecite{Wikipedia7400} comporte 4 portes NON-ET en un seul circuit intégré). Un photographie du montage réalisée est reportée en annexe \ref{compteur-final}.
+On réalise ce montage fondamental $n$ fois pour $n$ bits en utilisant des portes NON-ET, qui sont disponibles en grande quantité et à faible coût (le composant TTL très répandu \emph{7400} de \bsc{Texas Instruments}\notecitation{Wikipedia7400} comporte 4 portes NON-ET en un seul circuit intégré). Un photographie du montage réalisée est reportée en annexe \ref{compteur-final}.
 
 \section{Système complet modulable}
 
index 2b2d60e..d4df1a8 100644 (file)
@@ -10,7 +10,7 @@ Il s'agit d'expliciter les procédés par lesquels deux systèmes informatiques
 \subsection{Concepts et définitions}
 \label{echanges-concepts-definitions}
 
-On considère deux systèmes informatiques physiquement distincts : on parle de puces ou de circuits intégrés. Il s'agit fondamentalement de circuits logiques. On distinguera les circuits intégrés dont le mode de fonctionnement est unique, on parle alors d'ASIC\notetrad{Application-specific integrated circuit}{circuit intégré propre à une application}, des circuits que l'on peut programmer au travers d'un jeu d'instructions qui traduit les diverses opérations offertes par le circuit, on parle alors de microprocesseur\footnote{On distingue le microprocesseur du processeur (plus générique) : le microprocesseur est un processeur construit en un seul circuit intégré.}. C'est la composition d'un microprocesseur avec un certain nombre d'éléments externes tels que différents types de mémoire, diverses entrées/sorties, des circuits de contrôle de l'alimentation électrique, etc, que l'on appellera un ordinateur. Quand la plupart des éléments essentiels d'un ordinateur sont rassemblés en un seul circuit intégré, on parle alors de microcontrôleur.\\
+On considère deux systèmes informatiques physiquement distincts : on parle de puces ou de circuits intégrés. Il s'agit fondamentalement de circuits logiques. On distinguera les circuits intégrés dont le mode de fonctionnement est unique, on parle alors d'ASIC\notetraduction{Application-specific integrated circuit}{circuit intégré propre à une application}, des circuits que l'on peut programmer au travers d'un jeu d'instructions qui traduit les diverses opérations offertes par le circuit, on parle alors de microprocesseur\footnote{On distingue le microprocesseur du processeur (plus générique) : le microprocesseur est un processeur construit en un seul circuit intégré.}. C'est la composition d'un microprocesseur avec un certain nombre d'éléments externes tels que différents types de mémoire, diverses entrées/sorties, des circuits de contrôle de l'alimentation électrique, etc, que l'on appellera un ordinateur. Quand la plupart des éléments essentiels d'un ordinateur sont rassemblés en un seul circuit intégré, on parle alors de microcontrôleur.\\
 
 De la même façon qu'il est nécessaire de synchroniser certains types de circuits logiques (en particulier lorsque le système dépend de son état précédent), les microprocesseurs sont synchronisés avec un signal d'horloge. Par abus de langage, on parlera de fréquence du microprocesseur pour parler de la fréquence de l'horloge de synchronisation des opérations.\\
 
@@ -21,7 +21,7 @@ De la même façon qu'il est nécessaire de synchroniser certains types de circu
 \label{cubieboard-photo}
 \end{figure}
 
-La carte Cubieboard2\notecite{Cubieboard} est un exemple particulier d'ordinateur complet. On retrouve en effet tous les composants constituants un ordinateur sur une carte de petite taille : on parle d'ordinateur à carte unique, de l'Anglais \emph{Single Board Computer}, parfois abrégé par ses initiales : \emph{SBC}. Le processeur de l'ordinateur est intégré au sein d'une puce de type SoC\notetrad{System on a Chip}{système sur une puce} : il s'agit d'un seul circuit intégré rassemblant, en plus du processeur principal, un certain nombre d'autres composants utiles tels que diverses entrées/sorties, des processeurs auxiliaires, etc. Pour autant, il ne contient pas la mémoire principale de l'ordinateur : il ne s'agit donc pas d'un microcontrôleur. Le SoC utilisé dans la Cubieboard2 est un \emph{A20} produit par la société chinoise \bsc{Allwinner}. Le processeur utilisé dans le \emph{A20} est un \emph{Cortex A7}, qui utilise un jeu d'instructions \bsc{ARM} et opère avec un fréquence d'horloge de $1$ GHz.\\
+La carte Cubieboard2\notecitation{Cubieboard} est un exemple particulier d'ordinateur complet. On retrouve en effet tous les composants constituants un ordinateur sur une carte de petite taille : on parle d'ordinateur à carte unique, de l'Anglais \emph{Single Board Computer}, parfois abrégé par ses initiales : \emph{SBC}. Le processeur de l'ordinateur est intégré au sein d'une puce de type SoC\notetraduction{System on a Chip}{système sur une puce} : il s'agit d'un seul circuit intégré rassemblant, en plus du processeur principal, un certain nombre d'autres composants utiles tels que diverses entrées/sorties, des processeurs auxiliaires, etc. Pour autant, il ne contient pas la mémoire principale de l'ordinateur : il ne s'agit donc pas d'un microcontrôleur. Le SoC utilisé dans la Cubieboard2 est un \emph{A20} produit par la société chinoise \bsc{Allwinner}. Le processeur utilisé dans le \emph{A20} est un \emph{Cortex A7}, qui utilise un jeu d'instructions \bsc{ARM} et opère avec un fréquence d'horloge de $1$ GHz.\\
 
 \begin{figure}[!h]
 \centering
@@ -30,7 +30,7 @@ La carte Cubieboard2\notecite{Cubieboard} est un exemple particulier d'ordinateu
 \label{arduino-photo}
 \end{figure}
 
-Quant aux microcontrôleurs, on pourra s'intéresser à la carte Arduino\notecite{Arduino} Uno : il s'agit également d'une carte au format réduit, contenant un microcontrôleur. Le microcontrôleur en question est un \emph{ATmega328p} de la société \bsc{Atmel} et son processeur utilise un jeu d'instructions \bsc{AVR} et opère avec une fréquence d'horloge de $16$ MHz.\\
+Quant aux microcontrôleurs, on pourra s'intéresser à la carte Arduino\notecitation{Arduino} Uno : il s'agit également d'une carte au format réduit, contenant un microcontrôleur. Le microcontrôleur en question est un \emph{ATmega328p} de la société \bsc{Atmel} et son processeur utilise un jeu d'instructions \bsc{AVR} et opère avec une fréquence d'horloge de $16$ MHz.\\
 
 Ces deux cartes se prêtent particulièrement à l'étude de leur fonctionnement :
 \begin{itemize}
@@ -52,9 +52,9 @@ Si tous les circuits reliés au bus sont en état hi-Z (c'est à dire qu'aucun c
 \subsubsection*{Écrasement, arbitrage et rôles}
 
 Dans le cas où tous les circuits intégrés utilisent la même ligne à la fois pour la lecture et l'écriture, on peu se retrouver dans le cas où deux circuits intégrés cherchent à écrire sur la ligne simultanément : on parle alors d'écrasement des données. C'est une des raisons qui conduit à la nécessité d'attribuer des temps réservés à la lecture et à l'écriture pour chaque puce et donc de synchroniser les communications.\\
-Cependant, il est également possible de mettre en place un arbitrage : les deux circuits doivent alors lire l'état de la ligne après avoir écrit un bit. Si l'état ne correspond pas au bit envoyé, le circuit perd la main et doit cesser d'écrire sur le bus : on dit qu'il a perdu l'arbitrage. Cela n'est possible que quand un état logique a priorité sur l'autre (il s'agit d'une caractéristique du bus) : si un circuit inscrit un état haut alors qu'un autre circuit inscrit simultanément un été bas, la ligne prendra systématiquement l'un des deux états. On qualifie alors cet état de dominant et l'autre état de récessif. Par exemple, pour le bus CAN\notetrad{Controller Area Network}{contrôleur de zone de réseau}, très utilisé dans les automobiles, l'état logique bas est dominant et l'état haut est récessif.\\
+Cependant, il est également possible de mettre en place un arbitrage : les deux circuits doivent alors lire l'état de la ligne après avoir écrit un bit. Si l'état ne correspond pas au bit envoyé, le circuit perd la main et doit cesser d'écrire sur le bus : on dit qu'il a perdu l'arbitrage. Cela n'est possible que quand un état logique a priorité sur l'autre (il s'agit d'une caractéristique du bus) : si un circuit inscrit un état haut alors qu'un autre circuit inscrit simultanément un été bas, la ligne prendra systématiquement l'un des deux états. On qualifie alors cet état de dominant et l'autre état de récessif. Par exemple, pour le bus CAN\notetraduction{Controller Area Network}{contrôleur de zone de réseau}, très utilisé dans les automobiles, l'état logique bas est dominant et l'état haut est récessif.\\
 
-Plutôt que de permettre à tous les circuits intégrés d'écrire en même temps, certains bus attribuent également des rôles, maître ou esclave à chaque circuit. C'est par exemple le case du bus \iic\notetrad{\iic$\mathrm{/IIC\ pour}$ Inter Integrated Circuits}{inter circuits intégrés}, très utilisé pour la communication entre le processeur et les puces dans les ordinateurs. Généralement, le circuit dédié à la gestion de l'\iic\ attaché au processeur (on parle de contrôleur \iic) est maître du bus alors que toutes les autres puces reliées au bus sont esclaves. Dans cette configuration, seul le maître peut commencer à écrire sur le bus et les esclaves ne pourront écrire sur le bus qu'en réponse à une demande du maître.\\
+Plutôt que de permettre à tous les circuits intégrés d'écrire en même temps, certains bus attribuent également des rôles, maître ou esclave à chaque circuit. C'est par exemple le case du bus \iic\notetraduction{\iic$\mathrm{/IIC\ pour}$ Inter Integrated Circuits}{inter circuits intégrés}, très utilisé pour la communication entre le processeur et les puces dans les ordinateurs. Généralement, le circuit dédié à la gestion de l'\iic\ attaché au processeur (on parle de contrôleur \iic) est maître du bus alors que toutes les autres puces reliées au bus sont esclaves. Dans cette configuration, seul le maître peut commencer à écrire sur le bus et les esclaves ne pourront écrire sur le bus qu'en réponse à une demande du maître.\\
 
 Quand plusieurs esclaves sont connectés au même bus, des adresses pourront leur être attribuées pour que le maître indique à quel circuit la transaction s'adresse. L'esclave pourra alors confirmer sa présence en écrivant un bit de valeur particulière à un moment donné de l'échange : on parle d'acquittement. La valeur de ce bit sera choisie en fonction du rappel de la ligne : s'il existe une résistance de rappel connectée à l'état logique haut, le bit d'acquittement sera d'état logique bas et réciproquement, de sorte que cette valeur du bit ne soit jamais lue si aucun esclave n'est concerné. Un bit d'acquittement pourra d'ailleurs également être utilisée pour confirmer le bon déroulement d'une action à la fois par le maître et l'esclave concerné au cours de la transaction.
 
@@ -62,7 +62,7 @@ Quand plusieurs esclaves sont connectés au même bus, des adresses pourront leu
 
 Il s'agit bien là de règles formelles qui doivent être respectées par chaque puce utilisant le bus : l'ensemble de ces règles constitue le protocole de communication utilisé sur le bus. En particulier, le protocole va permettre de définir quelle puce peut lire ou écrire à quel moment. Cela n'est cependant possible qu'avec un signal de synchronisation permettant de découper le temps en quantités discrètes : on utilise donc une horloge comme tel signal de synchronisation, qui fait partie intégrante du bus et qui doit être prise en compte par tous les circuits connectés au bus. Par exemple, dans le cas du bus \iic, il n'est permis de changer l'état de la ligne de données que sur un temps bas de l'horloge. Le temps haut est alors réservé à la lecture de l'état du bus (sauf exceptions telles que le signalement d'un début ou d'une fin de transaction). Le protocole définit par ailleurs la signification de la succession des bits envoyés sur le bus, à partir du signalement du début de la transaction. On détaillera en partie ce protocole dans la partie \ref{communication-i2c}.\\
 
-Certains bus n'utilisent cependant pas d'horloge de synchronisation mais une configuration explicite de la vitesse de changement d'état du bus, commune à tous les circuits reliés au bus. La communication sera synchronisée par un bit ou un ensemble de bits donné que le circuit de réception pourra identifier. Des horloges internes aux composants seront de cette manière synchronisées entre elles pour permettre de donner sens à la communication. Ce principe est exploité dans les composants UART\notetrad{Universal Asynchronous Receiver Transmitter}{émetteur-récepteur asynchrone universel}.\\
+Certains bus n'utilisent cependant pas d'horloge de synchronisation mais une configuration explicite de la vitesse de changement d'état du bus, commune à tous les circuits reliés au bus. La communication sera synchronisée par un bit ou un ensemble de bits donné que le circuit de réception pourra identifier. Des horloges internes aux composants seront de cette manière synchronisées entre elles pour permettre de donner sens à la communication. Ce principe est exploité dans les composants UART\notetraduction{Universal Asynchronous Receiver Transmitter}{émetteur-récepteur asynchrone universel}.\\
 
 Il existe donc une grande variété de bus, chacun avec un certain nombre de caractéristiques :
 \begin{itemize}
@@ -76,7 +76,7 @@ Il existe donc une grande variété de bus, chacun avec un certain nombre de car
 \subsection{Communication entre systèmes numériques via le protocole \iic}
 \label{communication-i2c}
 
-Au sein de la Cubieboard2, la communication avec le circuit intégré responsable de la gestion de l'alimentation électrique, le PMIC\notetrad{Power Management Integrated Circuit}{circuit intégré de gestion de l'énergie} \emph{AXP209} est effectuée par un bus \iic. Il s'agit d'un bus aux caractéristiques suivantes :
+Au sein de la Cubieboard2, la communication avec le circuit intégré responsable de la gestion de l'alimentation électrique, le PMIC\notetraduction{Power Management Integrated Circuit}{circuit intégré de gestion de l'énergie} \emph{AXP209} est effectuée par un bus \iic. Il s'agit d'un bus aux caractéristiques suivantes :
 \begin{itemize}
 \item[--] Synchrone, horloge de fréquence quelconque allant jusqu'à 400 kHz
 \item[--] Communication en série
@@ -85,7 +85,7 @@ Au sein de la Cubieboard2, la communication avec le circuit intégré responsabl
 \item[--] Avec résistances de rappel au niveau haut\\
 \end{itemize}
 
-La ligne de données est notée $SDA$ et la ligne d'horloge $SCL$. Le schéma électrique\notecite{CubieboardDiagram} de connexion de l'\emph{AXP209} au SoC est détaillé avec la figure \ref{axp209} :
+La ligne de données est notée $SDA$ et la ligne d'horloge $SCL$. Le schéma électrique\notecitation{CubieboardDiagram} de connexion de l'\emph{AXP209} au SoC est détaillé avec la figure \ref{axp209} :
 
 \begin{figure}[!h]
 \centering
@@ -94,9 +94,9 @@ La ligne de données est notée $SDA$ et la ligne d'horloge $SCL$. Le schéma é
 \label{axp209}
 \end{figure}
 
-On souhaite alors faire communiquer la Cubieboard2 avec le microcontrôleur Arduino, en utilisant le bus et le protocole \iic. La Cubieboard2 dispose de 5 composants\notecite{A20UserManual} dédiés à la gestion du bus \iic\ intégrés au sein de son SoC : il s'agit de contrôleurs \iic\ \bsc{Marvell} \emph{MV64xxx}\notecite{AWIPCores}. L'Arduino ne dispose par contre pas de contrôleur intégré pour l'\iic. Il va s'agir d'implémenter la gestion du protocole \iic\ dans un programme qui sera exécuté sur l'Arduino, en utilisant deux lignes numériques d'entrée/sortie dont dispose le microcontrôleur de l'Arduino : ils'agit de la technique dite de bit banging.\\ Ces lignes d'entrée/sortie se comportent d'après la logique trois états, avec un état haut, un état bas et un état hi-Z qui permettra la lecture. On pourra configurer le mode de chaque ligne avec des instructions. Les entrées/sorties sont plus précisément contrôlées en écrivant à des adresses mémoire précises (on parle de MMIO\notetrad{Memory-Mapped Input/Output}{entrée/sortie cartographiée en mémoire}) plutôt qu'avec des instructions directes pour le processeur (on parle de PIO\notetrad{Programmed Input/Output}{entrée/sortie programmée}).\\
+On souhaite alors faire communiquer la Cubieboard2 avec le microcontrôleur Arduino, en utilisant le bus et le protocole \iic. La Cubieboard2 dispose de 5 composants\notecitation{A20UserManual} dédiés à la gestion du bus \iic\ intégrés au sein de son SoC : il s'agit de contrôleurs \iic\ \bsc{Marvell} \emph{MV64xxx}\notecitation{AWIPCores}. L'Arduino ne dispose par contre pas de contrôleur intégré pour l'\iic. Il va s'agir d'implémenter la gestion du protocole \iic\ dans un programme qui sera exécuté sur l'Arduino, en utilisant deux lignes numériques d'entrée/sortie dont dispose le microcontrôleur de l'Arduino : ils'agit de la technique dite de bit banging.\\ Ces lignes d'entrée/sortie se comportent d'après la logique trois états, avec un état haut, un état bas et un état hi-Z qui permettra la lecture. On pourra configurer le mode de chaque ligne avec des instructions. Les entrées/sorties sont plus précisément contrôlées en écrivant à des adresses mémoire précises (on parle de MMIO\notetraduction{Memory-Mapped Input/Output}{entrée/sortie cartographiée en mémoire}) plutôt qu'avec des instructions directes pour le processeur (on parle de PIO\notetraduction{Programmed Input/Output}{entrée/sortie programmée}).\\
 
-Afin de relier les deux systèmes, on cherchera à connecter deux lignes, entre deux entrées/sorties numériques de l'Arduino et des connecteurs reliés aux points $SDA$ et $SCL$ de la Cubieboard2. Si les entrées/sorties numériques de l'Arduino sont disponibles en grande quantité, seul le contrôleur \iic\ identifié par l'index 1 est accessible par les connecteurs externes de la carte Cubieboard2 (dans la littérature spécifique au SoC \emph{A20}, il est appelé $TWI1$ : la dénomination TWI\notetrad{Two Wire Interface}{interface à deux fils} est équivalente à \iic). On relie alors les connecteurs reliés à $TWI1-SDA$ et $TWI1-SCK$\notecite{linux-sunxi-cubieboard-expansion-ports} aux entrées/sorties numériques de l'Arduino :
+Afin de relier les deux systèmes, on cherchera à connecter deux lignes, entre deux entrées/sorties numériques de l'Arduino et des connecteurs reliés aux points $SDA$ et $SCL$ de la Cubieboard2. Si les entrées/sorties numériques de l'Arduino sont disponibles en grande quantité, seul le contrôleur \iic\ identifié par l'index 1 est accessible par les connecteurs externes de la carte Cubieboard2 (dans la littérature spécifique au SoC \emph{A20}, il est appelé $TWI1$ : la dénomination TWI\notetraduction{Two Wire Interface}{interface à deux fils} est équivalente à \iic). On relie alors les connecteurs reliés à $TWI1-SDA$ et $TWI1-SCK$\notecitation{linux-sunxi-cubieboard-expansion-ports} aux entrées/sorties numériques de l'Arduino :
 
 \begin{figure}[!h]
 \centering
@@ -116,17 +116,17 @@ Afin de réaliser l'expérience, nous avons modifié le code source (écrit en l
 
 \subsubsection*{Réalisation du programme}
 
-Une fois les aspects matériels et logiciels en place, on peut commencer la réalisation du programme propre à l'Arduino. Celui-ci sera réalisé en langage C natif, c'est à dire sans sur-couche propre à l'Arduino. Il existe en effet un IDE\notetrad{Integrated Development Environment}{environnement de développement intégré} propre à l'Arduino, contenant un certain nombre de sur-couches au langage C++ utilisé. Comme notre application est fortement dépendante du temps, on cherchera à écrire du code au plus proche du langage machine afin de ne pas ralentir l'exécution. Le système de compilation sera basé sur de traditionnels $Makefiles$, très couramment utilisés pour le développement au sein de systèmes de type \bsc{Unix}. Le compilateur utilisé est une variante de \bsc{GCC} propre à l'architecture matérielle \bsc{AVR} : \bsc{avr-gcc}. On utilisera une librairie C standard propre à l'\bsc{AVR}, qui fournit également des définitions propres au microcontrôleur : l'\bsc{avr-libc}. De plus, le logiciel sera envoyé sur la carte en utilisant l'utilitaire \bsc{avrdude}. Enfin, on utilisera l'outil de gestion de code source \bsc{git} pour garder trace des modifications. Tous ces logiciels sont des logiciels libres et on donne d'ailleurs comme licence d'utilisation à notre logiciel, astucieusement nommé $ardui2c$, la Licence Publique Générale GNU en version 3 ou plus récente\footnote{Texte complet de la licence : https://www.gnu.org/licenses/gpl.html}, ce qui en fait également un logiciel libre.\\
+Une fois les aspects matériels et logiciels en place, on peut commencer la réalisation du programme propre à l'Arduino. Celui-ci sera réalisé en langage C natif, c'est à dire sans sur-couche propre à l'Arduino. Il existe en effet un IDE\notetraduction{Integrated Development Environment}{environnement de développement intégré} propre à l'Arduino, contenant un certain nombre de sur-couches au langage C++ utilisé. Comme notre application est fortement dépendante du temps, on cherchera à écrire du code au plus proche du langage machine afin de ne pas ralentir l'exécution. Le système de compilation sera basé sur de traditionnels $Makefiles$, très couramment utilisés pour le développement au sein de systèmes de type \bsc{Unix}. Le compilateur utilisé est une variante de \bsc{GCC} propre à l'architecture matérielle \bsc{AVR} : \bsc{avr-gcc}. On utilisera une librairie C standard propre à l'\bsc{AVR}, qui fournit également des définitions propres au microcontrôleur : l'\bsc{avr-libc}. De plus, le logiciel sera envoyé sur la carte en utilisant l'utilitaire \bsc{avrdude}. Enfin, on utilisera l'outil de gestion de code source \bsc{git} pour garder trace des modifications. Tous ces logiciels sont des logiciels libres et on donne d'ailleurs comme licence d'utilisation à notre logiciel, astucieusement nommé $ardui2c$, la Licence Publique Générale GNU en version 3 ou plus récente\footnote{Texte complet de la licence : https://www.gnu.org/licenses/gpl.html}, ce qui en fait également un logiciel libre.\\
 
 Le code source lui-même est rédigé avec une terminologie (noms des fonctions, des variables) en Anglais, afin qu'il soit techniquement compréhensible (et modifiable) par le plus grand nombre, mais on attache tout de même des commentaires en Français, afin de faciliter sa compréhension dans le cadre de notre projet. Afin d'analyser l'exécution étape par étape du programme au cours de son écriture, on cherche à utiliser un dispositif d'entrée/sortie simple à utiliser. L'Arduino dispose d'un contrôleur UART permettant d'envoyer au cours de l'exécution des informations de débogage (typiquement, des chaînes de caractères) à un ordinateur relié à la carte par USB (un convertisseur UART/USB est déjà intégré à la carte Arduino). Cependant, la vitesse de transmission des informations est au maximum de $115200$ bits/s (on parle de bauds), qui n'est pas suffisante pour transmettre suffisamment rapidement ces informations tout en relevant les changements des lignes du bus. En effet, une première expérience montre que le microcontrôleur n'arrive pas à correctement détecter les changements d'états de la ligne d'horloge, qui a une fréquence que l'on a fixée à $50$ kHz, soit $2 * 50 000 = 100 000$ changements d'état logique par seconde. Il est donc évident que cette solution n'est pas utilisable.\\
 
 Pour palier à ce problème, on a utilisé une sortie numérique du microcontrôleur que l'on dédie au débogage ($DEBUG$) et dont on inversera l'état logique à un moment donné de l'exécution du programme (par exemple à la détection d'un événement en particulier). Il s'agit de la fonction $debug$, que l'on appellera avec un test que l'on souhaite vérifier à l'exécution. Certains événements, tels que les conditions de départ ou de fin ont ainsi pu être détectés, mais on remarque un décalage entre la fin des événements et l'apparition du changement sur la ligne de débogage. L'optimisation du code produit lors de la compilation (argument $-Os$ du compilateur \bsc{avr-gcc}) permet de gagner en temps d'exécution (moins d'instructions à exécuter) et donc de rapprocher le changement d'état de la ligne de débogage de l'événement. On utilise encore une fois l'analyseur logique pour relever l'état des lignes $SDA$, $SCL$ et $DEBUG$.\\
 
-Une fois tous les moyens de déterminer l'état du système en place, il a été possible de commencer l'implémentation du protocole \iic\footnote{La compréhension du protocole est basée sur les explications et les exemples de la référence \cite{WikipediaI2C} et des connaissances antérieures.}. On choisit de réaliser le programme sous la forme d'une machine à états\notecite{WikipediaAutomateFini}, avec une variable $state$ décrivant l'état du système. Les différents états possibles sont définis au début du programme et chaque état est décrit dans un commentaire associé. Dans la fonction principale ($main$) du programme, une boucle infinie ($while (1)$) assure l'interprétation du protocole en continu et contient une disjonction des cas sur l'état du système ($switch (state)$) qui attribue à chaque état les actions à réaliser, après avoir lu l'état des lignes du bus et gardé référence de l'état précédent.\\
+Une fois tous les moyens de déterminer l'état du système en place, il a été possible de commencer l'implémentation du protocole \iic\footnote{La compréhension du protocole est basée sur les explications et les exemples de la référence \cite{WikipediaI2C} et des connaissances antérieures.}. On choisit de réaliser le programme sous la forme d'une machine à états\notecitation{WikipediaAutomateFini}, avec une variable $state$ décrivant l'état du système. Les différents états possibles sont définis au début du programme et chaque état est décrit dans un commentaire associé. Dans la fonction principale ($main$) du programme, une boucle infinie ($while (1)$) assure l'interprétation du protocole en continu et contient une disjonction des cas sur l'état du système ($switch (state)$) qui attribue à chaque état les actions à réaliser, après avoir lu l'état des lignes du bus et gardé référence de l'état précédent.\\
 
-Les entrées/sorties sont effectuées par des lectures ou des écritures sur des ports donnés, accessibles par des adresses mémoire. On utilise les opérations booléennes du langage C pour effectuer les actions de lecture et d'écriture de bits aux adresses et aux bits nécessaires, tel qu'indiqué par la documentation du microcontrôleur\notecite{AVRDatasheet} et les déclarations de l'\bsc{avr-libc}. Ainsi, pour forcer l'état logique de la ligne de données, on écrira un bit dont le poids est défini par la définition $PORTB4$ à l'adresse donnée par la définition $PORTB$, soit en C : $PORTB |= (1 << PORTB4)$. Lors de l'implémentation, on fera attention à ne changer l'état du bus de données que sur un temps bas d'horloge et de ne lire l'état logique du bus imposé par le maître que sur un temps haut d'horloge, comme indiqué dans les spécifications du protocole I2C\notecite{WikipediaI2C}.\\
+Les entrées/sorties sont effectuées par des lectures ou des écritures sur des ports donnés, accessibles par des adresses mémoire. On utilise les opérations booléennes du langage C pour effectuer les actions de lecture et d'écriture de bits aux adresses et aux bits nécessaires, tel qu'indiqué par la documentation du microcontrôleur\notecitation{AVRDatasheet} et les déclarations de l'\bsc{avr-libc}. Ainsi, pour forcer l'état logique de la ligne de données, on écrira un bit dont le poids est défini par la définition $PORTB4$ à l'adresse donnée par la définition $PORTB$, soit en C : $PORTB |= (1 << PORTB4)$. Lors de l'implémentation, on fera attention à ne changer l'état du bus de données que sur un temps bas d'horloge et de ne lire l'état logique du bus imposé par le maître que sur un temps haut d'horloge, comme indiqué dans les spécifications du protocole I2C\notecitation{WikipediaI2C}.\\
 
-Avec le protocole \iic, les données de l'esclave sont référencées par des adresses : on parle alors de registres, dont la taille vaut un octet. Le maître pourra lire ou écrire les données d'un registre en spécifiant son adresse. Notre implémentation dispose de $5$ registres, contenant la chaîne de caractères $CPBx$ au format ASCII\notetrad{American Standard Code for Information Interchange}{code américain normalisé pour l'échange d'information} avec un octet final nul pour marquer la fin de la chaîne.\\
+Avec le protocole \iic, les données de l'esclave sont référencées par des adresses : on parle alors de registres, dont la taille vaut un octet. Le maître pourra lire ou écrire les données d'un registre en spécifiant son adresse. Notre implémentation dispose de $5$ registres, contenant la chaîne de caractères $CPBx$ au format ASCII\notetraduction{American Standard Code for Information Interchange}{code américain normalisé pour l'échange d'information} avec un octet final nul pour marquer la fin de la chaîne.\\
 
 L'ensemble du code source ainsi réalisé est reporté en annexe \ref{ardui2c}. Il est également disponible sur Internet\footnote{Le code source d'Ardui2c est disponible à l'adresse : http://git.paulk.fr/gitweb/?p=ardui2c.git;a=summary} au travers du système de gestion de version $git$, qui garde trace des modifications et permet de dupliquer aisément le code source. C'est un outil de gestion de code source aux visées communautaires, initialement développé par \bsc{Linux Torvalds} pour la gestion du code du noyau \bsc{Linux}, dont il est également l'auteur initial.
 
@@ -197,7 +197,7 @@ Cependant, bien qu'un algorithme puisse être perfectible, sa vitesse d’exécu
 \item[--] la période $\tau$ du cycle d'horloge du processeur\\
 \end{itemize}
 
-Le temps d'exécution $T_e$ d'un processus peut ainsi être déterminé grâce à l'équation\notecite{evolution-architecture-ordi} :
+Le temps d'exécution $T_e$ d'un processus peut ainsi être déterminé grâce à l'équation\notecitation{evolution-architecture-ordi} :
 \begin{equation}
 T_e=nc\tau
 \label{eq:tempsexec}
@@ -207,11 +207,11 @@ L'amélioration des performances passe donc nécessairement par un travail sur c
 
 \subsection{Limites à la montée en fréquence et parallélisme}
 
-Si l'augmentation des fréquences en vue d'augmenter les performances d'exécution des programmes a pu porter ses fruits pendant plusieurs années, il devient de plus en plus difficile d'augmenter ces fréquences. Ainsi, à partir des années 2000, il a été nécessaire de s'orienter vers d'autres moyens pour rendre les processeurs plus performants. Les causes de ces limitations à la montée en fréquence sont multiples et la majorité sont liées à des phénomènes physiques\notecitepage{theseLABRI-Perache}{10}, qui posent un certain nombre de problèmes :\\
+Si l'augmentation des fréquences en vue d'augmenter les performances d'exécution des programmes a pu porter ses fruits pendant plusieurs années, il devient de plus en plus difficile d'augmenter ces fréquences. Ainsi, à partir des années 2000, il a été nécessaire de s'orienter vers d'autres moyens pour rendre les processeurs plus performants. Les causes de ces limitations à la montée en fréquence sont multiples et la majorité sont liées à des phénomènes physiques\notecitationpage{theseLABRI-Perache}{10}, qui posent un certain nombre de problèmes :\\
 
 Premièrement, la miniaturisation des transistors amène à la diminution des dimensions des fils d'interconnexion. Or le \emph{temps d'interconnexion}, c'est-à-dire le temps nécessaire pour que l'information transite d'un transistor à un autre, reste globalement constant. Malgré la finesse atteinte dans la gravure des processeurs, il n'est plus possible que l'information se propage dans les circuits en un temps imposé par de très hautes fréquences. En effet, ce temps est directement fonction de la vitesse physique de propagation du signal électrique et de la distance à parcourir ($v = \frac{d}{t}$), l'une étant constante et l'autre ayant atteint ses limites.\\
 
-Le second problème est d'ordre énergétique, en effet un transistor consomme de l'énergie (et en dissipe) à chaque commutation : ainsi on peut facilement voir que la consommation électrique et la dissipation d'énergie sont proportionnelles aux produit du nombre de transistor dans le circuit par la fréquence de l'horloge. Avec de très hautes fréquences, les processeurs sont gourmands en énergie et en dissipent beaucoup sous forme de chaleur : ils s'échauffent et il est de plus en plus complexe de les refroidir (nécessaire pour éviter la fusion des matériaux). Les systèmes de refroidissement à air utilisés dans les ordinateurs personnels ne suffisent plus (c'est d'ailleurs ce-qui provoqué l'arrêt\notecite{wikipedia-pentium4} de la famille des \emph{Pentium 4} d'\bsc{Intel}), même si l'efficacité énergétique des processeurs n'a cessé d'augmenter : c'est la \emph{loi de Kommey}.\\
+Le second problème est d'ordre énergétique, en effet un transistor consomme de l'énergie (et en dissipe) à chaque commutation : ainsi on peut facilement voir que la consommation électrique et la dissipation d'énergie sont proportionnelles aux produit du nombre de transistor dans le circuit par la fréquence de l'horloge. Avec de très hautes fréquences, les processeurs sont gourmands en énergie et en dissipent beaucoup sous forme de chaleur : ils s'échauffent et il est de plus en plus complexe de les refroidir (nécessaire pour éviter la fusion des matériaux). Les systèmes de refroidissement à air utilisés dans les ordinateurs personnels ne suffisent plus (c'est d'ailleurs ce-qui provoqué l'arrêt\notecitation{wikipedia-pentium4} de la famille des \emph{Pentium 4} d'\bsc{Intel}), même si l'efficacité énergétique des processeurs n'a cessé d'augmenter : c'est la \emph{loi de Kommey}.\\
 
 Il n'est donc plus possible d'augmenter les fréquences et donc de diminuer le facteur $\tau$ dans l'équation \eqref{eq:tempsexec}. On tentera alors de réduire le nombre $c$ de cycles par instruction. Pour cela, une solution consistera à augmenter le nombre d'instructions qui s'exécutent simultanément : on parle alors de parallélisme. Cette solution n'est effectivement applicable qu'à condition que le processeur soit capable de gérer plusieurs instructions simultanément. Cela implique alors une certaine conception du processeur, avec une duplication des circuits logiques effectuant le traitement de ces instructions : on parle de cœur du processeur. Ainsi, un processeur capable de parallélisme est qualifié de multi-cœur.\\
 
@@ -261,7 +261,7 @@ Exception en point flottant
 
 En effet, cet erreur traduit une division par zéro, effectuée à la ligne 87, même si la valeur $n$ a été vérifiée comme différente de zéro avant cette opération. En effet, comme les deux fils d'exécution sont exécutés en même temps (ou dans le cas d'un processeur à un seul cœur, alternativement, mais le découpage du temps d'exécutions attribué à chaque fil n'est pas prédictible pour le programmeur), il est possible que le second fil d'exécution change la valeur de $n$ entre le test avec zéro et l'exécution effective de l'opération de division. Par exemple, si on a $n=9$ au moment du test, puis que le second fil s'exécute et tire un dixième nombre, réinitialisant $n$ à 0, la division sur le premier fil sera effectuée avec $n = 0$.\\
 
-Afin de palier à ce problème, on introduit la notion de blocage des fils d'exécution. Il s'agit de fonctions de blocage et de déblocage liés à une variable de type mutex\notetrad{Mutual exclusion}{exclusion mutuelle}, définies dans la librairie \bsc{pthread} et qui fonctionnent comme suit\notecite{pthread} :
+Afin de palier à ce problème, on introduit la notion de blocage des fils d'exécution. Il s'agit de fonctions de blocage et de déblocage liés à une variable de type mutex\notetraduction{Mutual exclusion}{exclusion mutuelle}, définies dans la librairie \bsc{pthread} et qui fonctionnent comme suit\notecitation{pthread} :
 \begin{itemize}
 \item[--] Un premier appel à la fonction de blocage $pthread\_mutex\_lock$ passe la variable mutex à un état bloqué et l'exécution du fil d'exécution appelant continue.
 \item[--] Un second appel à la fonction de blocage $pthread\_mutex\_lock$ (avec la variable mutex dans un état bloqué) bloque l'exécution du fil d'exécution appelant.
index 8edfdfd..13a7c91 100644 (file)
@@ -2,49 +2,62 @@
 \usepackage[left=3cm, right=3cm, top=3cm, bottom=3cm]{geometry}
 \usepackage[utf8]{inputenc}
 \usepackage[english,french]{babel}
-\usepackage{graphicx}
-\usepackage{caption}
-\usepackage{subcaption}
 \usepackage{amsmath}
 \usepackage{amssymb}
-\usepackage{refcount}
-\usepackage{calc}
 \usepackage{mathrsfs}
 \usepackage{stmaryrd}
-\usepackage{tikz}
-\usepackage{ccaption}
-\usepackage{fancyhdr}
-\usepackage{xcolor}
-\usepackage{listings}
-\usepackage{pdfpages}
+\usepackage{refcount}
+\usepackage{etoolbox}
+\usepackage{calc}
 \usepackage{titlesec}
-\usepackage{cite}
-\usepackage[backend=biber,style=numeric,sorting=none,language=french]{biblatex}
 \usepackage{titleps}
 \usepackage{appendix}
-\usepackage{etoolbox}
+\usepackage{cite}
+\usepackage[backend=biber,style=numeric,citestyle=numeric,sorting=none]{biblatex}
+\usepackage{caption}
+\usepackage{subcaption}
+\usepackage{graphicx}
+\usepackage{listings}
+\usepackage{xcolor}
+\usepackage{tikz}
+\usepackage{pdfpages}
 
-\newcommand{\derivd}[3][\null]{\frac{{\rm d}^{#1}#2}{{\rm d}#3^{#1}}}
 \newcommand{\R}{\mathbb{R}}
 \newcommand{\e}[1]{\text{e}^{#1}}
 \newcommand{\ohm}{$\mathrm{\Omega}$}
 \newcommand{\microf}{$\mathrm{\mu}$F}
 \newcommand{\iic}{$\mathrm{I^2C}$}
+\newcommand{\deriveedroite}[3][\null]{\frac{{\rm d}^{#1}#2}{{\rm d}#3^{#1}}}
 \newcommand{\siecle}[1]{\MakeUppercase{\romannumeral #1}\textsuperscript{e}~siècle}
-%\newcommand{\notecite}[1]{\footnote{\label{#1-\thepage}Voir la référence \cite{#1}.}}
-\newcommand{\notecite}[1]{\footnote{Enculé de ta race #1 !}}
-\newcommand{\noteciteagain}[1]{\footnotemark[\getrefnumber{#1-\thepage}]}
-\newcommand{\notecitepage}[2]{\footnote{\label{#1-#2-\thepage}Voir en page #2 de la référence \cite{#1}.}}
-\newcommand{\notecitepageagain}[2]{\footnotemark[\getrefnumber{#1-#2-\thepage}]}
+\newcommand{\notecitation}[1]{\footnote{\label{#1-\thepage}Voir la référence \cite{#1}.}}
+\newcommand{\notecitationencore}[1]{\footnotemark[\getrefnumber{#1-\thepage}]}
+\newcommand{\notecitationpage}[2]{\footnote{\label{#1-#2-\thepage}Voir en page #2 de la référence \cite{#1}.}}
+\newcommand{\notecitationpageencore}[2]{\footnotemark[\getrefnumber{#1-#2-\thepage}]}
 \newcommand{\notepartie}[1]{\footnote{\label{#1-\thepage}Cette notion sera détaillée dans la partie \ref{#1} en page \pageref{#1}.}}
-\newcommand{\notetrad}[2]{\footnote{\textit{#1} en Anglais, soit #2 en Français.}}
+\newcommand{\notetraduction}[2]{\footnote{\textit{#1} en Anglais, soit #2 en Français.}}
 
-\captiondelim{~--~}
 \renewcommand{\figurename}{\textbf{Figure}}
 \renewcommand{\arraystretch}{1.3}
 
+\titleformat{\chapter}{\bfseries\huge\centering}{\thechapter}{3ex}{}
+\titlespacing{\chapter}{}{0em}{2em}
+
+\newpagestyle{redaction}{
+\setheadrule{0.5pt}
+\sethead{\chaptertitle}{}{\thesubsection}
+\setfoot{}{\thepage}{}
+}
+
+\newpagestyle{annexes}{
+\titleformat{\chapter}{\bfseries\Large}{\appendixname\ \thechapter}{3ex}{}
+\titlespacing{\chapter}{}{0em}{2em}
+}
+
 \interfootnotelinepenalty=10000
 
+\addbibresource{references.bib}
+\defbibheading{typereference}{\section*{#1}}
+
 \graphicspath{{images/}}
 
 \lstset{language=C, numbers=left, basicstyle=\small, frame=lines, tabsize=2, breaklines=true, aboveskip=0.5cm, belowskip=0.5cm}
 {Î}{{\^{I}}}1
 }
 
-\addbibresource{references.bib}
-\defbibheading{typereference}{\section*{#1}}
-
-\titleformat{\chapter}{\bfseries\huge\centering}{\thechapter}{3ex}{}
-\titlespacing{\chapter}{}{0em}{2em}
-
-\newpagestyle{redaction}{
-\setheadrule{0.5pt}
-\sethead{\chaptertitle}{}{\thesubsection}
-\setfoot{}{\thepage}{}
-}
-
-\newpagestyle{annexes}{
-\titleformat{\chapter}{\bfseries\Large}{\appendixname\ \thechapter}{3ex}{}
-\titlespacing{\chapter}{}{0em}{2em}
-}
-
-\begin{document}
 \title{\bsc{Représentation et utilisation du temps dans les systèmes électroniques numériques}}
 \author{Paul Kocialkowski \and Raphaël Tapia}
 \date{Projet final du Cycle Préparatoire de Bordeaux, 2015}
-~
-\vfill
+
+\begin{document}
+\pagestyle{empty}
+~\vfill
 
 \begin{center}
 \begin{minipage}{\textwidth}
@@ -113,7 +110,6 @@ Encadré par Patrice Tesson
 \pagebreak
 
 \setcounter{page}{1}
-\thispagestyle{empty}
 
 \strut
 
index b157077..4285f32 100644 (file)
@@ -56,23 +56,23 @@ $$U = R \cdot I$$
 En réalité la grandeur $R$ se retrouve dans de nombreux autres composants réels, qui possèdent une résistance interne dépendante des matériaux utilisés. $R$ peut être intuitivement visualisée comme une grandeur qui représente la \emph{répugnance} d'un milieu conducteur à faire passer un courant.\\
 
 La bobine fait partie des composants dont le fonctionnement est directement dépendant du temps. Il s'agit d'un dipôle composé d'un fil conducteur enroulé en un grand nombre de spires, souvent autour d'un matériau ferromagnétique (de façon à en augmenter l'effet). Elle fonctionne sur le principe de l'auto-induction : la variation temporelle du flux magnétique, engendré par le courant qui y circule, à travers ses spires entraîne un courant induit qui s'oppose au courant initial. La grandeur $L$ (s'exprime en H : Henry) qui est un coefficient caractérisant l'ampleur de cet effet est appelée \emph{inductance} et elle apparaît dans la loi de comportement de cet élément :
-$$ u=L\derivd[]{i}{t} $$
+$$ u=L\deriveedroite[]{i}{t} $$
 
 Ici $u$ est la tension aux bornes de la bobine et $i$ le courant qui la traverse. Le solénoïde est généralement appelé \emph{inductance} par métonymie avec la grandeur $L$ qui le caractérise.\\
 
 Le condensateur fonctionne également sur un principe lié au temps. Ce dipôle est composé de deux plaques conductrices placées en regard et séparées par un isolant . Lorsqu'une tension est appliquée à ses bornes, les charges électriques s'accumulent sur les plaques, créant un champ électrique en son sein : les plaques portent alors des charges de signes contraires. Le condensateur permet de \og stocker\fg{} un champ électrique et donc une certaine énergie qui pourra être restituée dans le circuit à posteriori. Une fois chargé il ne laisse plus passer le courant. La capacité $C$ (s'exprime en F : Farad) caractérise un condensateur, cette grandeur apparaît dans sa loi de comportement :  
-$$ i=C\derivd[]{u}{t} $$
+$$ i=C\deriveedroite[]{u}{t} $$
 De même $i$ est le courant qui traverse le condensateur et $u$ la tension à ses bornes.
 
 \subsubsection*{Circuits résonants}
 
 Ces trois composants sont souvent utilisés pour créer des circuits à dépendance temporelle : que ce soit pour créer des circuits \emph{résonants} ou des \emph{oscillateurs}. \\
 
-Le principe de fonctionnement des circuits dits résonants\notecite{wikipedia-resonance} repose sur la sensibilité de ces circuits à une ou plusieurs fréquences appliquées au système. Une telle fréquence (dite fréquence fondamentale ou fréquence de résonance propre) appliquée au système va entraîner des oscillations de plus en plus importantes, jusqu'à aboutir à un régime stable dépendant des éléments de dissipation de l'énergie du système (ou jusqu'à sa rupture). En particulier, en électronique, la fréquence en question sera la fréquence d'oscillation des courants et tensions (qui sont alors sinusoïdaux) appliqués pour alimenter le circuit. Une combinaison d'éléments aux lois de comportements dépendantes du temps tels que des condensateurs ou des inductances d'une part et des éléments de dissipation, tels que des résistances d'autre part pourra aboutir à un système possédant une fréquence de résonance propre, notée $f_0$.\\
+Le principe de fonctionnement des circuits dits résonants\notecitation{wikipedia-resonance} repose sur la sensibilité de ces circuits à une ou plusieurs fréquences appliquées au système. Une telle fréquence (dite fréquence fondamentale ou fréquence de résonance propre) appliquée au système va entraîner des oscillations de plus en plus importantes, jusqu'à aboutir à un régime stable dépendant des éléments de dissipation de l'énergie du système (ou jusqu'à sa rupture). En particulier, en électronique, la fréquence en question sera la fréquence d'oscillation des courants et tensions (qui sont alors sinusoïdaux) appliqués pour alimenter le circuit. Une combinaison d'éléments aux lois de comportements dépendantes du temps tels que des condensateurs ou des inductances d'une part et des éléments de dissipation, tels que des résistances d'autre part pourra aboutir à un système possédant une fréquence de résonance propre, notée $f_0$.\\
 
 Ces circuits résonants sont donc alimentés par une source sinusoïdale d'une certaine fréquence et ils pourront être utilisés afin de créer des filtres de fréquences. En effet, lorsque la fréquence d'alimentation est proche de $f_0$, l'amplitude du signal de sortie sera bien plus important que pour les autres fréquences : le circuit entre alors en résonance. On peut généralement définir un intervalle de fréquences autour de $f_0$ pour lequel le signal de sortie aura une amplitude suffisante, c'est-à-dire telle qu'elle ne s'éloigne pas trop d'un niveau souhaité : c'est la \emph{bande passante}. La bande passante dépend des paramètres de chaque circuit et c'est en exploitant les bandes passantes des différents montages qu'on pourra éliminer certaines fréquences indésirables, d'où le nom de filtre.\\
 
-Les filtres les plus simples\notecite{wikipedia-filtre} seront réalisés avec des associations simples de condensateurs, bobines et de résistances. Avec un circuit $RC$ associant en série une résistance et un condensateur, on pourra réaliser un filtre passe-bas (qui filtre les hautes fréquences) ou un filtre passe-haut (qui filtre le basses fréquences). De même, avec un circuit $RLC$ associant en série une résistance, une bobine et un condensateur, on pourra réaliser un filtre passe-bande (laisse passer un intervalle de fréquences).\\
+Les filtres les plus simples\notecitation{wikipedia-filtre} seront réalisés avec des associations simples de condensateurs, bobines et de résistances. Avec un circuit $RC$ associant en série une résistance et un condensateur, on pourra réaliser un filtre passe-bas (qui filtre les hautes fréquences) ou un filtre passe-haut (qui filtre le basses fréquences). De même, avec un circuit $RLC$ associant en série une résistance, une bobine et un condensateur, on pourra réaliser un filtre passe-bande (laisse passer un intervalle de fréquences).\\
 
 \subsubsection*{Oscillateurs}
 
@@ -80,7 +80,7 @@ Pour construire des oscillateurs, c'est à dire des circuits qui génèrent un s
 
 On ne détaillera pas ici le fonctionnement interne des transistors bipolaires, relativement complexe, mais on énoncera l'utilisation que l'on fait des transistors bipolaires NPN pour les applications qui nous intéressent.\\
 
-Le transistor\notecite{wikipedia-transistor} bipolaire NPN présente trois connecteurs ou broches\footnote{Voir le symbole sur la figure \ref{symboles}.}, qui sont appelées base~(B), collecteur~(C) et émetteur~(E) et il peut être utilisé de différentes manières. Dès lors que la tension entre la base et l'émetteur dépasse un seuil de $0,7$ V et qu'un faible courant passe entre la base et l'émetteur, un courant plus important peut circuler entre le collecteur et l'émetteur : on dit que le transistor est passant ou saturé. Quand la tension base-émetteur est inférieure au seuil (sans être nulle), le transistor est en régime linéaire et laisse passer le courant entre le collecteur et l'émetteur proportionnellement au courant qui circule entre la base et l'émetteur : on dit qu'il est utilisé en amplification. Enfin, quand la tension base-émetteur est proche de 0 V, le transistor est dit bloqué : aucun courant ne peut circuler par le jonction collecteur-émetteur. Dans les applications que l'on réalise, on utilise le transistor en fonctionnement passant ou bloqué, c'est à dire comme un interrupteur commandé électriquement. De plus, on cherchera à porter l'émetteur du transistor à la masse de sorte que la tension entre la base et la masse corresponde à la tension base-émetteur, ce qui pourra simplifier la compréhension des montages.\\
+Le transistor\notecitation{wikipedia-transistor} bipolaire NPN présente trois connecteurs ou broches\footnote{Voir le symbole sur la figure \ref{symboles}.}, qui sont appelées base~(B), collecteur~(C) et émetteur~(E) et il peut être utilisé de différentes manières. Dès lors que la tension entre la base et l'émetteur dépasse un seuil de $0,7$ V et qu'un faible courant passe entre la base et l'émetteur, un courant plus important peut circuler entre le collecteur et l'émetteur : on dit que le transistor est passant ou saturé. Quand la tension base-émetteur est inférieure au seuil (sans être nulle), le transistor est en régime linéaire et laisse passer le courant entre le collecteur et l'émetteur proportionnellement au courant qui circule entre la base et l'émetteur : on dit qu'il est utilisé en amplification. Enfin, quand la tension base-émetteur est proche de 0 V, le transistor est dit bloqué : aucun courant ne peut circuler par le jonction collecteur-émetteur. Dans les applications que l'on réalise, on utilise le transistor en fonctionnement passant ou bloqué, c'est à dire comme un interrupteur commandé électriquement. De plus, on cherchera à porter l'émetteur du transistor à la masse de sorte que la tension entre la base et la masse corresponde à la tension base-émetteur, ce qui pourra simplifier la compréhension des montages.\\
 
 Un autre composant fondamental utilise une jonction entre un matériau dopé négativement (N) et un matériau dopé positivement (P) : il s'agit de la diode, dipôle qui ne laisse passer le courant que dans un sens, dès qu'une tension suffisante est appliquée à ses bornes. Cette tension de seuil est généralement de l'ordre de $0,7$ V (mais varie en fonction des matériaux utilisés).\\
 
@@ -124,7 +124,7 @@ où $\vec{n}(M)$ est un vecteur unitaire normal à la surface au point $M$.\\
 \end{figure}\\
 
 La variation de $\Phi_B$ crée un champ électromoteur $e$ dans le circuit $\mathcal{C}$ dont la valeur est donnée par la \emph{loi de Faraday} :
-$$e=-\derivd{\Phi_B}{t}$$
+$$e=-\deriveedroite{\Phi_B}{t}$$
 
 La variation de $\Phi_B$ dans le temps peut provenir directement de la variation temporelle du champ magnétique $\vec{B}$ ou d'un déplacement relatif du circuit par rapport au champ $\vec{B}$ variable dans l'espace (ou des deux effets couplés). \\
 
@@ -151,9 +151,9 @@ Ce type de circuit permet donc de générer un signal sinusoïdal par conversion
 
 \subsubsection*{Oscillateurs harmoniques}
 
-La seconde catégorie de générateurs énoncée précédemment repose sur l'utilisation de certains oscillateurs\notecite{wikipedia-oscillateur-electronique} dits \emph{harmoniques} pour générer une tension sinusoïdale à partir d'une tension continue. Ce sont des montages électroniques qui produisent en général un signal dit quasi-sinusoïdal (quelque peu déformé), car il est en pratique très compliqué d'obtenir un signal parfaitement sinusoïdal. On s'intéresse aux oscillateurs auto-entretenus, c'est-à-dire qui ne nécessitent pas de signal périodique extérieur en entrée pour générer une sortie périodique. De tels circuits sont instables : c'est ce qui permet la génération d'oscillations.\\
+La seconde catégorie de générateurs énoncée précédemment repose sur l'utilisation de certains oscillateurs\notecitation{wikipedia-oscillateur-electronique} dits \emph{harmoniques} pour générer une tension sinusoïdale à partir d'une tension continue. Ce sont des montages électroniques qui produisent en général un signal dit quasi-sinusoïdal (quelque peu déformé), car il est en pratique très compliqué d'obtenir un signal parfaitement sinusoïdal. On s'intéresse aux oscillateurs auto-entretenus, c'est-à-dire qui ne nécessitent pas de signal périodique extérieur en entrée pour générer une sortie périodique. De tels circuits sont instables : c'est ce qui permet la génération d'oscillations.\\
 
-Ces oscillateurs peuvent-être modélisés à l'aide de différentes parties fonctionnelles\notecite{coursPSI} qui les composent : une partie instable qui instaure l'oscillation (génération sous la forme d'une porte logique inverseuse\notepartie{portes-logiques}), une partie amplificatrice et une partie filtrage qui sont bouclées l'une avec l'autre. La fréquence recherchée du signal doit être sélectionnée grâce à un filtre passif (partie de filtrage), cependant celui-ci comporte généralement des éléments résistifs qui entraînent une dissipation d'énergie trop importante et donc une atténuation du signal. On a donc besoin de connecter la sortie du filtre à l'élément amplificateur qui compense les pertes énergétiques. Réinjecter ce signal « compensé » dans le circuit permet d'entretenir les oscillations\notecite{theseINSA}.\\
+Ces oscillateurs peuvent-être modélisés à l'aide de différentes parties fonctionnelles\notecitation{coursPSI} qui les composent : une partie instable qui instaure l'oscillation (génération sous la forme d'une porte logique inverseuse\notepartie{portes-logiques}), une partie amplificatrice et une partie filtrage qui sont bouclées l'une avec l'autre. La fréquence recherchée du signal doit être sélectionnée grâce à un filtre passif (partie de filtrage), cependant celui-ci comporte généralement des éléments résistifs qui entraînent une dissipation d'énergie trop importante et donc une atténuation du signal. On a donc besoin de connecter la sortie du filtre à l'élément amplificateur qui compense les pertes énergétiques. Réinjecter ce signal « compensé » dans le circuit permet d'entretenir les oscillations\notecitation{theseINSA}.\\
 
 Les oscillateurs à hautes fréquences les plus connus sont : le \emph{Colpitts}, le \emph{Clapp}, le \emph{Hartley} ainsi que l'oscillateur \emph{Pierce}, qui portent les noms de leurs inventeurs. Les trois premiers sont basés sur des circuits résonants constitués de condensateurs et d'inductances, tandis que le dernier est un oscillateur à quartz. Le \emph{Hartley} est proche du \emph{Colpitt} dans son fonctionnement cependant il est peu utilisé. Par ailleurs, le \emph{Clapp} permet d'obtenir des fréquences de l'ordre de quelques gigahertz, avec plus de stabilité que le \emph{Colpitt} (c'est à dire que la fréquence des oscillations varie moins).\\
 
@@ -163,7 +163,7 @@ Les oscillateurs à hautes fréquences les plus connus sont : le \emph{Colpitts}
 \caption{Symbole électrique du quartz}
 \end{figure}
 
-Les oscillateurs à quartz permettent d'obtenir des signaux de fréquences très précises avec peu de variations (et donc une grande stabilité), avec une incertitude relative sur la fréquence de l'ordre de 0,003\%\notecite{oscillateurs-quartz}. On explique brièvement l'utilité d'un quartz dans ces circuits. Il s'agit d'un cristal qui possède des propriétés \emph{piézo-électriques}. L'effet piézo-électrique direct crée une polarisation entre les bornes du quartz sous l'effet d'une contrainte mécanique, tandis que l'effet piézo-électrique inverse crée une déformation du matériau si on lui applique un champ électrique. Ainsi si on applique une tension alternative aux bornes du quartz, il se crée une déformation mécanique qui s'amplifie fortement lorsque la fréquence d'excitation est proche ou égale à la fréquence de résonance du composant. Quand le quartz entre en résonance, les déformations mécaniques sont telles que l'effet piézo-électrique direct se traduit par l'apparition d'un courant bien plus important en intensité que le courant d'excitation. On utilise donc le quartz à l'intérieur d'un circuit oscillant en faisant correspondre les pulsations du circuit oscillant avec la fréquence de résonance du quartz, ce-qui permet d'obtenir un signal de fréquence stable en sortie. La fréquence de résonance du quartz est dépendante de sa constitution et surtout de sa forme. On peut classiquement obtenir des fréquences situées entre quelques dizaines de kHz et quelques dizaines de MHz.\\
+Les oscillateurs à quartz permettent d'obtenir des signaux de fréquences très précises avec peu de variations (et donc une grande stabilité), avec une incertitude relative sur la fréquence de l'ordre de 0,003\%\notecitation{oscillateurs-quartz}. On explique brièvement l'utilité d'un quartz dans ces circuits. Il s'agit d'un cristal qui possède des propriétés \emph{piézo-électriques}. L'effet piézo-électrique direct crée une polarisation entre les bornes du quartz sous l'effet d'une contrainte mécanique, tandis que l'effet piézo-électrique inverse crée une déformation du matériau si on lui applique un champ électrique. Ainsi si on applique une tension alternative aux bornes du quartz, il se crée une déformation mécanique qui s'amplifie fortement lorsque la fréquence d'excitation est proche ou égale à la fréquence de résonance du composant. Quand le quartz entre en résonance, les déformations mécaniques sont telles que l'effet piézo-électrique direct se traduit par l'apparition d'un courant bien plus important en intensité que le courant d'excitation. On utilise donc le quartz à l'intérieur d'un circuit oscillant en faisant correspondre les pulsations du circuit oscillant avec la fréquence de résonance du quartz, ce-qui permet d'obtenir un signal de fréquence stable en sortie. La fréquence de résonance du quartz est dépendante de sa constitution et surtout de sa forme. On peut classiquement obtenir des fréquences situées entre quelques dizaines de kHz et quelques dizaines de MHz.\\
 
 Par rapport aux autres circuits présentés, l'oscillateur à quartz permet d'avoir un signal avec une excellente stabilité de fréquence. Son inconvénient majeur est que la fréquence des oscillations n'est pas ajustable et est invariable pour chaque composant.\\
 
@@ -226,7 +226,7 @@ En effet la durée $T_h$ durant laquelle le signal de sortie est à l'état haut
 
 Un signal périodique carré peut également être généré en utilisant le circuit intégré \emph{NE555} en mode de fonctionnement multivibrateur. Le \emph{NE555} est un circuit inventé dans les années 1970 et qui comporte tous les éléments pour réaliser divers montages à base de temps. Par exemple, on pourra également réaliser un multivibrateur monostable, c'est à dire un circuit qui ne générera qu'une seule impulsion de durée paramétrable, après un courte impulsion sur une entrée de déclenchement.\\
 
-Le \emph{NE555} est composé d'éléments tels que des comparateurs, une bascule RS\notepartie{bascules} ou encore un inverseur. C'est la connexion de ces éléments entre eux, qui est d'une part fixée à l'intérieur du composant et d'autre part configurable au travers des contacts extérieurs du composant qui va permettre différents modes d'utilisation. On s'intéresse à l'utilisation en mode multivibrateur astable, réalisée avec le montage\notecite{wikipedia-ne555} suivant (on ne cherchera pas à détailler le fonctionnement interne du composant qui explique le montage) :
+Le \emph{NE555} est composé d'éléments tels que des comparateurs, une bascule RS\notepartie{bascules} ou encore un inverseur. C'est la connexion de ces éléments entre eux, qui est d'une part fixée à l'intérieur du composant et d'autre part configurable au travers des contacts extérieurs du composant qui va permettre différents modes d'utilisation. On s'intéresse à l'utilisation en mode multivibrateur astable, réalisée avec le montage\notecitation{wikipedia-ne555} suivant (on ne cherchera pas à détailler le fonctionnement interne du composant qui explique le montage) :
 
 \begin{figure}[!h]
 \centering
@@ -234,7 +234,7 @@ Le \emph{NE555} est composé d'éléments tels que des comparateurs, une bascule
 \caption{Schéma du montage du \emph{NE555} en mode multivibrateur}
 \end{figure}
 
-La fréquence d'oscillation $f$ et le rapport cyclique $\alpha$ sont obtenus avec les formules\noteciteagain{wikipedia-ne555} :
+La fréquence d'oscillation $f$ et le rapport cyclique $\alpha$ sont obtenus avec les formules\notecitationencore{wikipedia-ne555} :
 $$f = \frac {1,44} { (R_2 + 2R_1)C_1 }\quad~\quad \alpha = 1 - \frac {R_1} { (R_2 + 2R_1) }$$
 
 On calcule alors l'incertitude relative sur la fréquence $f$ :
@@ -246,7 +246,7 @@ Le condensateur $C_2$ est essentiellement présent pour stabiliser la tension in
 
 \subsection{Étude et réalisation d'un multivibrateur astable}\\
 
-Afin de bien comprendre le principe de fonctionnement de ces différents circuits nous avons réalisé un \emph{multivibrateur astable}. Le montage que nous avons choisi est celui le plus basique pour la compréhension de tels circuits. Il est inspiré du multivibrateur inventé par Abraham et Bloch au début du siècle dernier, considéré comme « l'ancêtre » des générateurs de signaux périodiques carrés\notecitepage{oscillateurs}{15}. Ce multivibrateur est dit \emph{astable} car il ne présente pas d'état stable : il oscille sans cesse entre deux états instables.\\
+Afin de bien comprendre le principe de fonctionnement de ces différents circuits nous avons réalisé un \emph{multivibrateur astable}. Le montage que nous avons choisi est celui le plus basique pour la compréhension de tels circuits. Il est inspiré du multivibrateur inventé par Abraham et Bloch au début du siècle dernier, considéré comme « l'ancêtre » des générateurs de signaux périodiques carrés\notecitationpage{oscillateurs}{15}. Ce multivibrateur est dit \emph{astable} car il ne présente pas d'état stable : il oscille sans cesse entre deux états instables.\\
 
 \subsubsection*{Étude théorique}
 
@@ -276,7 +276,7 @@ Comme on cherche à générer un signal périodique carré, on va également fai
 
 Ces choix sont dépendants des caractéristiques souhaitées pour notre signal périodique et ils seront justifiés \textit{a posteriori}.\\
 
-À la mise sous tension, les deux condensateurs $C_1$ et $C_2$ se chargent rapidement au travers des résistances $R_1$ et $R_4$ respectivement, le circuit étant bien relié à la masse par l'intermédiaire des jonctions base-émetteur des transistors. Ces derniers tendent à saturer et un des deux va saturer avant l'autre, ce qui va permettre de déclencher le mécanisme oscillant\notecite{multivibrateur}. On considère l'origine des temps au moment où ce transistor devient passant et on va faire l'hypothèse que c'est le transistor $Q_1$ est saturé tandis que $Q_2$ est bloquant à $t=0$. Ceci entraîne que $U_{BE_1}=\theta$ et $U_{CE_1}\approx 0$ V (respectivement la tension entre base et émetteur ainsi qu'entre collecteur et émetteur du transistor $Q_1$). À l'instant $t=0$ chaque condensateur possède une certaine charge, ainsi les conditions initiales sont :
+À la mise sous tension, les deux condensateurs $C_1$ et $C_2$ se chargent rapidement au travers des résistances $R_1$ et $R_4$ respectivement, le circuit étant bien relié à la masse par l'intermédiaire des jonctions base-émetteur des transistors. Ces derniers tendent à saturer et un des deux va saturer avant l'autre, ce qui va permettre de déclencher le mécanisme oscillant\notecitation{multivibrateur}. On considère l'origine des temps au moment où ce transistor devient passant et on va faire l'hypothèse que c'est le transistor $Q_1$ est saturé tandis que $Q_2$ est bloquant à $t=0$. Ceci entraîne que $U_{BE_1}=\theta$ et $U_{CE_1}\approx 0$ V (respectivement la tension entre base et émetteur ainsi qu'entre collecteur et émetteur du transistor $Q_1$). À l'instant $t=0$ chaque condensateur possède une certaine charge, ainsi les conditions initiales sont :
 $$\left \{
 \begin{align}
 U_1(t=0) &= V_+-\theta \\
@@ -293,14 +293,14 @@ U_{R_3}(t)-U_{R_4}(t)-U_2(t) &=& 0 \\
 U_{R_2}(t)-U_{R_1}(t)-U_1(t) &=& 0
 \end{eqnarray}
 
-Cependant on sait que $U_{R_3}=V_+-U_{BE_1}=V_+-\theta$. De plus la valeur du courant circulant dans la résistance est $C_2\derivd[]{U_2}{t}(t)$ d'après la loi d'un condensateur idéal, ainsi en utilisant la \emph{loi d'Ohm} : $U_{R_4}(t)=R_4C_2\derivd[]{U_2}{t}(t)$. En reportant dans l'équation \eqref{eq:2} on obtient l'équation différentielle suivante :
-$$U_2(t)+R_4C_2\derivd[]{U_2}{t}(t)=V_+-\theta$$
+Cependant on sait que $U_{R_3}=V_+-U_{BE_1}=V_+-\theta$. De plus la valeur du courant circulant dans la résistance est $C_2\deriveedroite[]{U_2}{t}(t)$ d'après la loi d'un condensateur idéal, ainsi en utilisant la \emph{loi d'Ohm} : $U_{R_4}(t)=R_4C_2\deriveedroite[]{U_2}{t}(t)$. En reportant dans l'équation \eqref{eq:2} on obtient l'équation différentielle suivante :
+$$U_2(t)+R_4C_2\deriveedroite[]{U_2}{t}(t)=V_+-\theta$$
 
 En résolvant cette équation à l'aide des conditions initiales et en posant $\tau_2=R_4C_2$ on obtient l'expression de $U_2$ :
 $$U_2(t)=V_+(1-\e{-\frac{t}{\tau_2}})-\theta$$
 
 En raisonnant de façon similaire sur l'équation \eqref{eq:3} on est amené à résoudre l'équation différentielle suivante :
-$$U_1(t)+R_2C_1\derivd[]{U_1}{t}(t)=-V_+$$
+$$U_1(t)+R_2C_1\deriveedroite[]{U_1}{t}(t)=-V_+$$
 
 Le second membre est issu du fait que $U_{CE_1}=0$ V, en effet de cette façon le point $A$ est relié à la masse, donc $U_{R_1}=V_+$.
 On pose $\tau_1=R_2C_1$ et on résout l'équation à l'aide des conditions initiales :