• Aucun résultat trouvé

Bloc de traitements : filtre de détection de contours

L’implémentation d’un seuillage (section 4.3), appliqué au flux, a permis de réaliser une première mise en pratique réelle des concepts présentés précédemment. Toutefois, cette démonstration, de par sa simplicité, ne permet pas de tirer profit de l’ensemble des informations fournies au travers de signaux de contrôle, pour implémenter un traitement complexe sans obligation systématique d’ajout d’une logique dédiée à connaître la position courante dans l’image.

L’algorithme de ce filtre de détection de contours, dont le résultat visuel est représenté sur la figure 4.15, ainsi que les diverses solutions d’implémentation relatives aux multiplieurs, ayant été présentées dans la section 2.6 du chapitre 2, nous allons nous focaliser sur la partie gestion et organisation de la mémorisation des données pour leur utilisation ultérieure.

Dans la figure 1.2, la production du nouveau pixel P1,1, résultat de la convolution par une

Figure4.14 – Résultat de l’application d’un filtre de seuillage en temps-réel sur le flux issu d’un capteur vidéo.

(a) Scéne filmée sans traitement (b) Même scéne que 4.15(a) mais avec application d’un filtre de Sobel directement sur le flux issu de la caméra. Dans cette image, une main, au premier plan, est présente afin de mon- trer, plus finement, le résultat de la détection de contours.

Figure4.15 – Images issues de la caméra Photonfocus : 4.15(a) image non traitée ; 4.15(b) résultat du filtrage de l’image appliquée directement sur le flux avant transfert au processeur.

avant d’avoir réceptionné le pixel P2,2. Une étape de mémorisation des pixels doit être réalisée pour

disposer de ceux-ci lorsque le besoin apparaît. À chaque fin de réception d’une ligne, et pour le traitement de la ligne suivante, il est également nécessaire de réassigner les données stockées : les pixels de la ligne du haut ne sont plus nécessaires, le contenu de la ligne du milieu va être utilisé pour les calculs des Py−1, et la ligne du bas va servir pour les Py,.

4.4.1

Implémentation

Comme présenté, il est nécessaire de mémoriser, pour en disposer par la suite, l’ensemble des données des trois lignes. Plus exactement les pixels des lignes y et y − 1 sont obtenus depuis des BRAMs, pour la dernière ligne (y + 1) les données doivent être à la fois mémorisées dans une BRAM, pour leur usage ultérieur (traitement sur les deux lignes suivantes), et stockées dans un simple registre à décalage disposant deKERNEL_SIZE cases dédiées aux traitements immédiats de la ligne du bas de la matrice de convolution.

4.4.1.1 Stockage des données dans les RAMs

La partie stockage (figure 4.16) repose sur l’utilisation des trois BRAMs en modedual port (accès possible par deuxprocesses en parallèle) avec un mécanisme de tampon circulaire.

Deux RAMs sont utilisées pour la lecture, la troisième pour le stockage. Le rôle de chaque RAM évolue pour chaque nouvelle ligne : pour une ligne y quelconque, une de ces RAMs reçoit les données, à la ligne suivante (y + 1), la même RAM sert de source pour les calculs de la ligne du milieu du noyau et finalement, à la ligne y + 2 cette RAM est utilisée pour la ligne du haut du noyau. Pour la ligne suivante (y + 3), elle est à nouveau utilisée pour le stockage.

Pour réaliser le stockage, le signal d’activation pour l’écriture est connecté à un multiplexeur (bas gauche de la figure 4.16) afin de pouvoir sélectionner, en écriture, seulement une des trois RAMs. Les autres signaux (adresse et données) sont simplement connectés à toutes les BRAMs. Le signal de sélection du multiplexeur évolue lors du passage à l’état haut du signal de fin de ligne, permettant ainsi de basculer séquentiellement d’une RAM à une autre.

4.4.1.2 Récupération des données pour utilisation

Ce traitement est présenté en partie droite de la figure 4.16. Le bus d’adresse est commun d’une part à toutes les RAMs, et d’autre part à la lecture et à l’écriture. Pour l’organisation des données, comme la relation entre une RAM et un des registres à décalage évolue avec le temps et le passage d’une ligne à l’autre, une série de multiplexeurs est connectée sur la sortie des RAMs et piloté par le même compteur que les démultiplexeurs liés au stockage. Deux multiplexeurs sont nécessaires, car comme présenté précédemment, les données nécessaires pour le calcul de la ligne y +1 du noyau sont directement issues de l’entrée du bloc.

4.4.1.3 Intégration dans CoGen

Il existe plusieurs versions de ce bloc, telles que présentées dans la section 2.6. Ici, nous al- lons uniquement présenter la première version qui fait usage de blocs DSP48, avec un noyau de convolution de 3 × 3.

La description, présentée en 4.17, indique que l’implémentation nécessite 9 DSP48 et 3 RAMs. Le bloc est capable de recevoir des données à chaque cycle, ne modifie pas les dimensions du flux

rst clk datab addrb wra_en dataa addra rst clk datab addrb wra_en dataa addra rst clk datab addrb wra_en dataa addra 10 01 00 10 01 10 01 rst clk Q CE D

+

1

+

00 00 pixel_valid_i pixel_data_i 1 rst clk Q CE D end_of_line cpt cpt cpt cpt end_of_frame_i

Figure 4.16 – Schéma de l’implémentation du stockage des données dans des BRAMs avec un principe de tampon rotatif pour l’écriture (partie gauche) et la lecture (partie droite). La sortie de l’accumulateur en bas à gauche (signal cpt) est utilisé comme contrôle pour l’écriture dans une RAM particulière et pour le lien entre chaque RAM et les multiplications. Sa valeur évolue à chaque fin de ligne.

et nécessite, en plus de la latence propre au traitement, un délai équivalent à 2 lignes complètes et 2 pixels.

4.5

Caractérisation des modes propres d’un diapason par mé-