Dans un système typique de traitement du signal, un flux de données traverse une chaîne de fonctions qui consomment des échantillons d’entrée et produisent des échantillons de sortie de manière synchronisée. Par exemple, dans la structure du vocodeur que nous devons développer, le contrôleur d’entrée audio et les oscillateurs sont des producteurs, le contrôleur de sortie audio est un consommateur, et les autres fonctions jouent les deux rôles à la fois.
Lorsque ces fonctions sont réalisées en matériel, il faut prévoir des signaux de contrôle pour que chaque composant sache à quel moment il doit travailler. Il faut également tenir compte du fait que le temps d’exécution d’un pas de calcul peut être différent selon les composants. On peut envisager deux stratégies de synchronisation :
Dans ce projet, nous allons choisir la seconde stratégie.
Dans ce document, nous choisissons d’utiliser les termes « producteur » et « consommateur », mais selon les auteurs, les mêmes concepts pourront être désignés sous d’autres noms, en français comme en anglais :
Producteur (producer) | Consommateur (consumer) |
---|---|
Émetteur (transmitter, sender) | Récepteur (receiver) |
Source (source) | Destination (destination, sink) |
Maître (master) | Esclave (slave) |
Il s’agit d’une technique de synchronisation très répandue qui repose sur le
principe de la poignée de mains (handshake).
Pour qu’un échange de données entre un producteur et un consommateur s’accomplisse,
il faut que le producteur ait une donnée disponible et que le consommateur soit
prêt à la recevoir.
Ces deux conditions sont représentées par les signaux valid
et ready
.
Le protocole proposé ici s’inspire de l’interface AXI (Advanced eXtensible Interface) spécifiée par ARM et très utilisée dans le développement de SoC.
À chaque instant, la liaison entre producteur et consommateur peut se trouver dans l’un des états suivants :
valid |
ready |
Signification |
---|---|---|
0 | 0 | Le producteur et le consommateur sont occupés ou inactifs. |
1 | 0 | Le producteur présente une nouvelle donnée. Il attend que le consommateur l’accepte. |
0 | 1 | Le consommateur est prêt à recevoir une nouvelle donnée. Il attend que le producteur la fournisse. |
1 | 1 | Handshake, le producteur présente une nouvelle donnée et le consommateur l’accepte. |
Le chronogramme ci-dessous illustre plusieurs exemples d’échanges de données respectant ce protocole.
Le producteur et le consommateur échantillonnent les signaux ready
et valid
sur les fronts d’un même signal d’horloge.
Si le producteur laisse valid
à 1 après le handshake, cela signifie qu’il
a encore une nouvelle donnée disponible (exemples 4 et 6).
Selon les situations, le consommateur peut se déclarer prêt à recevoir une nouvelle
donnée avant (exemples 2 et 5), après (exemples 1 et 4), ou pendant (exemples 3 et 6)
le cycle d’horloge où valid
devient actif.
Dans la spécification de l’interface AXI, le producteur est tenu de respecter les deux règles suivantes :
valid
à 1 dès que possible sans attendre que le consommateur soit prêt.
Si cette règle n’était pas respectée, on risquerait d’avoir des producteurs et des consommateurs
qui s’attendent mutuellement indéfiniment.valid
vaut 1, le producteur n’a pas le droit de le remettre à 0 avant le handshake.Considérons un circuit composé de quatre composants connectés en cascade comme sur le schéma ci-dessous :
Supposons que le comportement de chaque composant est géré par une machine à états comportant les états suivants :
R
(pour les consommateurs) : le composant met sa sortie ready
à 1 et
attend une nouvelle donnée.B
: le composant est occupé (busy). Il reste dans cet état pendant quelques
périodes d’horloge selon la quantité de travail qu’il doit effectuer.
Ses sorties ready
et valid
sont à 0.V
(pour les producteurs) : le composant produit une nouvelle donnée.
Il met sa sortie valid
à 1 et attend que le consommateur soit prêt.Voici une traduction sous forme de graphes d’états du comportement des trois
types de composants. Au démarrage, les consommateurs sont tous dans l’état
R
, prêts à recevoir une nouvelle donnée.
Observons à présent un exemple de scénario de fonctionnement avec quatre composants :
Après un temps de démarrage représenté en jaune, le système se met à travailler à un rythme régulier. Les couleurs mettent en évidence un fonctionnement qui évoque le travail à la chaîne: les quatre composants peuvent se trouver simultanément dans leur état Busy, chacun occupé à faire un calcul dont il passe le résultat au consommateur suivant. Dans le domaine des circuits numérique, on dit que les quatre composants forment un pipeline.
Pour augmenter encore le débit dans ce pipeline, les composants qui sont à la
fois producteurs et consommateurs peuvent gagner un peu de temps en passant
directement de l’état V
à l’état B
et en activant leur sortie ready
au plus tôt.
Dans ce scénario de fonctionnement idéal, les composants 2 et 3 sont dans leur
état R
au démarrage et n’y reviennent plus ensuite :
Cette solution peut cependant poser des problèmes car les signaux ready
forment
alors une chaîne combinatoire qui va du dernier consommateur au premier producteur.
Si cette chaîne devient trop longue, cela peut poser des problèmes de timing.