Changes between Version 16 and Version 17 of MjpegCourse/Coproc


Ignore:
Timestamp:
Mar 6, 2007, 6:58:52 PM (17 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • MjpegCourse/Coproc

    v16 v17  
    8787== mettre ici le dessin contenant le threader ==
    8888
    89 Pour utiliser un tel coprocesseur ''virtuel'', il faut modifier deux choses dans la description DSX:
    90  * dans la définition du modèle de la tâche {{{idct}}}, il faut ajouter l'implémentation `SyntheticTask()`
     89Pour utiliser un tel coprocesseur ''virtuel'', il faut modifier trois choses dans la description DSX:
     90 * dans la définition du modèle de la tâche {{{idct}}}, il faut ajouter l'implémentation `SyntheticTask()`. Le coprocesseur matériel étant paramètrable, ill faut également définir un nouveau paramètre `EXEC_TIME` dans la liste des paramètres de la tâche {{{idct}}}. Ce paramètre permet de spécifier le nombre de cycles utilisés par le coprocesseur matériel pour effectuer la transformation IDCT d'un bloc de 64 pixels.
    9191{{{
    9292idct = TaskModel(
     
    9797                                                 stack_size = 1024,
    9898                                                 sources = [ 'src/idct.c' ],
    99                                                  defines = [ 'WIDTH', 'HEIGHT' ] ),
    100                               SyntheticTask()   ] )
     99                                                 defines = [ 'WIDTH', 'HEIGHT','EXEC_TIME' ] ),
     100                       SyntheticTask()   ] )
     101}}}
     102 * La valeur du paramètre  EXEC_TIME doit être définie au moment où on instancie la tâche {{{idct}}} dans le TCG.
     103{{{
     104Task( 'idct0' , idct ,
     105                portmap = {     'output':idct_libu,
     106                                'input' :iqzz_idct },
     107                defines = {     'XSIZE':'48', 'YSIZE':'48', 'EXEC_TIME':'64'} )
    101108}}}
    102109 * Dans la partie déploiement, il faut déployer la tâche {{{idct}}} comme une tâche matérielle (comme on l'a fait pour les tâches {{{ramdac}}} ou {{{tg}}}.
     
    105112}}}
    106113
    107 Après synthèse, le coprocesseur matériel IDCT (comme beaucoup de coprocesseurs matériels de type ''flot de données'')
     114Le coprocesseur matériel IDCT (comme beaucoup de coprocesseurs matériels de type ''flot de données'')
    108115exécute une boucle infinie dans laquelle il effectue successivement les actions suivantes:
    109116 1. recopie d'un bloc de 64 coefficients du canal MWMR d'entrée vers une mémoire locale BUFIN,
     
    111118 1. recopie de ces 64 pixels de la mémoire locale BUFOUT vers le canal MWMR de sortie.
    112119
    113 [[Image(MjpegCourse:q.gif)]] Q2. Combien de coefficients sont transférés par cycle sur  l'interface FIFO d'entrée? Combien  de pixels sont
    114 transférés par cycle sur l'interface FIFO de sortie? En déduire les durées minimales (en nombre de cycles) pour les étapes 1 et 3 ci-dessus.
    115 
    116120Les temps de communication correspondant aux étapes 1 et 3 sont précisément décrits par le simulateur SystemC,
    117121qui reproduit (cycle par cycle) le comportement des interfaces FIFO entre le threader et le contrôleur MWMR
    118122(y compris en cas de contention pour l'accès à la mémoire).
    119123
    120 En revanche, le nombre de cycles nécessaires pour exécuter l'étape 2 ci-dessus (temps de calcul "interne" à la tâche logicielle)
    121 n'est pas défini par le code de la tâche logicielle. Si on ne précise rien, cela correspond à un temps d'exécution du calcul
    122 en "zéro" cycles. Pour préciser un nombre de cycles d'exécution, il faut modifier le code C de la tâche {{{idct}}}, et insérer,
     124[[Image(MjpegCourse:q.gif)]] Q2. Combien de coefficients sont transférés par cycle sur  l'interface FIFO d'entrée? Combien  de pixels sont
     125transférés par cycle sur l'interface FIFO de sortie? En déduire les durées minimales (en nombre de cycles) pour les étapes 1 et 3 ci-dessus.
     126
     127Le nombre de cycles nécessaires pour exécuter l'étape 2 ci-dessus (temps de calcul pour un bloc de 64 pixels) est
     128défini par la valeur du paramètre EXEC_TIME.  Si on ne précise rien, cela correspond à un temps d'exécution de "zéro" cycles.
     129Pour préciser un nombre de cycles d'exécution, il faut modifier le code C de la tâche {{{idct}}}, et insérer,
    123130entre les deux primitives ''srl_mwmr_read()'' et ''srl_mwmr_write()'',
    124 un appel à la  la fonction bloquante ''srl_busy_cycles(ncycles)''. L'argument ''ncycles'' est le nombre de cycles d'attente entre les
    125 deux primitives de communication, et il modélise donc le temps de calcul (voir SrlApi).
    126 {{{
     131un appel à la  la fonction bloquante ''srl_busy_cycles()''. {{{
    127132srl_mwmr_read();
    128133...
    129 srl_busy_cycles( n );
     134srl_busy_cycles( EXEC_TIME );
    130135...
    131136srl_mwmr_write();
    132137}}}
     138L'argument EXEC_TIME définit le nombre de cycles d'attente entre les
     139deux primitives de communication, et modélise donc le temps de calcul (voir SrlApi).
    133140
    134141[[Image(MjpegCourse:q.gif)]] Q3. pour quelle raison peut-on affirmer sans aucune expérimentation (c'est à dire sans aucune simulation),