\subsection{Cahier des charges}

Voici les contraintes du bloc de d'entrées / sorties :

\begin{itemize}
\item{Bloc de 8 entrées / sorties}
\item{Chaque fils est configurable soit en entrée, soit en sortie}
\item{Chaque fils est configurable pour générer ou non, une interruption lors
d'un changement d'état}
\item{Un signal de RAZ}
\end{itemize}


% en gros c'est comment est vu le module côté userland.
\subsection{Vue comportementale}

Les blocs d'entrées / sorties ont plusieurs utilités. La première est de
pouvoir brancher des capteurs renvoyant une entrée binaire, par exemple la
sortie d'un comparateur. Ce bloc permettra aussi de commander, des sorties
comme par exemple l'allumage de LEDs. 

Finalement la troisième fonction de ce bloc sera de simuler un bus parallèle.
En effet, l'année dernière, nous utilisions un bus parallèle pour lequel nous
avons développé un certain nombre de cartes. A partir de blocs d'entrées /
sorties, on peut donc réutiliser les modules précédements développés.

On pourra voir la figure \ref{entity_gpio} page
\pageref{entity_gpio} pour avoir une vue globale du module.

\begin{figure}[htbp]
\caption{Entity du bloc de gestion des interruptions}
\begin{center}
\scalebox{0.7}{
\includegraphics {./gpio/images/entity.pdf}
%\includegraphics[width=\textwidth]{./interrupt/images/entity.pdf}
}
\end{center}
\label{entity_gpio}
\end{figure}

Du point de vue comportemental, son fonctionnement est le suivant. Au début,
le PC configure le bloc après avoir envoyé un signal de remise à zéro. Il
commence par configurer les différents fils soit en entrées, soit en sorties.
Ensuite le PC configure quels fils devront générer une interruption. Une fois
cela fait, il peut lire et écrire des données sur les entrées et sorties. La
configuration du bloc gpio est réalisées en écrivant dans des registres. 

On remarque que ce module possède quatres signaux "chip select" :
cs\_reg\_data, cs\_reg\_direction, cs\_reg\_it\_mask et cs\_read\_output.
Le signal cs\_read\_output permet de lire l'états de 8 broches d'entrées /
sorties. Les autres signaux permettent d'accéder aux registres contenant le
masque des directions, le masque d'interruption et les données à mettre sur
les lignes en sorties. 

Ces trois registres ont la particularité de pouvoir être écrit mais aussi lu.
En effet, pour la phase de teste il nous semble utile que les registres
puissent être relus. Ainsi on pourra s'assurer que la configuration est bien
celle désirée. Voici donc les procédures d'écriture et de lecture des
registres.

La procédure d'écriture est la suivante. Tout d'abord, le PC écrit sur le bus
de donnés l'octet lui permettant de configurer tel ou tel registre.
Simultanément, il positionne le signal $R\bar{W}$ en mode écriture (Write).
Finalement, il sélectionne à l'aide d'un des signal CS (Chip select) le
registre dans lequel il veut écrire.

La procédure de lecture s'effectue en positionnant le signal $R\bar{W}$ en
lecture (Read), puis en sélectionnant le chip select du registre auquel on
désire accéder.

Pour résumer, voici quelques informations utiles :
\begin{itemize}
\item{La lecture (signal $R\bar{W}$) : active pour un état haut}
\item{La écriture (signal $R\bar{W}$) : active pour un état bas}
\item{Le masque d'interruptions : interruption active pour un état haut,
	inactive pour un état bas}
\item{Le masque de directions : en sortie pour un état haut, en entrée pour un
	état bas}
\end{itemize}

% Voici un exemple pour illustrer les discours précédents. 

% Ajouter le chronogramme du test des gpio.
% Mettre en R / W_barre. si c'est cela. Ajouter quelle valeur est on a une
% interruption et quelle valeur dis a pas !

% Copier la suite dans le fichier de la gestion des interruptions !
