Le module maître générique est utilisé pour modéliser les deux modules suivants:
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 où 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 à leurs 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 contient un double buffer qui permet de stocker les pixels dès qu’ils 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.
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.
@(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 entrantenb. Le bit 0 du registre de contrôle agit comme un reset synchrone du module
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_len // taille des blocs wishbone (en mots)
) ;remarques:
buff_size est la taille d’un des doubles buffersbuff_size doit être multiple
de 4xburst_lenUn 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.
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éo. 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ée à 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.
@(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 luenb. Le bit 0 du registre de contrôle agit comme un reset synchrone du module
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_len // taille des blocs wishbone (en mots)
) ;remarques:
buff_size est la taille d’un des doubles buffersbuff_size doit être multiple
de 4xburst_len