summaryrefslogtreecommitdiff
path: root/2004/n/fpga/doc/dcd/gpio/gpio.tex
blob: 5437e52325c9b4311b67729f99e234862cec1120 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
\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.6}{
\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�rentes pins du bloc soit en entr�es, soit en
sorties. Ensuite le PC configure quelles pins pourront 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
respectivement, 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 comment se d�roule les proc�dures d'�criture et de lecture dans les
registres. La proc�dure d'�criture est la suivante. Tout d'abord, le module
dirigeant le bloc �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. 

On notera que pour interfacer ce bloc et le bus ISA, il faut un module dont le
r�le sera de convertir les signaux du bus ISA en les signaux $R\bar{W}$ et les
signaux de "chip select" (CS).

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}

\subsection{Exemple d'utilisation du module}

Voici un exemple pour illustrer les discours pr�c�dents. On pourra se reporter
aux chronogrammes de la figure \ref{gpio_behav_simul} page
\pageref{gpio_behav_simul}. Ce chronogramme repr�sente la simulation
comportementale du bloc d'entr�es sorties.


%% TODO : Se d�brouiller pour inclure l'image

% Commande sympas : convert -rotate -90 fichier.tiff fichier.pdf
%\begin{figure}[htbp]
%\begin{center}
%\scalebox{0.6}{
%\includegraphics {./gpio/sim/gpio_behavior_simul.pdf}
%}
%\includegraphics[height=0.7\textwidth,angle=90]{./gpio/sim/gpio_behavior_simul.pdf}
%\end{center}
%\label{gpio_behav_simul}
%\end{figure}

Dans cet exemple, nous allons configurer puis utiliser le bloc d'entr�e /
sorties. La premi�re action � effectuer est une remise-�-z�ro du bloc � l'aide
de son signal reset. C'est ce que l'on remarque lorsque le signal rst est � 1.
Ce signal doit garder un �tat haut durant au moins une pr�riode d'horloge du
bus ISA (clk\_i).

On remarque que sur les entr�es /sorties, on simule le fait d'avoir branch�
des capteurs sur les cinq lignes de poid fort. On voit donc appara�tre sur la
la sortie les valeurs $00001ZZZ$. Cela signifie que l'on laisse les trois pins
de poid fort dans un �tat de haute imp�dance.

Une fois cela fait, on configure alors le bloc. Pour ce faire, l'ordinateur
place tout d'abord sur le bus de donn�es le masque de direction. Dans
l'exemple, le masque est $00000111$, ce qui signifie que l'on d�sire
positionner les 3 pins de poid faible en sorties. On peut alors constater que
les trois pins du bloc qui sont en sortie, prennent la valeur $0$. Cela vient
du fait que lors du reset, on a remis le bloc � z�ro, et par d�faut, les
sorties sont � z�ro d'ou les signaux obtenus.

On remarquera aussi que la ligne $R\bar{W}$ est en �criture. Ainsi, d�s que
la ligne de validation du registre de configuration des directions (ligne chip
select : cs\_reg\_direction ) est � un �tat haut et qu'il y a un front
montant de l'horloge (clk\_i) du bus ISA, on configure le bloc avec les
signaux sur le bus de donn�es.

De la m�me mani�re, on configure ensuite le masque d'interruption pour lequel
on conserve la valeur $11111000$. On remarque que cet octet est le
compl�mentaire du masque de direction. Dans cette configuration, on vient
d'autoriser les interruptions sur les pins en entr�e du bloc. Ainsi, d�s qu'il
y aura un changement d'�tat sur l'une des cinq pins de poid fort, une
interruption sera g�n�r�e.

Ensuite, on transmet au bloc les signaux que l'on d�sire voir sur les lignes
en sortie du bloc. Dans notre cas on transmet $00000001$. Comme seules les
trois pins de poid faible sont en sortie, on recopie en sortie $ZZZZZ001$ sans
tenir compte des bits de poid fort. Comme les "capteurs simul�s" sur les cinq
bits de poid fort g�n�rent les valeurs $00001ZZZ$, on retrouve sur la sortie
un m�lange de ces signaux, d'o� la valeur de $00001001$.

Dans la suite, on se propose de relire les valeurs affect�es. C'est ce que
l'on fait. On v�rifie successivement le masque d'interruption, le registre de
direction puis le registre de donn�es. Finalement le PC veut lire les valeurs
situ�es sur les entr�es sorties, ce qui est r�alis� gr�ce au signal
cs\_read\_output.

On remarquera aussi le signal d'interruption. Celui-ci passe � l'�tat haut
lorsque l'�tat des "capteurs" change. Le bloc d'entr�es /sorties attend alors
que le PC demande � lire les entr�es / sorties pour achever l'interruption.

\subsection{Architecture physique}

Nous allons dans cette partie �tudier plus en d�tails le fonctionnement
interne du module d'entr�es /sorties. On pourra consulter l'architecture
physique sur la figure \ref{archi_gpio} page \pageref{archi_gpio}. 

\begin{figure}[htbp]
\caption{Architecture physique du bloc d'entr�es / sorties}
\begin{center}
%\scalebox{0.7}{\includegraphics {./interrupt/images/archi_phy.pdf}}
\includegraphics[width=\textwidth]{./gpio/images/archi_phy.pdf}
\end{center}
\label{archi_gpio}
\end{figure}

Comme on peut le constater, ce module est relativement simple. On peut le
d�composer en deux parties : la configuration et la lecture / �criture des
entr�es et sorties. Nous commencerons par nous pencher sur la configuration du
bloc.

Nous avons vu pr�c�dement que pour la configuration d'un bloc d'entr�es /
sorties, il y avait deux registres de configuration, un registre contenant un
masque d�terminant la direction de chaque pin et un registre contenant un
masque d'interruption. On retrouve bien ces deux registres sur le sch�ma
directement connect�s au bus de donn�es.

On trouve un troisi�me registre nomm� registre de donn�es. Celui-ci est charg�
de m�moriser les valeurs � mettre sur les pins du bloc qui sont configur�es en
sortie.

Pour revenir aux registres de configuration, ils sont alors connect�s sur deux
autres blocs. Le premier, est le gestionnaire de direction et a pour but de 
recopier les valeurs du registre de donn�es uniquement sur les pins qui sont
configur�es en sorties. Le deuxi�me est le gestionnaire d'interruption qui est
charg� de g�n�rer les interruptions. On voit que pour cela il s'aide du masque
d'interruption.

Finalement, pour la lecture des entr�es / sorties on connecte directement sur
les pins un bloc � trois �tats (�tat bas, �tat haut et haute imp�dance). Ce
bloc d�s qu'on le s�lectionne � l'aide du signal cs\_read\_output recopie les
entr�es sorties sur le bus de donn�es. On notera que ce module, de m�me que les trois registres, sont synchronis�s sur l'horloge du bus ISA.

\subsection{D�composition RTL}


Commen�ons par d�crire le fonctionnement des registres nomm�s

% Reg_rw

% Module haute imp�dance
Pour la lecture des valeurs sur les entr�es / sorties, un composant nomm�
\textit{tristate} est utilis�. Ce composant est en fait un module synchrone
compos� de huits composants trois �tats. Son comportement est donc le suivant :

\begin{itemize}
\item{Si enable (repr�sent� par cs\_read\_output sur le sch�ma) est � un �tat
bas, les sorties sont dans un �tat haute imp�dance}
\item{Si enable est � l'�tat bas on recopie les entr�es / sorties sur le bus
de donn�es}
\end{itemize}

\subsection{Simulation du bloc}