Modules wishbone/vidéo

Modules wishbone/vidéo

Le module maître générique est utilisé pour modéliser les deux modules suivants:

  • WbVideoIn : qui récupère le flux vidéo et sauvegarde dans la mémoire du SoC en passant par le bus wishbone.
  • WbVideoOut : qui lit, en passant par le bus wishbone, une image se trouvant en mémoire et génère un flux vidéo en sortie.

Ces deux modules sont maîtres sur le bus mémoire et peuvent ainsi accéder (en lecture ou en écriture) à la mémoire RAM partagée du SoC. Ces deux modules sont des DMAs (Direct Memory Access) spécialisés.

Comme les flux vidéo ont un rythme bien précis, ces deux modules contiennent des tampons (buffers) pour absorber les variations de débit sur le bus wishbone. En effet, comme le bus est partagé entre plusieurs maîtres, il n'y a pas de garantie de disponibilité au moment ou un pixel arrive ou qu'il doit être généré. Sur le bus seul un débit moyen peut être garanti, les tampons servent à absorber les à-coups.

Pour exploiter au mieux le débit disponible, les accès sur le bus se font exclusivement par blocs. La taille des tampons internes est par conséquent multiple de la taille des blocs écrits sur le bus.

Comme ces modules doivent être contrôlables par les processeurs, ils possèdent aussi une interface esclave qui permet d'accéder à leur registres de configuration et de contrôle. En plus pour permettre la synchronisation de l'ensemble, des signaux d'interruption sont générés.

Le module WbVideoIn

La structure et fonctionnement

Le module contient un double buffer qui permet de stocker les pixels dès qu'il arrivent au niveau de l'entrée vidéo. Ces pixels arrivent à la fréquence de l'horloge vidéo. Les signaux accompagnant le flux vidéo permettent de savoir si ces pixels sont valides et de synchroniser l'acquisition sur le début d'une trame.

La figure suivante montre la structure interne de ce module.

Module pour la vidéo entrante

Une fois qu'un buffer est plein, il est écrit sur le bus wishbone par DMA. Les écritures se font par blocs de mots tant que le buffer n'est pas vide.

À la fin de l'écriture d'une image complète, un signal d'interruption est généré. Ce signal passe à 1 durant un cycle de l'horloge wishbone. (Ce signal correspond après l'écriture du dernier bloc de pixels en mémoire)

Un registre de contrôle permet de démarrer l'acquisition et l'enregistrement des pixels.

Les registres accessibles par l'interface esclave:

    @(base + 0) ctrl_reg               // seul le bit 0 est utilisé pour démarrer l'acqisition et les DMA
    @(base + 4) image_address_reg      // Registre contenant l'adresse à laquelle est enregistrée l'image entrante

nb. Le bit 0 du registre de contrôle agit comme un reset synchrone du module

Le constructeur:

         WbVideoIn (
               sc_module_name mod_name , // nom du module SystemC
               uint32_t image_address  , // adresse de l'image est enregistrée (valeur au reset)
               unsigned int buff_size  , // taille du tampon interne (en octets)
               unsigned int burst_size   // taille des blocs wishbone (en mots)
               ) ;

remarques:

  • buff_size est la taille d'un des doubles buffers
  • Les mots faisant 4 octets, buff_size doit être multiple de 4xburst_size

Le module WbVideoOut

La structure et e fonctionnement

Un double buffer permet de stocker les pixels avant de les présenter en sortie.

Le module lit les pixels à partir de la mémoire en passant par le bus wishbone. Les lectures DMA se font par bloc de mots tant que le buffer n'est pas plein. Quand le buffer est plein on passe au buffer suivant seulement s'il est vide.

La figure suivante montre la structure interne de ce module.

Module pour la vidéo sortante

Dès que le premier buffer est plein, le premier pixel est présenté en sortie en même temps que les signaux de synchronisation de la vidé. Les pixels en sortie sont produits à la fréquence de l'horloge vidéo et le buffer est vidé.

Une interruption est généré à la fin de la génération d'une image (à la fin de la zone visible). Ce signal passe à 1 durant un cycle de l'horloge wishbone.

Les registres accessibles par l'interface esclave:

    @(base + 0) ctrl_reg               // seul le bit 0 est utilisé pour démarrer les DMA
                                       // la génération de l'image se faisant une fois le premier
                                       // buffer plein
    @(base + 4) image_address_reg      // Registre contenant l'adresse à laquelle l'image est lue

nb. Le bit 0 du registre de contrôle agit comme un reset synchrone du module

Le constructeur:

         WbVideoOut (
               sc_module_name mod_name , // nom du module SystemC
               uint32_t image_address  , // adresse de l'image est enregistrée (valeur au reset)
               unsigned int buff_size  , // taille du tampon interne (en octets)
               unsigned int burst_size   // taille des blocs wishbone (en mots)
               ) ;

remarques:

  • buff_size est la taille d'un des doubles buffers
  • Les mots faisant 4 octets, buff_size doit être multiple de 4xburst_size