summaryrefslogtreecommitdiff
path: root/2004/n/fpga/doc/dcd/gpio/gpio.tex
blob: 88ddc00c56e4af7ccf68d7755c70ea004bcf3b2a (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
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
\subsection{Cahier des charges}

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

\begin{itemize}
\item{Bloc de 8 entr�es / sorties}
\item{Chaque fil est configurable soit en entr�e, soit en sortie}
\item{Chaque fil est configurable pour g�n�rer une interruption sur front
montant et / ou front descendant}
\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. La deuxi�me est de permettre 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 d'entr�es / sorties}
\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. Ces interruptions peuvent �tre d�clench�es soit sur front
montant, soit sur front descendant.

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�e en �crivant
dans des registres. 

On remarque que ce module poss�de cinq signaux "chip select" : cs\_reg\_data,
cs\_reg\_direction, cs\_reg\_it\_up\_mask, cs\_reg\_it\_down\_mask et
cs\_read\_output. Le signal cs\_read\_output permet de lire les �tats des 8
broches d'entr�es / sorties. Les autres signaux permettent d'acc�der aux
registres contenant respectivement, le masque des directions, les masques
d'interruptions (font montant et descendant) et les donn�es � mettre sur les
lignes en sorties. 

Ces quatres 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 (AEN, IOR, IOW) 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{L'�criture (signal $R\bar{W}$) : active pour un �tat bas}
\item{Les masques 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
au chronogramme figure \ref{gpio_behav_sim1} page \pageref{gpio_behav_sim1} Ce
chronogramme repr�sente la simulation comportementale du bloc d'entr�es
sorties.


%% TODO : Se d�brouiller pour inclure les DEUX images

% Commande sympas : convert -rotate -90 fichier.tiff fichier.pdf
%% \begin{figure}[htbp]
%% \begin{center}
%\includegraphics[height=\textheight,angle=90]{./gpio/sim/gpio_behav_sim_test.pdf}
%% \includegraphics[height=0.8\textheight,angle=90]{./gpio/sim/gpio_behav_sim_dim.pdf}
%\includegraphics[width=0.7\textwidth,angle=90]{./gpio/sim/gpio_behav_sim1.pdf}
%% \end{center}
%% \label{gpio_behav_sim1}
%% \end{figure}


Dans cet exemple, nous allons configurer puis utiliser le bloc d'entr�es /
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 (clk\_b).

On remarque que sur les entr�es /sorties, on simule le fait d'avoir branch�
des capteurs sur les cinq lignes de poids fort. On voit donc appara�tre sur 
la sortie les valeurs $00001ZZZ$. Cela signifie que l'on laisse les trois pins
de poid faible 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\_b) du bus, on configure le bloc avec les signaux sur le bus
de donn�es.

De la m�me mani�re, on configure ensuite les masques d'interruptions. On
positionne la valeur $11100000$ dans le registre reg\_it\_up et la valeur
$00011000$ dans le registre reg\_it\_down. Dans cette configuration, on vient
d'autoriser les interruptions sur les pins en entr�e du bloc. Les registres
ainsi positionn�s vont donc autoriser le d�clenchement des interruptions des 3
bits de poid fort sur front montant, et des bits 4 et 5 sur front descendant.

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 aux diff�rents
registres. C'est ce que l'on fait. On v�rifie successivement les masques
d'interruptions, le registre de direction puis le registre de donn�es.
Finalement le PC lit 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. Ici, on remarquera que c'est un front
descendant qui g�n�re cette interruption. 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 trois registres de configuration. Un registre contenant un
masque d�terminant la direction de chaque pin et deux registres contenant des
masques d'interruptions. On retrouve bien ces trois 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
d'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. Les deuxi�mes et troisi�mes sont les gestionnaires
d'interruptions qui sont charg�s de g�n�rer les interruptions. On voit que
pour cela ils s'aident des masques d'interruptions "haut" et "bas".

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}

\subsubsection{Les registres : reg\_rw}

Commen�ons par d�crire le fonctionnement du registre synchrone nomm�
\textit{reg\_rw}. Ce registre est un registre 8 bits pas tout � fait standard.
Comme les registres standards, il poss�de une horloge, un signal de
remise-�-z�ro, un signal enable, des entr�es au nombre de 8 et des sorties au
nombre de 8 �galement. Par contre, celui-ci a un signal suppl�mentaire : le
signal Read / Write ($R\bar{W}$). Son entity est donc la suivante :

\begin{itemize}
\item{1 signal d'horloge}
\item{1 signal de remise-�-z�ro}
\item{8 signaux d'entr�e}
\item{8 signaux de sortie}
\item{1 signal enable}
\item{1 signal read / write}
\end{itemize}

L'int�r�t de ce registre par rapport � un registre "normal" est de pouvoir
relire son contenu. Cela est utile dans notre cas puisque durant le
d�veloppement de la carte, nous aurons besoin de pouvoir nous assurer du bon
fonctionnement des diff�rents modules de la carte. L'impl�mentation de ce
registre est particuli�rement adapt�e � notre carte qui communique par bus.

On se rappelera que c'est un registre synchrone. Les op�rations seront donc
effectu�e � la suite d'un front montant. Pour r�sumer son fonctionnement,
voici comment ce registre se comporte :

\begin{itemize}
\item{Si $write$ ($R\overline{W}$ = '0') et $enable$, alors sauvegarde de
l'entr�e et recopie de celle-ci en sortie.}
\item{Si $read$ ($R\overline{W}$ = '1') et $enable$ alors recopie de la
derni�re valeure sauvegard�e sur l'entr�e.}
\item{Si $\overline{enable}$, alors recopie la derni�re valeur sauvegard�e sur
la sortie et positionne l'entr�e en haute imp�dance.}
\end{itemize}

Le code correspondant au registre d�crit pr�c�dement se trouve en
annexe~\ref{sec:reg_rw} page~\pageref{sec:reg_rw}.

\subsubsection{Le bloc trois-�tats : tristate}

Pour la lecture des valeurs sur les entr�es / sorties, un composant nomm�
\textit{tristate} est utilis�. L'entity de ce module est la suivante :

\begin{itemize}
\item{8 signaux d'entr�e}
\item{8 signaux de sortie}
\item{1 signal enable}
\end{itemize}

Ce composant est en fait un module asynchrone 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 (not� 'Z')}
\item{Si enable est � l'�tat bas on recopie les entr�es / sorties sur le bus
de donn�es}
\end{itemize}

Le code correspondant au bloc d�crit pr�c�dement se trouve en
annexe~\ref{sec:tristate} page~\pageref{sec:tristate}.


\subsubsection{Le gestionnaire de direction : gpio\_direction}

Lors de la conception du cahier des charges du bloc du module GPIO, nous
avions bien sp�cifi� le fait que chaque pins devait �tre configurable soit en
entr�e, soit en sortie. C'est le r�le de ce bloc. Son entity est la suivante :

\begin{itemize}
\item{8 signaux d'entr�e}
\item{8 signaux de constituant un masque}
\item{8 signaux de sortie}
\end{itemize}

Celui ci fonctionne donc de la mani�re suivante. Pour ce faire, celui-ci
poss�de deux "bus" de 8 entr�es chacun. Le premier de ces bus est destin� au
masque de direction. Le deuxi�mes bus est destin� aux donn�es.

Le masque est une s�rie de "flags". Si un bit est dans un �tat haut, alors, ce
bit est consid�r� �tre en sortie. Ainsi, pour ce flag � l'�tat haut, on
recopiera sur la sortie le bit du bus de donn�es.

Les pins autre n'�tant pas d�finies comme des sorties par le masque sont
positionn�s dans un �tat haute-imp�dance 'Z'. Le code correspondant au
bloc d�crit pr�c�dement se trouve en annexe~\ref{sec:gpio_direction}
page~\pageref{sec:gpio_direction}.


\subsubsection{La d�tection d'interruptions : gpio\_it\_detect\_up et down}

Le but de ces deux modules est de g�n�rer les interruptions. Le premier est
charg� de g�n�rer une interruptions si il y a un front motant. Le deuxi�me
fait la m�me chose, mais pour les fronts descendants. Les entity de ces deux
blocs sont identiques et sont :

\begin{itemize}
\item{1 signal d'horloge}
\item{1 signal de remise-�-z�ro}
\item{8 signaux d'entr�e}
\item{8 signaux de constituant un masque}
\item{1 signal de sortie (interrupt detected)}
\end{itemize}

Chacune des 8 pins devant �tre configurable pour d�clencher une interruption
ou non, nous avons recours � des masques. Chaque gestionnaire � son propre
masque. De cette mani�re, on peut d�finir les masques de telle mani�re qu'une
pin puisse g�n�rer une interruption, sur front montant, descendant ou sur les
deux.

Le code associ� au gestionnaire d'interruption sur front montant se trouve en
annexe~\ref{sec:gpio_it_detect_up} page~\pageref{sec:gpio_it_detect_up}. Le
code associ� au gestionnaire d'interruption sur front descendant est donn�
annexe~\ref{sec:gpio_it_detect_down} page~\pageref{sec:gpio_it_detect_down}.


\subsubsection{Le module gpio}

Ce bloc est celui dont le comportement aura �t� d�crit pr�c�dement dans les
sections en rapport avec l'architecture physique. On pourra d'ailleurs se
rapporter aux diff�rents sch�mas pr�c�dement vus. Voici l'entity de ce bloc :

\begin{itemize}
\item{1 signal d'horloge}
\item{1 signal d'horloge de bus}
\item{1 signal de remise-�-z�ro}
\item{1 signal read / write}
\item{1 signal d'interruption}
\item{8 signaux associ�s au bus de donn�es}
\item{4 signaux pour acc�der aux diff�rents registres}
\item{1 signal pour lire les valeurs sur les entr�es / sorties}
\end{itemize}

Ce bloc est donc l'assemblage des diff�rents modules qui viennent d'�tre
d�crits. Le listing correspondant � ce module est donn� annexe~\ref{sec:gpio}
page~\pageref{sec:gpio}.


\subsection{R�sultats de synth�se logique}

Ci dessous sont pr�sent�es un r�sum� des informations fournies suite � la
synth�se logique du module.

\lstinputlisting{./gpio/res_gpio.syr}

On peut donc constater que les ressources qui seront utilis�es par un module
gpio adapt�es au FPGA que nous avons choisi, � savoir, un Spartan2 xc2s200
avec un boitier pq208.

En effet, nous avons d�cid� d'avoir 5 modules gpio sur la carte, ce qui
repr�sente 40 pins utilis�es et 5\% des ressources en slices. Ces
caract�ristiques nous conviennent parfaitement.


\subsection{Simulation du bloc et test sur carte}

Voici les r�sultats de la simulation RTL de notre bloc d'entr�es / sorties.

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

On pourra v�rifier que celle-ci est bien conforme aux r�sultats escompt�s en
se reportant � la simulation comportementale.

Apr�s cette synth�se, nous avons programm� une carte de test pour v�rifier
qu'il n'y ai pas d'anomalie et nous avons pu constater que tout se d�roule
comme pr�vu !